diff options
author | Matthew Pickering <matthewtpickering@gmail.com> | 2023-04-04 10:52:49 +0100 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2023-05-04 14:58:14 -0400 |
commit | 8cc9a534951d8352c31c9a21f5f91bbf188722b2 (patch) | |
tree | a599c18813ae3b42638af97d135f0913cfc6f900 | |
parent | 8fde4ac84ec7b1ead238cb158bbef48555d12af9 (diff) | |
download | haskell-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.
-rw-r--r-- | hadrian/src/Flavour.hs | 4 | ||||
-rw-r--r-- | hadrian/src/Flavour/Type.hs | 5 | ||||
-rw-r--r-- | hadrian/src/Hadrian/Haskell/Cabal/Parse.hs | 5 | ||||
-rwxr-xr-x | hadrian/src/Settings.hs | 7 | ||||
-rw-r--r-- | hadrian/src/Settings/Builders/Ghc.hs | 3 | ||||
-rw-r--r-- | hadrian/src/Settings/Default.hs | 12 | ||||
-rw-r--r-- | hadrian/src/Settings/Default.hs-boot | 4 | ||||
-rw-r--r-- | hadrian/src/Settings/Flavours/Benchmark.hs | 2 | ||||
-rw-r--r-- | hadrian/src/Settings/Flavours/Development.hs | 2 | ||||
-rw-r--r-- | hadrian/src/Settings/Flavours/GhcInGhci.hs | 2 | ||||
-rw-r--r-- | hadrian/src/Settings/Flavours/Performance.hs | 2 | ||||
-rw-r--r-- | hadrian/src/Settings/Flavours/Quick.hs | 2 | ||||
-rw-r--r-- | hadrian/src/Settings/Flavours/QuickCross.hs | 2 | ||||
-rw-r--r-- | hadrian/src/Settings/Flavours/Quickest.hs | 2 | ||||
-rw-r--r-- | hadrian/src/Settings/Flavours/Validate.hs | 4 |
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 } |