diff --git a/Cabal/Distribution/Simple/Program/Types.hs b/Cabal/Distribution/Simple/Program/Types.hs index 6eb0695017b..d96034b2fb5 100644 --- a/Cabal/Distribution/Simple/Program/Types.hs +++ b/Cabal/Distribution/Simple/Program/Types.hs @@ -38,6 +38,7 @@ module Distribution.Simple.Program.Types ( import Prelude () import Distribution.Compat.Prelude +import Distribution.PackageDescription import Distribution.Simple.Program.Find import Distribution.Version import Distribution.Verbosity @@ -74,10 +75,14 @@ data Program = Program { -- | A function to do any additional configuration after we have -- located the program (and perhaps identified its version). For example -- it could add args, or environment vars. - programPostConf :: Verbosity -> ConfiguredProgram -> IO ConfiguredProgram + programPostConf :: Verbosity -> ConfiguredProgram -> IO ConfiguredProgram, + -- | A function that filters any arguments that don't impact the output + -- from a commandline. Used to limit the volatility of dependency hashes + -- when using new-build. + programNormaliseArgs :: Maybe Version -> PackageDescription -> [String] -> [String] } instance Show Program where - show (Program name _ _ _) = "Program: " ++ name + show (Program name _ _ _ _) = "Program: " ++ name type ProgArg = String @@ -161,7 +166,8 @@ simpleProgram name = Program { programName = name, programFindLocation = \v p -> findProgramOnSearchPath v p name, programFindVersion = \_ _ -> return Nothing, - programPostConf = \_ p -> return p + programPostConf = \_ p -> return p, + programNormaliseArgs = \_ _ -> id } -- | Make a simple 'ConfiguredProgram'. diff --git a/cabal-install/Distribution/Client/ProjectPlanning.hs b/cabal-install/Distribution/Client/ProjectPlanning.hs index e559f62a37b..76e4745bb50 100644 --- a/cabal-install/Distribution/Client/ProjectPlanning.hs +++ b/cabal-install/Distribution/Client/ProjectPlanning.hs @@ -3566,13 +3566,23 @@ packageHashConfigInputs pkgHashStripLibs = elabStripLibs, pkgHashStripExes = elabStripExes, pkgHashDebugInfo = elabDebugInfo, - pkgHashProgramArgs = elabProgramArgs, + pkgHashProgramArgs = Map.mapWithKey lookupFilter elabProgramArgs, pkgHashExtraLibDirs = elabExtraLibDirs, pkgHashExtraFrameworkDirs = elabExtraFrameworkDirs, pkgHashExtraIncludeDirs = elabExtraIncludeDirs, pkgHashProgPrefix = elabProgPrefix, pkgHashProgSuffix = elabProgSuffix } + where + knownProgramDb = addKnownPrograms builtinPrograms pkgConfigCompilerProgs + + lookupFilter :: String -> [String] -> [String] + lookupFilter n flags = case lookupKnownProgram n knownProgramDb of + Just p -> programNormaliseArgs p (getVersion p) elabPkgDescription flags + Nothing -> flags + + getVersion :: Program -> Maybe Version + getVersion p = lookupProgram p knownProgramDb >>= programVersion -- | Given the 'InstalledPackageIndex' for a nix-style package store, and an