summaryrefslogtreecommitdiff
path: root/hadrian
diff options
context:
space:
mode:
authorMatthew Pickering <matthewtpickering@gmail.com>2023-04-04 10:52:49 +0100
committerMarge Bot <ben+marge-bot@smart-cactus.org>2023-05-04 14:58:14 -0400
commit8cc9a534951d8352c31c9a21f5f91bbf188722b2 (patch)
treea599c18813ae3b42638af97d135f0913cfc6f900 /hadrian
parent8fde4ac84ec7b1ead238cb158bbef48555d12af9 (diff)
downloadhaskell-8cc9a534951d8352c31c9a21f5f91bbf188722b2.tar.gz
hadrian: Flavour: Change args -> extraArgs
Previously in a flavour definition you could override all the flags which were passed to GHC. This causes issues when needed to compute a package hash because we need to know what these extra arguments are going to be before computing the hash. The solution is to modify flavour so that the arguments you pass here are just extra ones rather than all the arguments that you need to compile something. This makes things work more like how cabal.project files work when you give extra arguments to a package and also means that flavour transformers correctly affect the hash.
Diffstat (limited to 'hadrian')
-rw-r--r--hadrian/src/Flavour.hs4
-rw-r--r--hadrian/src/Flavour/Type.hs5
-rw-r--r--hadrian/src/Hadrian/Haskell/Cabal/Parse.hs5
-rwxr-xr-xhadrian/src/Settings.hs7
-rw-r--r--hadrian/src/Settings/Builders/Ghc.hs3
-rw-r--r--hadrian/src/Settings/Default.hs12
-rw-r--r--hadrian/src/Settings/Default.hs-boot4
-rw-r--r--hadrian/src/Settings/Flavours/Benchmark.hs2
-rw-r--r--hadrian/src/Settings/Flavours/Development.hs2
-rw-r--r--hadrian/src/Settings/Flavours/GhcInGhci.hs2
-rw-r--r--hadrian/src/Settings/Flavours/Performance.hs2
-rw-r--r--hadrian/src/Settings/Flavours/Quick.hs2
-rw-r--r--hadrian/src/Settings/Flavours/QuickCross.hs2
-rw-r--r--hadrian/src/Settings/Flavours/Quickest.hs2
-rw-r--r--hadrian/src/Settings/Flavours/Validate.hs4
15 files changed, 30 insertions, 28 deletions
diff --git a/hadrian/src/Flavour.hs b/hadrian/src/Flavour.hs
index 6f68d6c6ba..47211d0971 100644
--- a/hadrian/src/Flavour.hs
+++ b/hadrian/src/Flavour.hs
@@ -112,7 +112,7 @@ parseFlavour baseFlavours transformers str =
-- | Add arguments to the 'args' of a 'Flavour'.
addArgs :: Args -> Flavour -> Flavour
-addArgs args' fl = fl { args = args fl <> args' }
+addArgs args' fl = fl { extraArgs = extraArgs fl <> args' }
-- | Turn on -Werror for packages built with the stage1 compiler.
-- It mimics the CI settings so is useful to turn on when developing.
@@ -468,7 +468,7 @@ applySetting (KeyVal ks op v) = case runSettingsM ks builderPredicate of
Left err -> throwError $
"error while setting `" ++ intercalate "`." ks ++ ": " ++ err
Right pred -> Right $ \flav -> flav
- { args = update (args flav) pred }
+ { extraArgs = update (extraArgs flav) pred }
where override arguments predicate = do
holds <- predicate
diff --git a/hadrian/src/Flavour/Type.hs b/hadrian/src/Flavour/Type.hs
index da236cbba3..a84ae77e79 100644
--- a/hadrian/src/Flavour/Type.hs
+++ b/hadrian/src/Flavour/Type.hs
@@ -14,8 +14,9 @@ import Data.Set (Set)
data Flavour = Flavour {
-- | Flavour name, to select this flavour from command line.
name :: String,
- -- | Use these command line arguments.
- args :: Args,
+ -- | Use these extra command line arguments.
+ -- This can't depend on the result of configuring a package (ie, using readContextData)
+ extraArgs :: Args,
-- | Build these packages.
packages :: Stage -> Action [Package],
-- | Bignum backend: 'native', 'gmp', 'ffi', etc.
diff --git a/hadrian/src/Hadrian/Haskell/Cabal/Parse.hs b/hadrian/src/Hadrian/Haskell/Cabal/Parse.hs
index 2ab73b76c0..74ae8fb16a 100644
--- a/hadrian/src/Hadrian/Haskell/Cabal/Parse.hs
+++ b/hadrian/src/Hadrian/Haskell/Cabal/Parse.hs
@@ -158,9 +158,8 @@ configurePackage context@Context {..} = do
pure $ if configureExists then C.autoconfUserHooks else C.simpleUserHooks
-- Compute the list of flags, and the Cabal configuration arguments
- flavourArgs <- args <$> flavour
- flagList <- interpret (target context (Cabal Flags stage) [] []) flavourArgs
- argList <- interpret (target context (Cabal Setup stage) [] []) flavourArgs
+ flagList <- interpret (target context (Cabal Flags stage) [] []) getArgs
+ argList <- interpret (target context (Cabal Setup stage) [] []) getArgs
trackArgsHash (target context (Cabal Flags stage) [] [])
trackArgsHash (target context (Cabal Setup stage) [] [])
verbosity <- getVerbosity
diff --git a/hadrian/src/Settings.hs b/hadrian/src/Settings.hs
index fd44af1916..d3de77f9bc 100755
--- a/hadrian/src/Settings.hs
+++ b/hadrian/src/Settings.hs
@@ -1,7 +1,7 @@
{-# LANGUAGE TupleSections #-}
module Settings (
- getArgs, getLibraryWays, getRtsWays, flavour, knownPackages,
+ getExtraArgs, getArgs, getLibraryWays, getRtsWays, flavour, knownPackages,
findPackageByName, unsafeFindPackageByName, unsafeFindPackageByPath,
isLibrary, stagePackages, getBignumBackend, getBignumCheck, completeSetting
) where
@@ -25,8 +25,11 @@ import Settings.Flavours.Validate
import Settings.Flavours.Release
+getExtraArgs :: Args
+getExtraArgs = expr flavour >>= extraArgs
+
getArgs :: Args
-getArgs = expr flavour >>= args
+getArgs = mconcat [ defaultBuilderArgs, getExtraArgs, defaultPackageArgs ]
getLibraryWays :: Ways
getLibraryWays = expr flavour >>= libraryWays
diff --git a/hadrian/src/Settings/Builders/Ghc.hs b/hadrian/src/Settings/Builders/Ghc.hs
index aa243db30c..947172ecb8 100644
--- a/hadrian/src/Settings/Builders/Ghc.hs
+++ b/hadrian/src/Settings/Builders/Ghc.hs
@@ -39,6 +39,7 @@ toolArgs = do
, map ("-optc" ++) <$> getStagedSettingList ConfCcArgs
, map ("-optP" ++) <$> getStagedSettingList ConfCppArgs
, map ("-optP" ++) <$> getContextData cppOpts
+ , getContextData hcOpts
]
compileAndLinkHs :: Args
@@ -228,6 +229,8 @@ commonGhcArgs = do
-- input hash to avoid superfluous recompilation, avoiding
-- #18672.
arg "-fdiagnostics-color=always"
+ -- Important this is last.. as these options can override the default options
+ , getContextData hcOpts
]
-- TODO: Do '-ticky' in all debug ways?
diff --git a/hadrian/src/Settings/Default.hs b/hadrian/src/Settings/Default.hs
index 55e56b2212..378fc27a94 100644
--- a/hadrian/src/Settings/Default.hs
+++ b/hadrian/src/Settings/Default.hs
@@ -7,7 +7,7 @@ module Settings.Default (
-- * Default command line arguments for various builders
SourceArgs (..), sourceArgs, defaultBuilderArgs, defaultPackageArgs,
- defaultArgs,
+ defaultExtraArgs,
-- * Default build flavour and BigNum backend
defaultFlavour, defaultBignumBackend
@@ -210,7 +210,6 @@ data SourceArgs = SourceArgs
sourceArgs :: SourceArgs -> Args
sourceArgs SourceArgs {..} = builder Ghc ? mconcat
[ hsDefault
- , getContextData hcOpts
-- `compiler` is also a library but the specific arguments that we want
-- to apply to that are given by the hsCompiler option. `ghc` is an
-- executable so we don't have to exclude that.
@@ -219,11 +218,8 @@ sourceArgs SourceArgs {..} = builder Ghc ? mconcat
, package ghc ? hsGhc ]
-- | All default command line arguments.
-defaultArgs :: Args
-defaultArgs = mconcat
- [ defaultBuilderArgs
- , sourceArgs defaultSourceArgs
- , defaultPackageArgs ]
+defaultExtraArgs :: Args
+defaultExtraArgs = sourceArgs defaultSourceArgs
-- | Default source arguments, e.g. optimisation settings.
defaultSourceArgs :: SourceArgs
@@ -241,7 +237,7 @@ defaultSourceArgs = SourceArgs
defaultFlavour :: Flavour
defaultFlavour = Flavour
{ name = "default"
- , args = defaultArgs
+ , extraArgs = defaultExtraArgs
, packages = defaultPackages
, bignumBackend = defaultBignumBackend
, bignumCheck = False
diff --git a/hadrian/src/Settings/Default.hs-boot b/hadrian/src/Settings/Default.hs-boot
index da5fb27b50..d2774be72d 100644
--- a/hadrian/src/Settings/Default.hs-boot
+++ b/hadrian/src/Settings/Default.hs-boot
@@ -1,6 +1,6 @@
module Settings.Default (
SourceArgs (..), sourceArgs, defaultBuilderArgs, defaultPackageArgs,
- defaultArgs, defaultLibraryWays, defaultRtsWays,
+ defaultExtraArgs, defaultLibraryWays, defaultRtsWays,
defaultFlavour, defaultBignumBackend
) where
@@ -15,7 +15,7 @@ data SourceArgs = SourceArgs
sourceArgs :: SourceArgs -> Args
-defaultBuilderArgs, defaultPackageArgs, defaultArgs :: Args
+defaultBuilderArgs, defaultPackageArgs, defaultExtraArgs :: Args
defaultLibraryWays, defaultRtsWays :: Ways
defaultFlavour :: Flavour
defaultBignumBackend :: String
diff --git a/hadrian/src/Settings/Flavours/Benchmark.hs b/hadrian/src/Settings/Flavours/Benchmark.hs
index 3715e6505d..7ae8b4b160 100644
--- a/hadrian/src/Settings/Flavours/Benchmark.hs
+++ b/hadrian/src/Settings/Flavours/Benchmark.hs
@@ -10,7 +10,7 @@ import {-# SOURCE #-} Settings.Default
benchmarkFlavour :: Flavour
benchmarkFlavour = defaultFlavour
{ name = "bench"
- , args = defaultBuilderArgs <> benchmarkArgs <> defaultPackageArgs
+ , extraArgs = benchmarkArgs
, libraryWays = pure $ Set.fromList [vanilla]
, rtsWays = Set.fromList <$> mconcat [pure [vanilla], targetSupportsThreadedRts ? pure [threaded]] }
diff --git a/hadrian/src/Settings/Flavours/Development.hs b/hadrian/src/Settings/Flavours/Development.hs
index c710d8855f..5a7a3cbfee 100644
--- a/hadrian/src/Settings/Flavours/Development.hs
+++ b/hadrian/src/Settings/Flavours/Development.hs
@@ -12,7 +12,7 @@ import {-# SOURCE #-} Settings.Default
developmentFlavour :: Stage -> Flavour
developmentFlavour ghcStage = defaultFlavour
{ name = "devel" ++ stageString ghcStage
- , args = defaultBuilderArgs <> developmentArgs ghcStage <> defaultPackageArgs
+ , extraArgs = developmentArgs ghcStage
, libraryWays = pure $ Set.fromList [vanilla]
, rtsWays = Set.fromList <$> mconcat [pure [vanilla, debug], targetSupportsThreadedRts ? pure [threaded, threadedDebug]]
, dynamicGhcPrograms = return False
diff --git a/hadrian/src/Settings/Flavours/GhcInGhci.hs b/hadrian/src/Settings/Flavours/GhcInGhci.hs
index fc956518f9..b2fb5d4806 100644
--- a/hadrian/src/Settings/Flavours/GhcInGhci.hs
+++ b/hadrian/src/Settings/Flavours/GhcInGhci.hs
@@ -11,7 +11,7 @@ import {-# SOURCE #-} Settings.Default
ghcInGhciFlavour :: Flavour
ghcInGhciFlavour = defaultFlavour
{ name = "ghc-in-ghci"
- , args = defaultBuilderArgs <> ghciArgs <> defaultPackageArgs
+ , extraArgs = ghciArgs
-- We can't build DLLs on Windows (yet). Actually we should only
-- include the dynamic way when we have a dynamic host GHC, but just
-- checking for Windows seems simpler for now.
diff --git a/hadrian/src/Settings/Flavours/Performance.hs b/hadrian/src/Settings/Flavours/Performance.hs
index a856bc9d17..c4ad7b65d3 100644
--- a/hadrian/src/Settings/Flavours/Performance.hs
+++ b/hadrian/src/Settings/Flavours/Performance.hs
@@ -8,7 +8,7 @@ import {-# SOURCE #-} Settings.Default
performanceFlavour :: Flavour
performanceFlavour = splitSections $ defaultFlavour
{ name = "perf"
- , args = defaultBuilderArgs <> performanceArgs <> defaultPackageArgs }
+ , extraArgs = performanceArgs }
performanceArgs :: Args
performanceArgs = sourceArgs SourceArgs
diff --git a/hadrian/src/Settings/Flavours/Quick.hs b/hadrian/src/Settings/Flavours/Quick.hs
index 6df22c5712..fe804240a0 100644
--- a/hadrian/src/Settings/Flavours/Quick.hs
+++ b/hadrian/src/Settings/Flavours/Quick.hs
@@ -15,7 +15,7 @@ import {-# SOURCE #-} Settings.Default
quickFlavour :: Flavour
quickFlavour = defaultFlavour
{ name = "quick"
- , args = defaultBuilderArgs <> quickArgs <> defaultPackageArgs
+ , extraArgs = quickArgs
, libraryWays = Set.fromList <$>
mconcat
[ pure [vanilla]
diff --git a/hadrian/src/Settings/Flavours/QuickCross.hs b/hadrian/src/Settings/Flavours/QuickCross.hs
index 152a3c5641..036301aae0 100644
--- a/hadrian/src/Settings/Flavours/QuickCross.hs
+++ b/hadrian/src/Settings/Flavours/QuickCross.hs
@@ -11,7 +11,7 @@ import {-# SOURCE #-} Settings.Default
quickCrossFlavour :: Flavour
quickCrossFlavour = defaultFlavour
{ name = "quick-cross"
- , args = defaultBuilderArgs <> quickCrossArgs <> defaultPackageArgs
+ , extraArgs = quickCrossArgs
, dynamicGhcPrograms = pure False
, libraryWays = Set.fromList <$>
mconcat
diff --git a/hadrian/src/Settings/Flavours/Quickest.hs b/hadrian/src/Settings/Flavours/Quickest.hs
index 318e7c8359..9eed80116b 100644
--- a/hadrian/src/Settings/Flavours/Quickest.hs
+++ b/hadrian/src/Settings/Flavours/Quickest.hs
@@ -11,7 +11,7 @@ import {-# SOURCE #-} Settings.Default
quickestFlavour :: Flavour
quickestFlavour = defaultFlavour
{ name = "quickest"
- , args = defaultBuilderArgs <> quickestArgs <> defaultPackageArgs
+ , extraArgs = quickestArgs
, libraryWays = pure (Set.fromList [vanilla])
, rtsWays = pure (Set.fromList [vanilla]) <> (targetSupportsThreadedRts ? pure (Set.fromList [threaded]))
, dynamicGhcPrograms = return False }
diff --git a/hadrian/src/Settings/Flavours/Validate.hs b/hadrian/src/Settings/Flavours/Validate.hs
index f70e33cb98..493645b072 100644
--- a/hadrian/src/Settings/Flavours/Validate.hs
+++ b/hadrian/src/Settings/Flavours/Validate.hs
@@ -12,7 +12,7 @@ import {-# SOURCE #-} Settings.Default
validateFlavour :: Flavour
validateFlavour = enableLinting $ werror $ defaultFlavour
{ name = "validate"
- , args = defaultBuilderArgs <> validateArgs <> defaultPackageArgs
+ , extraArgs = validateArgs
, libraryWays = Set.fromList <$>
mconcat [ pure [vanilla]
, notStage0 ? platformSupportsSharedLibs ? pure [dynamic]
@@ -60,4 +60,4 @@ quickValidateArgs = sourceArgs SourceArgs
quickValidateFlavour :: Flavour
quickValidateFlavour = werror $ validateFlavour
{ name = "quick-validate"
- , args = defaultBuilderArgs <> quickValidateArgs <> defaultPackageArgs }
+ , extraArgs = quickValidateArgs }