packages feed

postgresql-syntax-0.1: Setup.hs

import Data.Maybe
import Data.Monoid
import System.Directory
import Distribution.Simple
import Distribution.Simple.Setup
import Distribution.Simple.Utils (rawSystemExit)
import Distribution.PackageDescription
import Distribution.Verbosity
import Distribution.Simple.LocalBuildInfo (LocalBuildInfo(..), InstallDirs(..), absoluteInstallDirs)

main =
  defaultMainWithHooks hooks
  where
    hooks =
      simpleUserHooks {
        confHook = theConfHook
      }

theConfHook :: (GenericPackageDescription, HookedBuildInfo) -> ConfigFlags -> IO LocalBuildInfo
theConfHook (description, buildInfo) flags = do
  localBuildInfo <- confHook simpleUserHooks (description, buildInfo) flags
  make (fromFlag (configVerbosity flags))
  updateLocalBuildInfo localBuildInfo

make :: Verbosity -> IO ()
make verbosity =
  do
    rawSystemExit verbosity "mkdir" ["-p", "dist/build"]
    rawSystemExit verbosity "cp" ["-a", "foreign/libpg_query", "dist/build/libpg_query"]
    rawSystemExit verbosity "env" ["CFLAGS=-D_LIB", "make", "--directory=dist/build/libpg_query", "libpg_query.a"]

updateLocalBuildInfo :: LocalBuildInfo -> IO LocalBuildInfo
updateLocalBuildInfo =
  def
  where
    def x =
      do
        path <- getCurrentDirectory
        return (addExtraLibDir (path <> "/dist/build/libpg_query") x)
      where
    updatePackageDescription fn localBuildInfo =
      localBuildInfo { localPkgDescr = fn (localPkgDescr localBuildInfo) }
    updateLibrary fn =
      updatePackageDescription (\x -> x { library = fmap fn (library x) })
    updateLibBuildInfo fn =
      updateLibrary (\x -> x { libBuildInfo = fn (libBuildInfo x) })
    updateExtraLibDirs fn =
      updateLibBuildInfo (\x -> x { extraLibDirs = fn (extraLibDirs x) })
    addExtraLibDir path =
      updateExtraLibDirs (\x -> path : x)