packages feed

hgeos-0.1.5.1: Setup.hs

{-|
Module      : Main
Description : Setup script for hgeos build
Copyright   : (C) Richard Cook, 2016
Licence     : MIT
Maintainer  : rcook@rcook.org
Stability   : experimental
Portability : portable
-}

{-# LANGUAGE CPP #-}

module Main (main) where

#ifdef mingw32_HOST_OS

import Data.List
import Distribution.PackageDescription
import Distribution.Simple
import Distribution.Simple.LocalBuildInfo
import Distribution.Simple.Setup
import System.Directory
import System.FilePath

testPrefix :: String
testPrefix = "test:"

dllName :: String
dllName = "geos_c.dll"

main :: IO ()
main = defaultMainWithHooks hgeosHooks

hgeosHooks :: UserHooks
hgeosHooks = simpleUserHooks
    { confHook = hgeosConfHook
    , postBuild = hgeosPostBuild
    }

hgeosConfHook :: (GenericPackageDescription, HookedBuildInfo) -> ConfigFlags -> IO LocalBuildInfo
hgeosConfHook (description, buildInfo) flags = do
    localBuildInfo <- confHook simpleUserHooks (description, buildInfo) flags
    let packageDescription = localPkgDescr localBuildInfo
        Just packageLibrary = library packageDescription
        libraryBuildInfo = libBuildInfo packageLibrary

    dir <- getCurrentDirectory
    let externalDir = dir </> "external"
        geosPackageDir = externalDir </> "geos"
        geosIncludeDir = geosPackageDir </> "include"
        geosLibDir = geosPackageDir </> "lib"

    return localBuildInfo {
        localPkgDescr = packageDescription {
            library = Just $ packageLibrary {
                libBuildInfo = libraryBuildInfo {
                    includeDirs = geosIncludeDir : includeDirs libraryBuildInfo,
                    extraLibDirs = geosLibDir : extraLibDirs libraryBuildInfo
                }
            }
        }
    }

hgeosPostBuild :: Args -> BuildFlags -> PackageDescription -> LocalBuildInfo -> IO ()
hgeosPostBuild args buildFlags _ _ = do
    case find (testPrefix `isPrefixOf`) args of
         Nothing -> return ()
         Just testArg -> do
                dir <- getCurrentDirectory
                let testName = drop (length testPrefix) testArg
                    distDir = dir </> (fromFlag $ buildDistPref buildFlags)
                    buildDir = distDir </> "build"
                    testDLLPath = buildDir </> testName </> dllName
                    geosDLLPath = dir </> "external" </> "geos" </> "bin" </> dllName
                copyFile geosDLLPath testDLLPath
                return ()

#else

import Distribution.Simple

main :: IO ()
main = defaultMain

#endif