[commit: hadrian] master: Preliminary nofib rule (#599) (d6c4e04)

git at git.haskell.org git at git.haskell.org
Fri Jun 8 00:02:27 UTC 2018


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

On branch  : master
Link       : http://git.haskell.org/hadrian.git/commitdiff/d6c4e0423c3c41f01daf6a3e0403e8cf6ca82d95

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

commit d6c4e0423c3c41f01daf6a3e0403e8cf6ca82d95
Author: Alp Mestanogullari <alpmestan at gmail.com>
Date:   Thu May 17 15:19:06 2018 +0200

    Preliminary nofib rule (#599)
    
    * first draft of a nofib rule
    
    * address some of Andrey's feedback
    
    * refactor nofib into a proper Builder, now runs but one of the programs fails
    
    * more subtle error handling, docs
    
    * get rid of RunNofib builder, invoke commands directly


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

d6c4e0423c3c41f01daf6a3e0403e8cf6ca82d95
 hadrian.cabal                 |  1 +
 src/Main.hs                   |  2 ++
 src/Rules/Nofib.hs            | 58 +++++++++++++++++++++++++++++++++++++++++++
 src/Settings/Builders/Make.hs | 11 +++++++-
 4 files changed, 71 insertions(+), 1 deletion(-)

diff --git a/hadrian.cabal b/hadrian.cabal
index 96d5891..0bcbf1f 100644
--- a/hadrian.cabal
+++ b/hadrian.cabal
@@ -62,6 +62,7 @@ executable hadrian
                        , Rules.Gmp
                        , Rules.Libffi
                        , Rules.Library
+                       , Rules.Nofib
                        , Rules.Program
                        , Rules.Register
                        , Rules.Selftest
diff --git a/src/Main.hs b/src/Main.hs
index c90b052..083e683 100644
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -10,6 +10,7 @@ import qualified Environment
 import qualified Rules
 import qualified Rules.Clean
 import qualified Rules.Documentation
+import qualified Rules.Nofib
 import qualified Rules.SourceDist
 import qualified Rules.Selftest
 import qualified Rules.Test
@@ -43,6 +44,7 @@ main = do
             Rules.buildRules
             Rules.Documentation.documentationRules
             Rules.Clean.cleanRules
+            Rules.Nofib.nofibRules
             Rules.oracleRules
             Rules.Selftest.selftestRules
             Rules.SourceDist.sourceDistRules
diff --git a/src/Rules/Nofib.hs b/src/Rules/Nofib.hs
new file mode 100644
index 0000000..e0ef5ea
--- /dev/null
+++ b/src/Rules/Nofib.hs
@@ -0,0 +1,58 @@
+module Rules.Nofib where
+
+import Base
+import Expression
+import GHC
+import Oracles.Setting
+import Target
+
+import System.Environment
+import System.Exit
+
+nofibRules :: Rules ()
+nofibRules = do
+  root <- buildRootRules
+
+  -- a phony "nofib" rule that just triggers
+  -- the rule below.
+  "nofib" ~> need [root -/- nofibLogFile]
+
+  -- a rule to produce <build root>/nofig-log
+  -- by running the nofib suite and capturing
+  -- the relevant output.
+  root -/- nofibLogFile %> \fp -> do
+    needNofibDeps
+
+    makePath <- builderPath (Make "nofib")
+    top <- topDirectory
+    ghcPath <- builderPath (Ghc CompileHs Stage2)
+    perlPath <- builderPath Perl
+
+    -- some makefiles in nofib rely on a $MAKE
+    -- env var being defined
+    liftIO (setEnv "MAKE" makePath)
+
+    -- this runs make commands in the nofib
+    -- subdirectory, passing the path to
+    -- the GHC to benchmark and perl to
+    -- nofib's makefiles.
+    let nofibArgs = ["WithNofibHc=" ++ (top -/- ghcPath), "PERL=" ++ perlPath]
+    unit $ cmd (Cwd "nofib") [makePath] ["clean"]
+    unit $ cmd (Cwd "nofib") [makePath] (nofibArgs ++ ["boot"])
+    (Exit e, Stdouterr log) <- cmd (Cwd "nofib") [makePath] nofibArgs
+    writeFile' fp log
+    if e == ExitSuccess
+      then putLoud $ "nofib log available at " ++ fp
+      else error $ "nofib failed, full log available at " ++ fp
+
+nofibLogFile :: FilePath
+nofibLogFile = "nofib-log"
+
+
+-- the dependencies that nofib seems to require.
+needNofibDeps :: Action ()
+needNofibDeps = do
+  unlitPath <- programPath (Context Stage1 unlit vanilla)
+  mtlPath <- pkgConfFile (Context Stage1 mtl vanilla)
+  need [ unlitPath, mtlPath ]
+  needBuilder (Ghc CompileHs Stage2)
diff --git a/src/Settings/Builders/Make.hs b/src/Settings/Builders/Make.hs
index cc350df..79d73cc 100644
--- a/src/Settings/Builders/Make.hs
+++ b/src/Settings/Builders/Make.hs
@@ -1,5 +1,6 @@
 module Settings.Builders.Make (makeBuilderArgs) where
 
+import Builder
 import Rules.Gmp
 import Rules.Libffi
 import Settings.Builders.Common
@@ -9,8 +10,16 @@ makeBuilderArgs = do
     threads    <- shakeThreads <$> expr getShakeOptions
     gmpPath    <- expr gmpBuildPath
     libffiPath <- expr libffiBuildPath
+    ghcPath    <- expr $
+      (-/-) <$> topDirectory <*> builderPath (Ghc CompileHs Stage2)
+    perlPath   <- expr $ builderPath Perl
     let t = show $ max 4 (threads - 2) -- Don't use all Shake's threads
     mconcat
         [ builder (Make gmpPath          ) ? pure ["MAKEFLAGS=-j" ++ t]
         , builder (Make libffiPath       ) ? pure ["MAKEFLAGS=-j" ++ t, "install"]
-        , builder (Make "testsuite/tests") ? pure ["THREADS=" ++ t, "fast"] ]
+        , builder (Make "testsuite/tests") ? pure ["THREADS=" ++ t, "fast"]
+        , builder (Make "nofib"          ) ? pure
+            [ "WithNofibHc=" ++ ghcPath
+            , "PERL=" ++ perlPath
+            ]
+        ]



More information about the ghc-commits mailing list