ats-pkg-2.9.0.2: src/Distribution/ATS/Build.hs
-- | Integration with @Cabal@.
module Distribution.ATS.Build ( cabalHooks
, atsPolyglotBuild
) where
-- TODO use confHook to set extra-libraries and extra-lib-dirs ourselves?
import Distribution.PackageDescription
import Distribution.Simple
import Distribution.Simple.LocalBuildInfo
import Language.ATS.Package.Build
import Quaalude
-- | Use this in place of 'defaultMain' for a simple build. It may be necessary
-- to use this in place of 'defaultMain' in any downstream packages as well.
atsPolyglotBuild :: IO ()
atsPolyglotBuild = defaultMainWithHooks cabalHooks
configureCabal :: IO LocalBuildInfo -> IO LocalBuildInfo
configureCabal = (<*>) $ do
flip when (build ["install"]) =<< doesFileExist "atspkg.dhall"
libDir <- (<> "/.atspkg/lib/") <$> getEnv "HOME"
pure (modifyConf libDir)
modifyBuildInfo :: String -> BuildInfo -> BuildInfo
modifyBuildInfo libDir bi = let olds = extraLibDirs bi
in bi { extraLibDirs = libDir : olds }
modifyConf :: FilePath -- ^ New library directory (absolute)
-> LocalBuildInfo
-> LocalBuildInfo
modifyConf libDir bi = let old = localPkgDescr bi
in bi { localPkgDescr = modifyPkgDescr libDir old }
modifyPkgDescr :: String -> PackageDescription -> PackageDescription
modifyPkgDescr libDir pd = let old = library pd
in pd { library = fmap (modifyLibrary libDir) old }
modifyLibrary :: String -> Library -> Library
modifyLibrary libDir lib = let old = libBuildInfo lib
in lib { libBuildInfo = modifyBuildInfo libDir old }
-- | This uses the users hooks as is @simpleUserHooks@, modified to build the
-- ATS library.
cabalHooks :: UserHooks
cabalHooks = let defConf = confHook simpleUserHooks
in simpleUserHooks { confHook = configureCabal .* defConf }