/Setup.hs

http://github.com/hdbc/hdbc-postgresql · Haskell · 69 lines · 49 code · 15 blank · 5 comment · 0 complexity · 1d9fb93bbfd0cf7523a6a511ff85fbc1 MD5 · raw file

  1. #!/usr/bin/env runhaskell
  2. {-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}
  3. import Distribution.Simple
  4. import Distribution.PackageDescription
  5. import Distribution.Version
  6. import Distribution.Simple.LocalBuildInfo
  7. import Distribution.Simple.Program
  8. import Distribution.Verbosity
  9. import Data.Char (isSpace)
  10. import Data.List (dropWhile,reverse)
  11. import Data.String (fromString)
  12. import Control.Monad
  13. main = defaultMainWithHooks simpleUserHooks {
  14. hookedPrograms = [pgconfigProgram],
  15. confHook = \pkg flags -> do
  16. lbi <- confHook simpleUserHooks pkg flags
  17. bi <- psqlBuildInfo lbi
  18. return lbi {
  19. localPkgDescr = updatePackageDescription
  20. (Just bi, [(fromString "runtests", bi)]) (localPkgDescr lbi)
  21. }
  22. }
  23. -- 'ConstOrId' is a @Cabal-1.16@ vs @Cabal-1.18@ compatibility hack,
  24. -- 'programFindLocation' has a new (unused in this case)
  25. -- parameter. 'ConstOrId' adds this parameter when types say it is
  26. -- mandatory.
  27. class FindProgramLocation a b where
  28. constOrId :: a -> b
  29. instance FindProgramLocation (IO (Maybe FilePath)) (IO (Maybe FilePath)) where
  30. constOrId = id
  31. instance FindProgramLocation (IO (Maybe FilePath)) (ProgramSearchPath -> IO (Maybe FilePath)) where
  32. constOrId = const
  33. instance FindProgramLocation (IO (Maybe FilePath)) (ProgramSearchPath -> IO (Maybe (FilePath, [FilePath]))) where
  34. constOrId x = liftM (fmap (\x -> (x, []))) . const x
  35. pgconfigProgram = (simpleProgram "pgconfig or pg_config") {
  36. programFindLocation = \verbosity searchPath -> do
  37. pgconfig <- findProgramOnSearchPath verbosity searchPath "pgconfig"
  38. pg_config <- findProgramOnSearchPath verbosity searchPath "pg_config"
  39. return (pgconfig `mplus` pg_config)
  40. }
  41. psqlBuildInfo :: LocalBuildInfo -> IO BuildInfo
  42. psqlBuildInfo lbi = do
  43. (pgconfigProg, _) <- requireProgram verbosity
  44. pgconfigProgram (withPrograms lbi)
  45. let pgconfig = getProgramOutput verbosity pgconfigProg
  46. incDir <- pgconfig ["--includedir"]
  47. libDir <- pgconfig ["--libdir"]
  48. return emptyBuildInfo {
  49. extraLibDirs = [strip libDir],
  50. includeDirs = [strip incDir]
  51. }
  52. where
  53. verbosity = normal -- honestly, this is a hack
  54. strip x = dropWhile isSpace $ reverse $ dropWhile isSpace $ reverse x