Implement install_docs (#442)
[hadrian.git] / src / Settings.hs
index 12830ca..e40f20d 100644 (file)
@@ -1,53 +1,68 @@
 module Settings (
-    module Settings.Packages,
-    module Settings.Paths,
-    module Settings.User,
-    module Settings.Ways,
-    getPkgData, getPkgDataList, getTopDirectory, programPath, isLibrary,
-    getPackagePath, getTargetDirectory, getTargetPath, getPackageSources
+    getArgs, getLibraryWays, getRtsWays, flavour, knownPackages,
+    findPackageByName, getPkgData, getPkgDataList, isLibrary, stagePackages,
+    programContext, integerLibraryName, getDestDir
     ) where
 
-import Base
+import CommandLine
 import Expression
-import Oracles
-import Oracles.ModuleFiles
-import Settings.Packages
-import Settings.Paths
-import Settings.User
-import Settings.Ways
-
-getPackagePath :: Expr FilePath
-getPackagePath = pkgPath <$> getPackage
-
-getTargetDirectory :: Expr FilePath
-getTargetDirectory = targetDirectory <$> getStage <*> getPackage
-
-getTargetPath :: Expr FilePath
-getTargetPath = targetPath <$> getStage <*> getPackage
-
-getPkgData :: (FilePath -> PackageData) -> Expr String
-getPkgData key = lift . pkgData . key =<< getTargetPath
-
-getPkgDataList :: (FilePath -> PackageDataList) -> Expr [String]
-getPkgDataList key = lift . pkgDataList . key =<< getTargetPath
-
-getTopDirectory :: Expr FilePath
-getTopDirectory = lift topDirectory
-
-programPath :: Stage -> Package -> Maybe FilePath
-programPath = userProgramPath
-
--- | Find all Haskell source files for the current target
-getPackageSources :: Expr [FilePath]
-getPackageSources = do
-    stage <- getStage
-    pkg   <- getPackage
-    path  <- getTargetPath
-    let buildPath = path -/- "build"
-        autogen   = buildPath -/- "autogen"
-    (found, missingMods) <- lift $ haskellModuleFiles stage pkg
-    -- Generated source files live in buildPath and have extension "hs"...
-    let generated = [ buildPath -/- (replaceEq '.' '/' m) <.> "hs" | m <- missingMods ]
-    -- ...except that GHC/Prim.hs lives in autogen. TODO: fix the inconsistency?
-        fixGhcPrim = replaceEq (buildPath -/- "GHC/Prim.hs") (autogen -/- "GHC/Prim.hs")
-    return $ found ++ fixGhcPrim generated
+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
+
+-- | Install's DESTDIR setting.
+getDestDir :: Action FilePath
+getDestDir = fromMaybe "" <$> cmdInstallDestDir