Do not always add -Iincludes to C arguments (#610)
[hadrian.git] / src / Settings / Builders / Common.hs
index 2146b2d..ae660db 100644 (file)
@@ -1,81 +1,72 @@
 module Settings.Builders.Common (
     module Base,
     module Expression,
-    module GHC,
-    module Oracles.Config.Flag,
-    module Oracles.Config.Setting,
-    module Oracles.PackageData,
-    module Oracles.WindowsPath,
-    module Predicate,
+    module Oracles.Flag,
+    module Oracles.Setting,
     module Settings,
-    module Settings.Paths,
     module UserSettings,
-    cIncludeArgs, ldArgs, cArgs, cWarnings, argSetting, argSettingList,
-    argStagedBuilderPath, argStagedSettingList, bootPackageDatabaseArgs
+    cIncludeArgs, ldArgs, cArgs, cWarnings,
+    packageDatabaseArgs, bootPackageDatabaseArgs
     ) where
 
 import Base
 import Expression
-import GHC
-import Oracles.Config.Flag
-import Oracles.Config.Setting
-import Oracles.PackageData
-import Oracles.WindowsPath
-import Predicate
+import GHC.Packages
+import Hadrian.Haskell.Cabal.PackageData
+import Oracles.Flag
+import Oracles.Setting
 import Settings
-import Settings.Paths
 import UserSettings
 
 cIncludeArgs :: Args
 cIncludeArgs = do
     pkg     <- getPackage
+    root    <- getBuildRoot
     path    <- getBuildPath
-    incDirs <- getPkgDataList IncludeDirs
-    depDirs <- getPkgDataList DepIncludeDirs
-    mconcat [ arg "-Iincludes"
-            , arg $ "-I" ++ generatedPath
+    incDirs <- getPackageData includeDirs
+    depDirs <- getPackageData depIncludeDirs
+    iconvIncludeDir <- getSetting IconvIncludeDir
+    gmpIncludeDir   <- getSetting GmpIncludeDir
+    ffiIncludeDir   <- getSetting FfiIncludeDir
+    mconcat [ notStage0 ||^ package compiler ? arg "-Iincludes"
+            , arg $ "-I" ++ root -/- generatedDir
             , arg $ "-I" ++ path
-            , arg $ "-I" ++ path -/- "autogen"
-            , append [ "-I" ++ pkgPath pkg -/- dir | dir <- incDirs ]
-            , append [ "-I" ++       unifyPath dir | dir <- depDirs ] ]
+            , pure . map ("-I"++) . filter (/= "") $ [iconvIncludeDir, gmpIncludeDir]
+            , flag UseSystemFfi ? arg ("-I" ++ ffiIncludeDir)
+            -- Add @incDirs@ in the build directory, since some files generated
+            -- with @autoconf@ may end up in the build directory.
+            , pure [ "-I" ++ path        -/- dir | dir <- incDirs ]
+            -- Add @incDirs@ in the package directory for include files shipped
+            -- with the package.
+            , pure [ "-I" ++ pkgPath pkg -/- dir | dir <- incDirs ]
+            , pure [ "-I" ++       unifyPath dir | dir <- depDirs ] ]
 
 ldArgs :: Args
 ldArgs = mempty
 
--- TODO: put all validating options together in one file
 cArgs :: Args
-cArgs = validating ? cWarnings
+cArgs = mempty
 
 -- TODO: should be in a different file
 cWarnings :: Args
-cWarnings = do
-    let gccGe46 = notM $ (flag GccIsClang ||^ flag GccLt46)
-    mconcat [ turnWarningsIntoErrors ? arg "-Werror"
-            , arg "-Wall"
-            , flag GccIsClang ? arg "-Wno-unknown-pragmas"
-            , gccGe46 ? notM windowsHost ? arg "-Werror=unused-but-set-variable"
-            , gccGe46 ? arg "-Wno-error=inline" ]
+cWarnings = mconcat
+    [ arg "-Wall"
+    , flag GccIsClang ? arg "-Wno-unknown-pragmas"
+    , notM (flag GccIsClang) ? notM windowsHost ? arg "-Werror=unused-but-set-variable"
+    , notM (flag GccIsClang) ? arg "-Wno-error=inline" ]
 
-argM :: Action String -> Args
-argM = (arg =<<) . lift
-
-argSetting :: Setting -> Args
-argSetting = argM . setting
-
-argSettingList :: SettingList -> Args
-argSettingList = (append =<<) . getSettingList
-
-argStagedSettingList :: (Stage -> SettingList) -> Args
-argStagedSettingList ss = argSettingList . ss =<< getStage
-
-argStagedBuilderPath :: (Stage -> Builder) -> Args
-argStagedBuilderPath sb = argM . builderPath . sb =<< getStage
+packageDatabaseArgs :: Args
+packageDatabaseArgs = do
+    stage <- getStage
+    dbPath <- expr (packageDbPath stage)
+    expr (need [dbPath -/- packageDbStamp])
+    root <- getBuildRoot
+    prefix <- ifM (builder Ghc) (return "-package-db ") (return "--package-db=")
+    arg $ prefix ++ root -/- relativePackageDbPath stage
 
 bootPackageDatabaseArgs :: Args
 bootPackageDatabaseArgs = do
-    stage <- getStage
-    lift $ need [packageDbStamp stage]
-    stage0 ? do
-        path   <- getTopDirectory
-        prefix <- ifM (builder Ghc) (return "-package-db ") (return "--package-db=")
-        arg $ prefix ++ path -/- packageDbDirectory Stage0
+    stage  <- getStage
+    dbPath <- expr $ packageDbPath stage
+    expr $ need [dbPath -/- packageDbStamp]
+    stage0 ? packageDatabaseArgs