Refine cross-compilation implementation (#410)
authorZhen Zhang <izgzhen@gmail.com>
Mon, 11 Sep 2017 16:54:29 +0000 (00:54 +0800)
committerAndrey Mokhov <andrey.mokhov@gmail.com>
Mon, 11 Sep 2017 16:54:29 +0000 (17:54 +0100)
* Update minimum heap size

* Refine cross-compilation implementation

16 files changed:
hadrian.cabal
src/GHC.hs
src/Oracles/Flag.hs
src/Settings.hs
src/Settings/Builders/Common.hs
src/Settings/Flavours/Development.hs
src/Settings/Flavours/Performance.hs
src/Settings/Flavours/Profiled.hs
src/Settings/Flavours/Quick.hs
src/Settings/Flavours/QuickCross.hs [new file with mode: 0644]
src/Settings/Flavours/Quickest.hs
src/Settings/Packages/Compiler.hs
src/Settings/Packages/Ghc.hs
src/Settings/Packages/GhcPkg.hs
src/Settings/Packages/Haskeline.hs
src/UserSettings.hs

index 3331f3e..1efb041 100644 (file)
@@ -83,6 +83,7 @@ executable hadrian
                        , Settings.Flavours.Performance
                        , Settings.Flavours.Profiled
                        , Settings.Flavours.Quick
+                       , Settings.Flavours.QuickCross
                        , Settings.Flavours.Quickest
                        , Settings.Packages.Base
                        , Settings.Packages.Cabal
index 554cdae..ab6f93b 100644 (file)
@@ -21,6 +21,7 @@ import Base
 import CommandLine
 import Context
 import Oracles.Setting
+import Oracles.Flag (crossCompiling)
 
 -- | These are all GHC packages we know about. Build rules will be generated for
 -- all of them. However, not all of these packages will be built. For example,
@@ -136,6 +137,7 @@ stage0Packages :: Action [Package]
 stage0Packages = do
     win <- windowsHost
     ios <- iosHost
+    cross <- crossCompiling
     return $ [ binary
              , cabal
              , checkApiAnnotations
@@ -160,7 +162,7 @@ stage0Packages = do
              , text
              , transformers
              , unlit                       ]
-          ++ [ terminfo | not win, not ios ]
+          ++ [ terminfo | not win, not ios, not cross ]
           ++ [ touchy   | win              ]
 
 stage1Packages :: Action [Package]
index 510b9d2..0783aa4 100644 (file)
@@ -1,5 +1,5 @@
 module Oracles.Flag (
-    Flag (..), flag, platformSupportsSharedLibs,
+    Flag (..), flag, crossCompiling, platformSupportsSharedLibs,
     ghcWithSMP, ghcWithNativeCodeGen, supportsSplitObjects
     ) where
 
@@ -41,6 +41,9 @@ flag f = do
         ++ quote (key ++ " = " ++ value) ++ " cannot be parsed."
     return $ value == "YES"
 
+crossCompiling :: Action Bool
+crossCompiling = flag CrossCompiling
+
 platformSupportsSharedLibs :: Action Bool
 platformSupportsSharedLibs = do
     badPlatform   <- anyTargetPlatform [ "powerpc-unknown-linux"
index 87bb894..e40f20d 100644 (file)
@@ -13,6 +13,7 @@ import Settings.Flavours.Performance
 import Settings.Flavours.Profiled
 import Settings.Flavours.Quick
 import Settings.Flavours.Quickest
+import Settings.Flavours.QuickCross
 import UserSettings
 
 getArgs :: Args
@@ -32,7 +33,8 @@ stagePackages stage = do
 hadrianFlavours :: [Flavour]
 hadrianFlavours =
     [ defaultFlavour, developmentFlavour Stage1, developmentFlavour Stage2
-    , performanceFlavour, profiledFlavour, quickFlavour, quickestFlavour ]
+    , performanceFlavour, profiledFlavour, quickFlavour, quickestFlavour
+    , quickCrossFlavour ]
 
 flavour :: Action Flavour
 flavour = do
index 18d5727..6da7ea8 100644 (file)
@@ -24,8 +24,9 @@ cIncludeArgs = do
     path    <- getBuildPath
     incDirs <- getPkgDataList IncludeDirs
     depDirs <- getPkgDataList DepIncludeDirs
+    cross   <- expr crossCompiling
     compilerOrGhc <- package compiler ||^ package ghc
-    mconcat [ not (crossCompiling && compilerOrGhc) ? arg "-Iincludes"
+    mconcat [ not (cross && compilerOrGhc) ? arg "-Iincludes"
             , arg $ "-I" ++ root -/- generatedDir
             , arg $ "-I" ++ path
             , pure [ "-I" ++ pkgPath pkg -/- dir | dir <- incDirs ]
index 7d59407..a6a2892 100644 (file)
@@ -14,7 +14,7 @@ developmentArgs :: Stage -> Args
 developmentArgs ghcStage = do
     stage <- getStage
     sourceArgs $ SourceArgs
-        { hsDefault  = pure ["-O", "-H32m"]
+        { hsDefault  = pure ["-O", "-H64m"]
         , hsLibrary  = notStage0 ? arg "-dcore-lint"
         , hsCompiler = succ stage == ghcStage ? pure ["-O0", "-DDEBUG"]
         , hsGhc      = succ stage == ghcStage ? pure ["-O0", "-DDEBUG"] }
index 2867fab..b04cabe 100644 (file)
@@ -11,7 +11,7 @@ performanceFlavour = defaultFlavour
 
 performanceArgs :: Args
 performanceArgs = sourceArgs $ SourceArgs
-    { hsDefault  = pure ["-O", "-H32m"]
+    { hsDefault  = pure ["-O", "-H64m"]
     , hsLibrary  = notStage0 ? arg "-O2"
     , hsCompiler = mconcat [stage0 ? arg "-O", notStage0 ? arg "-O2"]
     , hsGhc      = mconcat [stage0 ? arg "-O", notStage0 ? arg "-O2"] }
index 6e95141..a1b3d98 100644 (file)
@@ -12,7 +12,7 @@ profiledFlavour = defaultFlavour
 
 profiledArgs :: Args
 profiledArgs = sourceArgs $ SourceArgs
-    { hsDefault  = pure ["-O0", "-H32m"]
+    { hsDefault  = pure ["-O0", "-H64m"]
     , hsLibrary  = notStage0 ? arg "-O"
     , hsCompiler = arg "-O"
     , hsGhc      = arg "-O" }
index 15f3f6c..410d0c5 100644 (file)
@@ -15,7 +15,7 @@ quickFlavour = defaultFlavour
 
 quickArgs :: Args
 quickArgs = sourceArgs $ SourceArgs
-    { hsDefault  = pure ["-O0", "-H32m"]
+    { hsDefault  = pure ["-O0", "-H64m"]
     , hsLibrary  = notStage0 ? arg "-O"
     , hsCompiler =    stage0 ? arg "-O"
     , hsGhc      =    stage0 ? arg "-O" }
diff --git a/src/Settings/Flavours/QuickCross.hs b/src/Settings/Flavours/QuickCross.hs
new file mode 100644 (file)
index 0000000..458d6ef
--- /dev/null
@@ -0,0 +1,23 @@
+module Settings.Flavours.QuickCross (quickCrossFlavour) where
+
+import Flavour
+import Expression
+import Oracles.Flag
+import {-# SOURCE #-} Settings.Default
+
+quickCrossFlavour :: Flavour
+quickCrossFlavour = defaultFlavour
+    { name        = "quick-cross"
+    , args        = defaultBuilderArgs <> quickCrossArgs <> defaultPackageArgs
+    , libraryWays = mconcat
+                    [ pure [vanilla]
+                    , notStage0 ? platformSupportsSharedLibs ? pure [dynamic] ] }
+
+quickCrossArgs :: Args
+quickCrossArgs = sourceArgs $ SourceArgs
+    { hsDefault  = pure ["-O0", "-H64m"]
+    , hsLibrary  = notStage0 ? mconcat [ arg "-O", arg "-fllvm" ]
+    , hsCompiler = stage0 ? arg "-O"
+    , hsGhc      = mconcat
+                   [ stage0 ? arg "-O"
+                   , stage1 ? mconcat [ arg "-O0", arg "-fllvm" ] ] }
index f2f0c09..3c507bc 100644 (file)
@@ -13,7 +13,7 @@ quickestFlavour = defaultFlavour
 
 quickestArgs :: Args
 quickestArgs = sourceArgs $ SourceArgs
-    { hsDefault  = pure ["-O0", "-H32m"]
+    { hsDefault  = pure ["-O0", "-H64m"]
     , hsLibrary  = mempty
     , hsCompiler = mempty
     , hsGhc      = mempty }
index bc96235..e728ec0 100644 (file)
@@ -6,7 +6,7 @@ import Flavour
 import Oracles.Flag
 import Oracles.Setting
 import Settings
-import UserSettings (crossCompiling)
+import Oracles.Flag (crossCompiling)
 
 compilerPackageArgs :: Args
 compilerPackageArgs = package compiler ? do
index b1c37be..d7b1d78 100644 (file)
@@ -2,7 +2,7 @@ module Settings.Packages.Ghc (ghcPackageArgs) where
 
 import Expression
 import Oracles.Setting
-import UserSettings (crossCompiling)
+import Oracles.Flag (crossCompiling)
 
 ghcPackageArgs :: Args
 ghcPackageArgs = package ghc ? do
index d31b988..a13a9da 100644 (file)
@@ -1,7 +1,7 @@
 module Settings.Packages.GhcPkg (ghcPkgPackageArgs) where
 
 import Expression
-import UserSettings (crossCompiling)
+import Oracles.Flag (crossCompiling)
 
 ghcPkgPackageArgs :: Args
-ghcPkgPackageArgs = crossCompiling ? package ghcPkg ? builder GhcCabal ? arg "-f-terminfo"
+ghcPkgPackageArgs = package ghcPkg ? builder GhcCabal ? crossCompiling ? arg "-f-terminfo"
index 2547d13..254c6b7 100644 (file)
@@ -1,7 +1,7 @@
 module Settings.Packages.Haskeline (haskelinePackageArgs) where
 
 import Expression
-import UserSettings (crossCompiling)
+import Oracles.Flag (crossCompiling)
 
 haskelinePackageArgs :: Args
 haskelinePackageArgs =
index 3e03ed6..0896eff 100644 (file)
@@ -4,7 +4,7 @@
 -- accidentally commit them.
 module UserSettings (
     userBuildRoot, userFlavours, userPackages, verboseCommand,
-    buildProgressColour, successColour, stage1Only, crossCompiling
+    buildProgressColour, successColour, stage1Only
     ) where
 
 import Hadrian.Utilities
@@ -45,11 +45,6 @@ buildProgressColour = BuildProgressColour (Dull, Magenta)
 successColour :: SuccessColour
 successColour = SuccessColour (Dull, Green)
 
--- | Build a cross compiling GHC
--- TODO: Use @Action Bool@ version in @Oracles.Flag@
-crossCompiling :: Bool
-crossCompiling = False
-
 {-
   Stage1Only=YES means:
    - don't build ghc-stage2 (the executable)