import Distribution.Simple
import Distribution.Simple.Configure (configure)
import Distribution.Simple.PackageIndex (allPackages)
import Distribution.Types.BuildInfo (BuildInfo (includeDirs))
import qualified Distribution.Types.InstalledPackageInfo as InstalledPackageInfo (includeDirs)
import Distribution.Types.Library (Library (libBuildInfo))
import Distribution.Types.LocalBuildInfo (LocalBuildInfo (installedPkgs, localPkgDescr))
import Distribution.Types.PackageDescription (PackageDescription (library))
{-
We want to access "ghcconfig.h" from assembly source file (.S),
but GHC does not pass the include directory to the assembler.
So we need to set include-dirs to include the path to "ghcconfig.h"
-}
main = defaultMainWithHooks simpleUserHooks { confHook = myConfHook }
where
-- myConfHook :: (GenericPackageDescription, HookedBuildInfo) -> ConfigFlags -> IO LocalBuildInfo
myConfHook a cf = do
localBuildInfo <- configure a cf
let extraIncludeDirs :: [String]
extraIncludeDirs = concatMap InstalledPackageInfo.includeDirs (allPackages $ installedPkgs localBuildInfo)
updateBuildInfo :: BuildInfo -> BuildInfo
updateBuildInfo bi = bi { includeDirs = includeDirs bi ++ extraIncludeDirs }
updateLibrary :: Library -> Library
updateLibrary lib = lib { libBuildInfo = updateBuildInfo (libBuildInfo lib) }
updatePkgDescr :: PackageDescription -> PackageDescription
updatePkgDescr pd = pd { library = updateLibrary <$> library pd }
return localBuildInfo { localPkgDescr = updatePkgDescr (localPkgDescr localBuildInfo) }