Do not always add -Iincludes to C arguments (#610)
[hadrian.git] / src / Settings / Builders / Common.hs
index e7af38b..ae660db 100644 (file)
@@ -2,17 +2,18 @@ module Settings.Builders.Common (
     module Base,
     module Expression,
     module Oracles.Flag,
-    module Oracles.PackageData,
     module Oracles.Setting,
     module Settings,
     module UserSettings,
-    cIncludeArgs, ldArgs, cArgs, cWarnings, bootPackageDatabaseArgs
+    cIncludeArgs, ldArgs, cArgs, cWarnings,
+    packageDatabaseArgs, bootPackageDatabaseArgs
     ) where
 
 import Base
 import Expression
+import GHC.Packages
+import Hadrian.Haskell.Cabal.PackageData
 import Oracles.Flag
-import Oracles.PackageData
 import Oracles.Setting
 import Settings
 import UserSettings
@@ -22,13 +23,21 @@ cIncludeArgs = do
     pkg     <- getPackage
     root    <- getBuildRoot
     path    <- getBuildPath
-    incDirs <- getPkgDataList IncludeDirs
-    depDirs <- getPkgDataList DepIncludeDirs
-    cross   <- expr crossCompiling
-    compilerOrGhc <- package compiler ||^ package ghc
-    mconcat [ not (cross && compilerOrGhc) ? arg "-Iincludes"
+    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
+            , 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 ] ]
 
@@ -40,20 +49,24 @@ cArgs = mempty
 
 -- TODO: should be in a different file
 cWarnings :: Args
-cWarnings = do
-    let gccGe46 = notM $ (flag GccIsClang ||^ flag GccLt46)
-    mconcat [ 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" ]
+
+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
     dbPath <- expr $ packageDbPath stage
     expr $ need [dbPath -/- packageDbStamp]
-    stage0 ? do
-        top    <- expr topDirectory
-        root   <- getBuildRoot
-        prefix <- ifM (builder Ghc) (return "-package-db ") (return "--package-db=")
-        arg $ prefix ++ top -/- root -/- stage0PackageDbDir
+    stage0 ? packageDatabaseArgs