Implement install_docs (#442)
[hadrian.git] / src / Settings.hs
index e70e41c..e40f20d 100644 (file)
@@ -1,56 +1,68 @@
-{-# LANGUAGE FlexibleInstances #-}
-
 module Settings (
-    IntegerLibrary (..), integerLibrary, integerLibraryName,
-    buildHaddock
+    getArgs, getLibraryWays, getRtsWays, flavour, knownPackages,
+    findPackageByName, getPkgData, getPkgDataList, isLibrary, stagePackages,
+    programContext, integerLibraryName, getDestDir
     ) where
 
-import Base
+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
+
+getArgs :: Args
+getArgs = expr flavour >>= args
+
+getLibraryWays :: Ways
+getLibraryWays = expr flavour >>= libraryWays
+
+getRtsWays :: Ways
+getRtsWays = expr flavour >>= rtsWays
+
+stagePackages :: Stage -> Action [Package]
+stagePackages stage = do
+    f <- flavour
+    packages f stage
+
+hadrianFlavours :: [Flavour]
+hadrianFlavours =
+    [ defaultFlavour, developmentFlavour Stage1, developmentFlavour Stage2
+    , performanceFlavour, profiledFlavour, quickFlavour, quickestFlavour
+    , quickCrossFlavour ]
+
+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
+
+integerLibraryName :: Action String
+integerLibraryName = pkgName <$> (integerLibrary =<< flavour)
+
+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
+
+-- 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
+
+-- 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
 
-data IntegerLibrary = IntegerGmp | IntegerGmp2 | IntegerSimple
-
-integerLibrary :: IntegerLibrary
-integerLibrary = IntegerGmp2
-
-integerLibraryName :: String
-integerLibraryName = case integerLibrary of
-    IntegerGmp    -> "integer-gmp"
-    IntegerGmp2   -> "integer-gmp2"
-    IntegerSimple -> "integer-simple"
-
-buildHaddock :: Bool
-buildHaddock = True
-
-supportsPackageKey :: Guard
-supportsPackageKey = keyYes "supports-package-key"
-
-whenPackageKey :: Guard
-whenPackageKey = supportsPackageKey <> notStage Stage0
-
-depSettings :: Settings
-depSettings =
-    opts ["-hide-all-packages", "-no-user-package-db", "-include-pkg-deps"]
-    <>
-    stage Stage0 ? opts ["-package-db libraries/bootstrapping.conf"]
-    <>
-    whenPackageKey ?
-        (packageKey "-this-package-key" <> packageDepKeys "-package-key")
-    <>
-    (Not $ whenPackageKey) ?
-        (packageKey "-package-name" <> packageDeps "-package")
-
---packageArgs :: Stage -> FilePath -> Args
---packageArgs stage pathDist = do
---    usePackageKey <- SupportsPackageKey || stage /= Stage0
---    args [ arg "-hide-all-packages"
---         , arg "-no-user-package-db"
---         , arg "-include-pkg-deps"
---         , when (stage == Stage0) $
---           arg "-package-db libraries/bootstrapping.conf"
---         , if usePackageKey
---           then productArgs ["-this-package-key"] [arg  $ PackageKey pathDist]
---             <> productArgs ["-package-key"     ] [args $ DepKeys    pathDist]
---           else productArgs ["-package-name"    ] [arg  $ PackageKey pathDist]
---             <> productArgs ["-package"         ] [args $ Deps       pathDist]
---         ]
+-- | Install's DESTDIR setting.
+getDestDir :: Action FilePath
+getDestDir = fromMaybe "" <$> cmdInstallDestDir