diff options
Diffstat (limited to 'hadrian/src/Settings/Default.hs')
-rw-r--r-- | hadrian/src/Settings/Default.hs | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/hadrian/src/Settings/Default.hs b/hadrian/src/Settings/Default.hs new file mode 100644 index 0000000000..031bd45ace --- /dev/null +++ b/hadrian/src/Settings/Default.hs @@ -0,0 +1,274 @@ +module Settings.Default ( + -- * Packages that are build by default and for the testsuite + defaultPackages, testsuitePackages, + + -- * Default build ways + defaultLibraryWays, defaultRtsWays, + + -- * Default command line arguments for various builders + SourceArgs (..), sourceArgs, defaultBuilderArgs, defaultPackageArgs, + defaultArgs, + + -- * Default build flavour + defaultFlavour, defaultSplitObjects + ) where + +import qualified Hadrian.Builder.Ar +import qualified Hadrian.Builder.Sphinx +import qualified Hadrian.Builder.Tar +import Hadrian.Haskell.Cabal.Type + +import CommandLine +import Expression +import Flavour +import Oracles.Flag +import Oracles.Setting +import Packages +import Settings +import Settings.Builders.Alex +import Settings.Builders.DeriveConstants +import Settings.Builders.Cabal +import Settings.Builders.Cc +import Settings.Builders.Configure +import Settings.Builders.GenPrimopCode +import Settings.Builders.Ghc +import Settings.Builders.GhcPkg +import Settings.Builders.Haddock +import Settings.Builders.Happy +import Settings.Builders.Hsc2Hs +import Settings.Builders.HsCpp +import Settings.Builders.Ld +import Settings.Builders.Make +import Settings.Builders.RunTest +import Settings.Builders.Xelatex +import Settings.Packages +import Settings.Warnings + +-- | Packages that are built by default. You can change this in "UserSettings". +defaultPackages :: Stage -> Action [Package] +defaultPackages Stage0 = stage0Packages +defaultPackages Stage1 = stage1Packages +defaultPackages Stage2 = stage2Packages +defaultPackages Stage3 = return [] + +-- | Packages built in 'Stage0' by default. You can change this in "UserSettings". +stage0Packages :: Action [Package] +stage0Packages = do + win <- windowsHost + cross <- flag CrossCompiling + return $ [ binary + , cabal + , compareSizes + , compiler + , deriveConstants + , genapply + , genprimopcode + , ghc + , ghcBoot + , ghcBootTh + , ghcHeap + , ghci + , ghcPkg + , hsc2hs + , hpc + , mtl + , parsec + , templateHaskell + , text + , transformers + , unlit ] + ++ [ terminfo | not win, not cross ] + ++ [ touchy | win ] + +-- | Packages built in 'Stage1' by default. You can change this in "UserSettings". +stage1Packages :: Action [Package] +stage1Packages = do + win <- windowsHost + intLib <- integerLibrary =<< flavour + libraries0 <- filter isLibrary <$> stage0Packages + cross <- flag CrossCompiling + return $ libraries0 -- Build all Stage0 libraries in Stage1 + ++ [ array + , base + , bytestring + , containers + , deepseq + , directory + , filepath + , ghc + , ghcCompact + , ghcPkg + , ghcPrim + , haskeline + , hsc2hs + , intLib + , pretty + , process + , rts + , stm + , time + , unlit + , xhtml ] + ++ [ hpcBin | not cross ] + ++ [ iserv | not win, not cross ] + ++ [ libiserv | not win, not cross ] + ++ [ runGhc | not cross ] + ++ [ touchy | win ] + ++ [ unix | not win ] + ++ [ win32 | win ] + +-- | Packages built in 'Stage2' by default. You can change this in "UserSettings". +stage2Packages :: Action [Package] +stage2Packages = do + cross <- flag CrossCompiling + return $ [ ghcTags ] + ++ [ haddock | not cross ] + +-- | Packages that are built only for the testsuite. +testsuitePackages :: Action [Package] +testsuitePackages = do + win <- windowsHost + return $ [ checkApiAnnotations + , checkPpr + , ghci + , ghcCompact + , ghcPkg + , hp2ps + , hsc2hs + , iserv + , parallel + , runGhc + , unlit ] ++ + [ timeout | win ] + +-- | Default build ways for library packages: +-- * We always build 'vanilla' way. +-- * We build 'profiling' way when stage > Stage0. +-- * We build 'dynamic' way when stage > Stage0 and the platform supports it. +defaultLibraryWays :: Ways +defaultLibraryWays = mconcat + [ pure [vanilla] + , notStage0 ? pure [profiling] + , notStage0 ? platformSupportsSharedLibs ? pure [dynamic] + ] + +-- | Default build ways for the RTS. +defaultRtsWays :: Ways +defaultRtsWays = mconcat + [ pure [vanilla, threaded] + , notStage0 ? pure + [ profiling, threadedProfiling, debugProfiling, threadedDebugProfiling + , logging, threadedLogging + , debug, threadedDebug + ] + , notStage0 ? platformSupportsSharedLibs ? pure + [ dynamic, threadedDynamic, debugDynamic, loggingDynamic + , threadedDebugDynamic, threadedLoggingDynamic + ] + ] + +-- TODO: Move C source arguments here +-- | Default and package-specific source arguments. +data SourceArgs = SourceArgs + { hsDefault :: Args + , hsLibrary :: Args + , hsCompiler :: Args + , hsGhc :: Args } + +-- | Concatenate source arguments in appropriate order. +sourceArgs :: SourceArgs -> Args +sourceArgs SourceArgs {..} = builder Ghc ? mconcat + [ hsDefault + , getContextData hcOpts + , libraryPackage ? hsLibrary + , package compiler ? hsCompiler + , package ghc ? hsGhc ] + +-- | All default command line arguments. +defaultArgs :: Args +defaultArgs = mconcat + [ defaultBuilderArgs + , sourceArgs defaultSourceArgs + , defaultPackageArgs ] + +-- | Default source arguments, e.g. optimisation settings. +defaultSourceArgs :: SourceArgs +defaultSourceArgs = SourceArgs + { hsDefault = mconcat [ stage0 ? arg "-O" + , notStage0 ? arg "-O2" + , arg "-H32m" ] + , hsLibrary = mempty + , hsCompiler = mempty + , hsGhc = mempty } + +-- Please update doc/flavours.md when changing the default build flavour. +-- | Default build flavour. Other build flavours are defined in modules +-- @Settings.Flavours.*@. Users can add new build flavours in "UserSettings". +defaultFlavour :: Flavour +defaultFlavour = Flavour + { name = "default" + , args = defaultArgs + , packages = defaultPackages + , integerLibrary = (\x -> if x then integerSimple else integerGmp) <$> cmdIntegerSimple + , libraryWays = defaultLibraryWays + , rtsWays = defaultRtsWays + , splitObjects = defaultSplitObjects + , dynamicGhcPrograms = defaultDynamicGhcPrograms + , ghciWithDebugger = False + , ghcProfiled = False + , ghcDebugged = False } + +-- | Default logic for determining whether to build +-- dynamic GHC programs. +-- +-- It corresponds to the DYNAMIC_GHC_PROGRAMS logic implemented +-- in @mk/config.mk.in@. +defaultDynamicGhcPrograms :: Action Bool +defaultDynamicGhcPrograms = do + win <- windowsHost + supportsShared <- platformSupportsSharedLibs + return (not win && supportsShared) + +-- | Default condition for building split objects. +defaultSplitObjects :: Predicate +defaultSplitObjects = do + goodStage <- notStage0 -- We don't split bootstrap (stage 0) packages + pkg <- getPackage + supported <- expr supportsSplitObjects + split <- expr cmdSplitObjects + let goodPackage = isLibrary pkg && pkg /= compiler && pkg /= rts + return $ split && goodStage && goodPackage && supported + +-- | All 'Builder'-dependent command line arguments. +defaultBuilderArgs :: Args +defaultBuilderArgs = mconcat + -- GHC-specific builders: + [ alexBuilderArgs + , cabalBuilderArgs + , ccBuilderArgs + , configureBuilderArgs + , deriveConstantsBuilderArgs + , genPrimopCodeBuilderArgs + , ghcBuilderArgs + , ghcPkgBuilderArgs + , haddockBuilderArgs + , happyBuilderArgs + , hsc2hsBuilderArgs + , hsCppBuilderArgs + , ldBuilderArgs + , makeBuilderArgs + , runTestBuilderArgs + , validateBuilderArgs + , xelatexBuilderArgs + -- Generic builders from the Hadrian library: + , builder (Ar Pack ) ? Hadrian.Builder.Ar.args Pack + , builder (Ar Unpack ) ? Hadrian.Builder.Ar.args Unpack + , builder (Sphinx Html ) ? Hadrian.Builder.Sphinx.args Html + , builder (Sphinx Latex) ? Hadrian.Builder.Sphinx.args Latex + , builder (Sphinx Man ) ? Hadrian.Builder.Sphinx.args Man + , builder (Tar Create ) ? Hadrian.Builder.Tar.args Create + , builder (Tar Extract ) ? Hadrian.Builder.Tar.args Extract ] + +-- | All 'Package'-dependent command line arguments. +defaultPackageArgs :: Args +defaultPackageArgs = mconcat [ packageArgs, warningArgs ] |