module Base ( -- * General utilities module Control.Applicative, module Control.Monad.Extra, module Data.List.Extra, module Data.Maybe, module Data.Semigroup, module Hadrian.Utilities, -- * Shake module Development.Shake, module Development.Shake.Classes, module Development.Shake.FilePath, module Development.Shake.Util, -- * Basic data types module Hadrian.Package, module Stage, module Way, -- * Files configH, ghcVersionH, -- * Paths hadrianPath, configPath, configFile, sourcePath, shakeFilesDir, stageBinPath, stageLibPath, templateHscPath, ghcBinDeps, ghcLibDeps, includesDependencies, haddockDeps, relativePackageDbPath, packageDbPath, packageDbStamp, mingwStamp, ) where import Control.Applicative import Control.Monad.Extra import Control.Monad.Reader import Data.List.Extra import Data.Maybe import Data.Semigroup import Development.Shake hiding (unit, (*>), Normal) import Development.Shake.Classes import Development.Shake.FilePath import Development.Shake.Util import Hadrian.Oracles.DirectoryContents import Hadrian.Utilities import Hadrian.Package import Stage import Way -- | Hadrian lives in the 'hadrianPath' directory of the GHC tree. hadrianPath :: FilePath hadrianPath = "hadrian" -- TODO: Move this to build directory? -- | Path to system configuration files, such as 'configFile'. configPath :: FilePath configPath = hadrianPath -/- "cfg" -- | Path to the system configuration file generated by the @configure@ script. configFile :: FilePath configFile = configPath -/- "system.config" -- | Path to source files of the build system, e.g. this file is located at -- @sourcePath -/- "Base.hs"@. We use this to track some of the source files. sourcePath :: FilePath sourcePath = hadrianPath -/- "src" -- TODO: Change @mk/config.h@ to @shake-build/cfg/config.h@. -- | Path to the generated @mk/config.h@ file. configH :: FilePath configH = "mk/config.h" ghcVersionH :: Stage -> Action FilePath ghcVersionH stage = stageLibPath stage <&> (-/- "ghcversion.h") -- | The directory in 'buildRoot' containing the Shake database and other -- auxiliary files generated by Hadrian. shakeFilesDir :: FilePath shakeFilesDir = "hadrian" -- | Path to the package database for a given build stage, relative to the build -- root. relativePackageDbPath :: Stage -> FilePath relativePackageDbPath stage = stageString stage -/- "lib/package.conf.d" -- | Path to the package database used in a given 'Stage', including -- the build root. packageDbPath :: Stage -> Action FilePath packageDbPath stage = buildRoot <&> (-/- relativePackageDbPath stage) -- | We use a stamp file to track the existence of a package database. packageDbStamp :: FilePath packageDbStamp = ".stamp" -- | @bin@ directory for the given 'Stage' (including the build root) stageBinPath :: Stage -> Action FilePath stageBinPath stage = buildRoot <&> (-/- stageString stage -/- "bin") -- | @lib@ directory for the given 'Stage' (including the build root) stageLibPath :: Stage -> Action FilePath stageLibPath stage = buildRoot <&> (-/- stageString stage -/- "lib") -- | Files the GHC library depends on ghcLibDeps :: Stage -> Action [FilePath] ghcLibDeps stage = mapM (\f -> stageLibPath stage <&> (-/- f)) [ "llvm-targets" , "llvm-passes" , "platformConstants" , "settings" ] -- | Files the GHC binary depends on. ghcBinDeps :: Stage -> Action [FilePath] ghcBinDeps stage = mapM (\f -> stageLibPath stage <&> (-/- f)) [ "ghc-usage.txt" , "ghci-usage.txt" ] includesDependencies :: Stage -> Action [FilePath] includesDependencies stage = do p <- stageLibPath stage pure $ (p -/-) <$> [ "ghcautoconf.h", "ghcplatform.h", "ghcversion.h" ] -- | Files the `haddock` binary depends on haddockDeps :: Stage -> Action [FilePath] haddockDeps stage = do let resdir = "utils/haddock/haddock-api/resources" latexResources <- directoryContents matchAll (resdir -/- "latex") htmlResources <- directoryContents matchAll (resdir -/- "html") haddockLib <- stageLibPath stage return $ [ haddockLib -/- makeRelative resdir f | f <- latexResources ++ htmlResources ] -- ref: utils/hsc2hs/ghc.mk -- | Path to 'hsc2hs' template. templateHscPath :: Stage -> Action FilePath templateHscPath stage = stageLibPath stage <&> (-/- "template-hsc.h") -- | We use this stamp file to track whether we've moved the mingw toolchain -- under the build root (to make it accessible to the GHCs we build on -- Windows). See "Rules.Program". mingwStamp :: FilePath mingwStamp = "mingw" -/- ".stamp"