Skip to content

Commit

Permalink
Look for transitive setup dependency on Cabal when choosing Cabal spe…
Browse files Browse the repository at this point in the history
…c version.

Fixes #4288.

Previously, new-build only looked for a direct dependency on Cabal when choosing
the spec version to use for running the setup script.  When the setup script
only had a transitive dependency on Cabal, cabal used the package's
cabal-version field, which could easily differ from the actual Cabal
dependency's version.  Then cabal could pass flags to the setup script that
weren't recognized by the Cabal dependency.

This commit considers any setup dependency on Cabal when choosing the Cabal spec
version.
  • Loading branch information
grayjay committed Feb 26, 2018
1 parent 791086b commit ea01b9d
Showing 1 changed file with 19 additions and 20 deletions.
39 changes: 19 additions & 20 deletions cabal-install/Distribution/Client/ProjectPlanning.hs
Original file line number Diff line number Diff line change
Expand Up @@ -1210,7 +1210,7 @@ elaborateInstallPlan verbosity platform compiler compilerprogdb pkgConfigDB
if null not_per_component_reasons
then return comps
else do checkPerPackageOk comps not_per_component_reasons
return [elaborateSolverToPackage mapDep spkg g $
return [elaborateSolverToPackage spkg g $
comps ++ maybeToList setupComponent]
Left cns ->
dieProgress $
Expand Down Expand Up @@ -1276,7 +1276,7 @@ elaborateInstallPlan verbosity platform compiler compilerprogdb pkgConfigDB
fsep (punctuate comma reasons)
-- TODO: Maybe exclude Backpack too

elab0 = elaborateSolverToCommon mapDep spkg
elab0 = elaborateSolverToCommon spkg
pkgid = elabPkgSourceId elab0
pd = elabPkgDescription elab0

Expand Down Expand Up @@ -1501,13 +1501,11 @@ elaborateInstallPlan verbosity platform compiler compilerprogdb pkgConfigDB
Just (Just n) -> display n
_ -> ""

elaborateSolverToPackage :: (SolverId -> [ElaboratedPlanPackage])
-> SolverPackage UnresolvedPkgLoc
elaborateSolverToPackage :: SolverPackage UnresolvedPkgLoc
-> ComponentsGraph
-> [ElaboratedConfiguredPackage]
-> ElaboratedConfiguredPackage
elaborateSolverToPackage
mapDep
pkg@(SolverPackage (SourcePackage pkgid _gdesc _srcloc _descOverride)
_flags _stanzas _deps0 _exe_deps0)
compGraph comps =
Expand All @@ -1516,7 +1514,7 @@ elaborateInstallPlan verbosity platform compiler compilerprogdb pkgConfigDB
-- of the other fields of the elaboratedPackage.
elab
where
elab0@ElaboratedConfiguredPackage{..} = elaborateSolverToCommon mapDep pkg
elab0@ElaboratedConfiguredPackage{..} = elaborateSolverToCommon pkg
elab = elab0 {
elabUnitId = newSimpleUnitId pkgInstalledId,
elabComponentId = pkgInstalledId,
Expand Down Expand Up @@ -1613,10 +1611,9 @@ elaborateInstallPlan verbosity platform compiler compilerprogdb pkgConfigDB
(compilerId compiler)
pkgInstalledId

elaborateSolverToCommon :: (SolverId -> [ElaboratedPlanPackage])
-> SolverPackage UnresolvedPkgLoc
elaborateSolverToCommon :: SolverPackage UnresolvedPkgLoc
-> ElaboratedConfiguredPackage
elaborateSolverToCommon mapDep
elaborateSolverToCommon
pkg@(SolverPackage (SourcePackage pkgid gdesc srcloc descOverride)
flags stanzas deps0 _exe_deps0) =
elaboratedPackage
Expand Down Expand Up @@ -1687,10 +1684,9 @@ elaborateInstallPlan verbosity platform compiler compilerprogdb pkgConfigDB
elabRegisterPackageDBStack = buildAndRegisterDbs

elabSetupScriptStyle = packageSetupScriptStyle elabPkgDescription
-- Computing the deps here is a little awful
deps = fmap (concatMap (elaborateLibSolverId mapDep)) deps0
elabSetupScriptCliVersion = packageSetupScriptSpecVersion
elabSetupScriptStyle elabPkgDescription deps
elabSetupScriptCliVersion =
packageSetupScriptSpecVersion
elabSetupScriptStyle elabPkgDescription libDepGraph deps0
elabSetupPackageDBStack = buildAndRegisterDbs

buildAndRegisterDbs
Expand Down Expand Up @@ -2910,31 +2906,34 @@ defaultSetupDeps compiler platform pkg =
-- of what the solver picked for us, based on the explicit setup deps or the
-- ones added implicitly by 'defaultSetupDeps'.
--
packageSetupScriptSpecVersion :: Package pkg
=> SetupScriptStyle
packageSetupScriptSpecVersion :: SetupScriptStyle
-> PD.PackageDescription
-> ComponentDeps [pkg]
-> Graph.Graph NonSetupLibDepSolverPlanPackage
-> ComponentDeps [SolverId]
-> Version

-- We're going to be using the internal Cabal library, so the spec version of
-- that is simply the version of the Cabal library that cabal-install has been
-- built with.
packageSetupScriptSpecVersion SetupNonCustomInternalLib _ _ =
packageSetupScriptSpecVersion SetupNonCustomInternalLib _ _ _ =
cabalVersion

-- If we happen to be building the Cabal lib itself then because that
-- bootstraps itself then we use the version of the lib we're building.
packageSetupScriptSpecVersion SetupCustomImplicitDeps pkg _
packageSetupScriptSpecVersion SetupCustomImplicitDeps pkg _ _
| packageName pkg == cabalPkgname
= packageVersion pkg

-- In all other cases we have a look at what version of the Cabal lib the
-- solver picked. Or if it didn't depend on Cabal at all (which is very rare)
-- then we look at the .cabal file to see what spec version it declares.
packageSetupScriptSpecVersion _ pkg deps =
case find ((cabalPkgname ==) . packageName) (CD.setupDeps deps) of
packageSetupScriptSpecVersion _ pkg libDepGraph deps =
case find ((cabalPkgname ==) . packageName) setupLibDeps of
Just dep -> packageVersion dep
Nothing -> PD.specVersion pkg
where
setupLibDeps = map packageId $ fromMaybe [] $
Graph.closure libDepGraph (CD.setupDeps deps)


cabalPkgname, basePkgname :: PackageName
Expand Down

0 comments on commit ea01b9d

Please sign in to comment.