Implement install_docs (#442)
[hadrian.git] / src / Settings.hs
index 9f52026..e40f20d 100644 (file)
@@ -1,35 +1,68 @@
 module Settings (
-    module Settings.Packages,
-    module Settings.Paths,
-    module Settings.User,
-    module Settings.Ways,
-    getPkgData, getPkgDataList, getTopDirectory, isLibrary,
-    getPackagePath, getContextDirectory, getContextPath
+    getArgs, getLibraryWays, getRtsWays, flavour, knownPackages,
+    findPackageByName, getPkgData, getPkgDataList, isLibrary, stagePackages,
+    programContext, integerLibraryName, getDestDir
     ) where
 
-import Base
+import CommandLine
 import Expression
-import Oracles.PackageData
-import Oracles.WindowsPath
-import Settings.Packages
-import Settings.Paths
-import Settings.User
-import Settings.Ways
+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
 
-getPackagePath :: Expr FilePath
-getPackagePath = pkgPath <$> getPackage
+getArgs :: Args
+getArgs = expr flavour >>= args
 
-getContextDirectory :: Expr FilePath
-getContextDirectory = contextDirectory <$> getContext
+getLibraryWays :: Ways
+getLibraryWays = expr flavour >>= libraryWays
 
-getContextPath :: Expr FilePath
-getContextPath = contextPath <$> getContext
+getRtsWays :: Ways
+getRtsWays = expr flavour >>= rtsWays
 
-getPkgData :: (FilePath -> PackageData) -> Expr String
-getPkgData key = lift . pkgData . key =<< getContextPath
+stagePackages :: Stage -> Action [Package]
+stagePackages stage = do
+    f <- flavour
+    packages f stage
 
-getPkgDataList :: (FilePath -> PackageDataList) -> Expr [String]
-getPkgDataList key = lift . pkgDataList . key =<< getContextPath
+hadrianFlavours :: [Flavour]
+hadrianFlavours =
+    [ defaultFlavour, developmentFlavour Stage1, developmentFlavour Stage2
+    , performanceFlavour, profiledFlavour, quickFlavour, quickestFlavour
+    , quickCrossFlavour ]
 
-getTopDirectory :: Expr FilePath
-getTopDirectory = lift topDirectory
+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
+
+-- | Install's DESTDIR setting.
+getDestDir :: Action FilePath
+getDestDir = fromMaybe "" <$> cmdInstallDestDir