Implement install_docs (#442)
[hadrian.git] / src / Settings.hs
index a219f03..e40f20d 100644 (file)
-{-# LANGUAGE NoImplicitPrelude, FlexibleInstances #-}
-
 module Settings (
-    -- IntegerLibrary (..), integerLibrary, integerLibraryName,
-    buildHaddock
+    getArgs, getLibraryWays, getRtsWays, flavour, knownPackages,
+    findPackageByName, getPkgData, getPkgDataList, isLibrary, stagePackages,
+    programContext, integerLibraryName, getDestDir
     ) where
 
-import Base hiding (arg, args, Args)
-import Targets
-import Ways
-import Oracles.Builder
-import Expression.Base
-
-whenPackageKey :: BuildPredicate
-whenPackageKey = supportsPackageKey && notStage Stage0
-
-packageSettings :: Settings
-packageSettings = mconcat
-    [ args ["-hide-all-packages", "-no-user-package-db", "-include-pkg-deps"]
-    , stage Stage0 ? args ["-package-db libraries/bootstrapping.conf"]
-    , whenPackageKey ??
-      ( argPackageKey "-this-package-key" <> argPackageDepKeys "-package-key"
-      , argPackageKey "-package-name"     <> argPackageDeps    "-package"    )]
+import CommandLine
+import Expression
+import Flavour
+import {-# SOURCE #-} Settings.Default
+import Settings.Flavours.Development
+import Settings.Flavours.Performance
+import Settings.Flavours.Profiled
+import Settings.Flavours.Quick
+import Settings.Flavours.Quickest
+import Settings.Flavours.QuickCross
+import UserSettings
 
-librarySettings :: Ways -> Settings
-librarySettings ways = mconcat
-    [ whenExists vanilla ways     ?? ( arg  "--enable-library-vanilla"
-                                     , arg "--disable-library-vanilla" )
-    , (ghcWithInterpreter
-      && not dynamicGhcPrograms
-      && whenExists vanilla ways) ?? ( arg  "--enable-library-for-ghci"
-                                     , arg "--disable-library-for-ghci" )
-    , whenExists profiling ways   ?? ( arg  "--enable-library-profiling"
-                                     , arg "--disable-library-profiling" )
-    , whenExists dynamic ways     ?? ( arg  "--enable-shared"
-                                     , arg "--disable-shared" )]
+getArgs :: Args
+getArgs = expr flavour >>= args
 
-validating :: BuildPredicate
-validating = false
+getLibraryWays :: Ways
+getLibraryWays = expr flavour >>= libraryWays
 
-ccSettings :: Settings
-ccSettings = mconcat
-    [ package integerLibrary ? arg "-Ilibraries/integer-gmp2/gmp"
-    , builder GhcCabal ? argConfigStaged "conf-cc-args"
-    , validating ? mconcat
-        [ not (builder GhcCabal) ? arg "-Werror"
-        , arg "-Wall"
-        , gccIsClang ??
-          ( arg "-Wno-unknown-pragmas" <>
-            not gccLt46 && windowsHost ? arg "-Werror=unused-but-set-variable"
-          , not gccLt46 ? arg "-Wno-error=inline" )
-        ]
-    ]
+getRtsWays :: Ways
+getRtsWays = expr flavour >>= rtsWays
 
-ldSettings :: Settings
-ldSettings = builder GhcCabal ? argConfigStaged "conf-gcc-linker-args"
+stagePackages :: Stage -> Action [Package]
+stagePackages stage = do
+    f <- flavour
+    packages f stage
 
-cppSettings :: Settings
-cppSettings = builder GhcCabal ? argConfigStaged "conf-cpp-args"
+hadrianFlavours :: [Flavour]
+hadrianFlavours =
+    [ defaultFlavour, developmentFlavour Stage1, developmentFlavour Stage2
+    , performanceFlavour, profiledFlavour, quickFlavour, quickestFlavour
+    , quickCrossFlavour ]
 
-configureSettings :: Settings
-configureSettings =
-    let conf key = argComplex $ "--configure-option=" ++ key ++ "="
-    in
-    mconcat [ conf "CFLAGS"   ccSettings
-            , conf "LDFLAGS"  ldSettings
-            , conf "CPPFLAGS" cppSettings
-            , argComplex "--gcc-options="   (ccSettings <> ldSettings)
-            , conf "--with-iconv-includes"  (argConfig "iconv-include-dirs")
-            , conf "--with-iconv-libraries" (argConfig "iconv-lib-dirs")
-            , conf "--with-gmp-includes"    (argConfig "gmp-include-dirs")
-            , conf "--with-gmp-libraries"   (argConfig "gmp-lib-dirs")
-            -- TODO: why TargetPlatformFull and not host?
-            , crossCompiling ?
-              conf "--host"    (argConfig "target-platform-full")
-            , conf "--with-cc" (argStagedBuilderPath Gcc) ]
+flavour :: Action Flavour
+flavour = do
+    flavourName <- fromMaybe "default" <$> cmdFlavour
+    let unknownFlavour = error $ "Unknown build flavour: " ++ flavourName
+        flavours       = hadrianFlavours ++ userFlavours
+    return $ fromMaybe unknownFlavour $ find ((== flavourName) . name) flavours
 
--- this is a positional argument, hence:
--- * if it is empty, we need to emit one empty string argument
--- * otherwise, we must collapse it into one space-separated string
-dllSettings :: Settings
-dllSettings = arg ""
+integerLibraryName :: Action String
+integerLibraryName = pkgName <$> (integerLibrary =<< flavour)
 
--- customConfArgs
-customConfigureSettings :: Settings
-customConfigureSettings = mconcat
-    [ package base    ? arg ("--flags=" ++ integerLibraryName)
-    , package ghcPrim ? arg "--flag=include-ghc-prim"
-    , package integerLibrary && windowsHost ?
-        arg "--configure-option=--with-intree-gmp"
-    ]
+programContext :: Stage -> Package -> Action Context
+programContext stage pkg = do
+    profiled <- ghcProfiled <$> flavour
+    return $ if pkg == ghc && profiled && stage > Stage0
+             then Context stage pkg profiling
+             else vanillaContext stage pkg
 
--- bootPackageDb
-bootPackageDbSettings :: Settings
-bootPackageDbSettings =
-    stage Stage0 ?
-        argPath "--package-db="
-        (argConfig "ghc-source-path" <> arg "libraries/bootstrapping.conf")
+-- TODO: switch to Set Package as the order of packages should not matter?
+-- Otherwise we have to keep remembering to sort packages from time to time.
+knownPackages :: [Package]
+knownPackages = sort $ ghcPackages ++ userPackages
 
-cabalSettings :: Settings
-cabalSettings =
-    argsOrdered ["configure", argBuildPath, argBuildDist, dllSettings]
-    `fence`
-    mconcat
-    [ argStagedBuilderPath Ghc -- TODO: used to be limited to max stage1 GHC
-    , argStagedBuilderPath GhcPkg
-    , customConfigureSettings
-    , bootPackageDbSettings
-    , librarySettings targetWays
-    , configNonEmpty "hscolour" ? argBuilderPath HsColour -- TODO: more reuse
-    , configureSettings
-    , stage Stage0 ? argBootPkgConstraints
-    , argStagedBuilderPath Gcc
-    , notStage Stage0 ? argBuilderPath Ld
-    , argBuilderPath Ar
-    , argBuilderPath Alex
-    , argBuilderPath Happy ] -- TODO: reorder with's
+-- TODO: Speed up? Switch to Set?
+-- Note: this is slow but we keep it simple as there are just ~50 packages
+findPackageByName :: PackageName -> Maybe Package
+findPackageByName name = find (\pkg -> pkgName pkg == name) knownPackages
 
-ghcPkgSettings :: Settings
-ghcPkgSettings =
-    arg "update"
-    `fence` mconcat
-    [ arg "--force"
-    , argPath "" $
-      mconcat [argBuildPath, argBuildDist, arg "inplace-pkg-config"]
-    , bootPackageDbSettings ]
+-- | Install's DESTDIR setting.
+getDestDir :: Action FilePath
+getDestDir = fromMaybe "" <$> cmdInstallDestDir