[commit: ghc] wip/nfs-locking: Add support for separate interface file compilation. (6b532ba)

git at git.haskell.org git at git.haskell.org
Fri Oct 27 00:40:53 UTC 2017


Repository : ssh://git@git.haskell.org/ghc

On branch  : wip/nfs-locking
Link       : http://ghc.haskell.org/trac/ghc/changeset/6b532baa0dd71e5c61229c0be832d871bf0bf705/ghc

>---------------------------------------------------------------

commit 6b532baa0dd71e5c61229c0be832d871bf0bf705
Author: Andrey Mokhov <andrey.mokhov at gmail.com>
Date:   Sat Jan 16 03:11:31 2016 +0000

    Add support for separate interface file compilation.
    
    See #174.


>---------------------------------------------------------------

6b532baa0dd71e5c61229c0be832d871bf0bf705
 src/Rules/Compile.hs         | 16 ++++++++++++++--
 src/Settings/Builders/Ghc.hs | 15 +++++++++------
 src/Settings/User.hs         |  7 ++++++-
 3 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/src/Rules/Compile.hs b/src/Rules/Compile.hs
index 2fb315c..2065415 100644
--- a/src/Rules/Compile.hs
+++ b/src/Rules/Compile.hs
@@ -12,10 +12,22 @@ compilePackage _ target @ (PartialTarget stage pkg) = do
     let buildPath = targetPath stage pkg -/- "build"
 
     matchBuildResult buildPath "hi" ?> \hi ->
-        need [ hi -<.> osuf (detectWay hi) ]
+        if compileInterfaceFilesSeparately
+        then do
+            let way = detectWay hi
+            (src, deps) <- dependencies buildPath $ hi -<.> osuf way
+            need $ src : deps
+            build $ fullTargetWithWay target (Ghc stage) way [src] [hi]
+        else need [ hi -<.> osuf (detectWay hi) ]
 
     matchBuildResult buildPath "hi-boot" ?> \hiboot ->
-        need [ hiboot -<.> obootsuf (detectWay hiboot) ]
+        if compileInterfaceFilesSeparately
+        then do
+            let way = detectWay hiboot
+            (src, deps) <- dependencies buildPath $ hiboot -<.> obootsuf way
+            need $ src : deps
+            build $ fullTargetWithWay target (Ghc stage) way [src] [hiboot]
+        else need [ hiboot -<.> obootsuf (detectWay hiboot) ]
 
     -- TODO: add dependencies for #include of .h and .hs-incl files (gcc -MM?)
     matchBuildResult buildPath "o" ?> \obj -> do
diff --git a/src/Settings/Builders/Ghc.hs b/src/Settings/Builders/Ghc.hs
index 40b5a0f..0f1fc32 100644
--- a/src/Settings/Builders/Ghc.hs
+++ b/src/Settings/Builders/Ghc.hs
@@ -24,7 +24,9 @@ ghcBuilderArgs :: Args
 ghcBuilderArgs = stagedBuilder Ghc ? do
     output <- getOutput
     way    <- getWay
-    let buildObj = ("//*." ++ osuf way) ?== output || ("//*." ++ obootsuf way) ?== output
+    let buildObj  = ("//*." ++  osuf way) ?== output || ("//*." ++  obootsuf way) ?== output
+        buildHi   = ("//*." ++ hisuf way) ?== output || ("//*." ++ hibootsuf way) ?== output
+        buildProg = not (buildObj || buildHi)
     libs    <- getPkgDataList DepExtraLibs
     gmpLibs <- lift $ readFileLines gmpLibNameCache
     libDirs <- getPkgDataList DepLibDirs
@@ -35,12 +37,13 @@ ghcBuilderArgs = stagedBuilder Ghc ? do
             , arg "-Wall"
             , arg "-fwarn-tabs"
             , splitObjectsArgs
-            , not buildObj ? arg "-no-auto-link-packages"
-            , not buildObj ? append [ "-optl-l" ++ lib | lib <- libs ++ gmpLibs ]
-            , not buildObj ? append [ "-optl-L" ++ dir | dir <- libDirs ]
-            , buildObj ? arg "-c"
+            , buildProg ? arg "-no-auto-link-packages"
+            , buildProg ? append [ "-optl-l" ++ lib | lib <- libs ++ gmpLibs ]
+            , buildProg ? append [ "-optl-L" ++ dir | dir <- libDirs ]
+            , not buildProg ? arg "-c"
             , append =<< getInputs
-            , arg "-o", arg =<< getOutput ]
+            , buildHi ? append ["-fno-code", "-fwrite-interface"]
+            , not buildHi ? mconcat [ arg "-o", arg =<< getOutput ] ]
 
 splitObjectsArgs :: Args
 splitObjectsArgs = splitObjects ? do
diff --git a/src/Settings/User.hs b/src/Settings/User.hs
index 3cebe13..5b82571 100644
--- a/src/Settings/User.hs
+++ b/src/Settings/User.hs
@@ -3,7 +3,8 @@ module Settings.User (
     userArgs, userPackages, userLibWays, userRtsWays, userKnownPackages,
     integerLibrary, buildHaddock, validating, ghciWithDebugger, ghcProfiled,
     ghcDebugged, dynamicGhcPrograms, laxDependencies, buildSystemConfigFile,
-    verboseCommands, turnWarningsIntoErrors, splitObjects
+    verboseCommands, turnWarningsIntoErrors, splitObjects,
+    compileInterfaceFilesSeparately
     ) where
 
 import GHC
@@ -101,3 +102,7 @@ verboseCommands = return False
 -- | To enable -Werror in Stage2 set turnWarningsIntoErrors = stage2.
 turnWarningsIntoErrors :: Predicate
 turnWarningsIntoErrors = return False
+
+-- | Decouple the compilation of @*.hi@ and @*.o@ files by setting to True.
+compileInterfaceFilesSeparately :: Bool
+compileInterfaceFilesSeparately = True



More information about the ghc-commits mailing list