Implement install_docs (#442)
[hadrian.git] / src / Settings.hs
index 172409a..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
-
-validating :: BuildPredicate
-validating = false
+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
 
-packageSettings :: Settings
-packageSettings = msum
-    [ args ["-hide-all-packages", "-no-user-package-db", "-include-pkg-deps"]
-    , stage Stage0 ? arg "-package-db libraries/bootstrapping.conf"
-    , supportsPackageKey && notStage Stage0 ??
-      ( argPairs "-this-package-key" argPackageKey <|>
-        argPairs "-package-key"      argPackageDepKeys
-      , argPairs "-package-name"     argPackageKey <|>
-        argPairs "-package"          argPackageDeps )]
+getArgs :: Args
+getArgs = expr flavour >>= args
 
-librarySettings :: Ways -> Settings
-librarySettings ways = msum
-    [ 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" )]
+getLibraryWays :: Ways
+getLibraryWays = expr flavour >>= libraryWays
 
-ccSettings :: Settings
-ccSettings = msum
-    [ package integerLibrary ? arg "-Ilibraries/integer-gmp2/gmp"
-    , builder GhcCabal ? argStagedConfig "conf-cc-args"
-    , validating ? msum
-        [ 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 ? argStagedConfig "conf-gcc-linker-args"
+stagePackages :: Stage -> Action [Package]
+stagePackages stage = do
+    f <- flavour
+    packages f stage
 
-cppSettings :: Settings
-cppSettings = builder GhcCabal ? argStagedConfig "conf-cpp-args"
+hadrianFlavours :: [Flavour]
+hadrianFlavours =
+    [ defaultFlavour, developmentFlavour Stage1, developmentFlavour Stage2
+    , performanceFlavour, profiledFlavour, quickFlavour, quickestFlavour
+    , quickCrossFlavour ]
 
-configureSettings :: Settings
-configureSettings =
-    let conf key = argPrefix ("--configure-option=" ++ key ++ "=")
-                 . argConcatSpace
-    in
-    msum [ conf "CFLAGS"   ccSettings
-            , conf "LDFLAGS"  ldSettings
-            , conf "CPPFLAGS" cppSettings
-            , argPrefix "--gcc-options=" $
-              argConcatSpace (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 = msum
-    [ 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 ?
-        argPrefix "--package-db="
-        (argConcatPath $
-            argConfig "ghc-source-path" |>
-            arg "libraries"             |>
-            arg "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 =
-    mproduct
-    [ argBuilderPath GhcCabal
-    , arg "configure"
-    , argBuildPath
-    , argBuildDir
-    , dllSettings ]
-    |>
-    msum
-    [ argWithStagedBuilder Ghc -- TODO: used to be limited to max stage1 GHC
-    , argWithStagedBuilder GhcPkg
-    , customConfigureSettings
-    , stage Stage0 ? bootPackageDbSettings
-    , librarySettings targetWays
-    , configNonEmpty "hscolour" ? argWithBuilder HsColour -- TODO: more reuse
-    , configureSettings
-    , stage Stage0 ? argBootPkgConstraints
-    , argWithStagedBuilder Gcc
-    , notStage Stage0 ? argWithBuilder Ld
-    , argWithBuilder Ar
-    , argWithBuilder Alex
-    , argWithBuilder 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" |> msum
-        [ arg "--force"
-        , argConcatPath $
-          msum [argBuildPath, argBuildDir, arg "inplace-pkg-config"]
-        , bootPackageDbSettings ]
+-- | Install's DESTDIR setting.
+getDestDir :: Action FilePath
+getDestDir = fromMaybe "" <$> cmdInstallDestDir