/Setup.hs
http://github.com/hdbc/hdbc-postgresql · Haskell · 69 lines · 49 code · 15 blank · 5 comment · 0 complexity · 1d9fb93bbfd0cf7523a6a511ff85fbc1 MD5 · raw file
- #!/usr/bin/env runhaskell
- {-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}
- import Distribution.Simple
- import Distribution.PackageDescription
- import Distribution.Version
- import Distribution.Simple.LocalBuildInfo
- import Distribution.Simple.Program
- import Distribution.Verbosity
- import Data.Char (isSpace)
- import Data.List (dropWhile,reverse)
- import Data.String (fromString)
- import Control.Monad
- main = defaultMainWithHooks simpleUserHooks {
- hookedPrograms = [pgconfigProgram],
- confHook = \pkg flags -> do
- lbi <- confHook simpleUserHooks pkg flags
- bi <- psqlBuildInfo lbi
-
- return lbi {
- localPkgDescr = updatePackageDescription
- (Just bi, [(fromString "runtests", bi)]) (localPkgDescr lbi)
- }
- }
- -- 'ConstOrId' is a @Cabal-1.16@ vs @Cabal-1.18@ compatibility hack,
- -- 'programFindLocation' has a new (unused in this case)
- -- parameter. 'ConstOrId' adds this parameter when types say it is
- -- mandatory.
- class FindProgramLocation a b where
- constOrId :: a -> b
- instance FindProgramLocation (IO (Maybe FilePath)) (IO (Maybe FilePath)) where
- constOrId = id
- instance FindProgramLocation (IO (Maybe FilePath)) (ProgramSearchPath -> IO (Maybe FilePath)) where
- constOrId = const
- instance FindProgramLocation (IO (Maybe FilePath)) (ProgramSearchPath -> IO (Maybe (FilePath, [FilePath]))) where
- constOrId x = liftM (fmap (\x -> (x, []))) . const x
- pgconfigProgram = (simpleProgram "pgconfig or pg_config") {
- programFindLocation = \verbosity searchPath -> do
- pgconfig <- findProgramOnSearchPath verbosity searchPath "pgconfig"
- pg_config <- findProgramOnSearchPath verbosity searchPath "pg_config"
- return (pgconfig `mplus` pg_config)
- }
- psqlBuildInfo :: LocalBuildInfo -> IO BuildInfo
- psqlBuildInfo lbi = do
- (pgconfigProg, _) <- requireProgram verbosity
- pgconfigProgram (withPrograms lbi)
- let pgconfig = getProgramOutput verbosity pgconfigProg
- incDir <- pgconfig ["--includedir"]
- libDir <- pgconfig ["--libdir"]
- return emptyBuildInfo {
- extraLibDirs = [strip libDir],
- includeDirs = [strip incDir]
- }
- where
- verbosity = normal -- honestly, this is a hack
- strip x = dropWhile isSpace $ reverse $ dropWhile isSpace $ reverse x