Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Look for transitive setup dependency on Cabal when choosing Cabal spec version. #5170

Merged
merged 2 commits into from
Mar 8, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not completely sure I calculated the closure of the setup dependencies correctly, since I skipped calling elaborateLibSolverId mapDep. I called CD.setupDeps on deps0 directly, because all setup dependencies are library dependencies.

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
3 changes: 3 additions & 0 deletions cabal-testsuite/PackageTests/NewBuild/T4288/CustomIssue.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module CustomIssue where

f x = x + 1
3 changes: 3 additions & 0 deletions cabal-testsuite/PackageTests/NewBuild/T4288/Setup.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import SetupHelper (setupHelperDefaultMain)

main = setupHelperDefaultMain
16 changes: 16 additions & 0 deletions cabal-testsuite/PackageTests/NewBuild/T4288/T4288.cabal
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
name: T4288
version: 1.0
build-type: Custom

-- cabal-version is lower than the version of Cabal that will be chosen for the
-- setup script.
cabal-version: >=1.10

-- Setup script only has a transitive dependency on Cabal.
custom-setup
setup-depends: base, setup-helper

library
exposed-modules: CustomIssue
build-depends: base
default-language: Haskell2010
1 change: 1 addition & 0 deletions cabal-testsuite/PackageTests/NewBuild/T4288/cabal.project
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
packages: . setup-helper/
17 changes: 17 additions & 0 deletions cabal-testsuite/PackageTests/NewBuild/T4288/cabal.test.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import Test.Cabal.Prelude

-- This test is similar to the simplified example in issue #4288. The package's
-- setup script only depends on base and setup-helper. setup-helper exposes a
-- function that is a wrapper for Cabal's defaultMain (similar to
-- cabal-doctest). This test builds the package to check that the flags passed
-- to the setup script are compatible with the version of Cabal that it depends
-- on, even though Cabal is only a transitive dependency.
main = cabalTest $ do
skipUnless =<< hasNewBuildCompatBootCabal
r <- recordMode DoNotRecord $ cabal' "new-build" ["T4288"]
assertOutputContains "This is setup-helper-1.0." r
assertOutputContains
("In order, the following will be built: "
++ " - setup-helper-1.0 (lib:setup-helper) (first run) "
++ " - T4288-1.0 (lib:T4288) (first run)")
r
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module SetupHelper (setupHelperDefaultMain) where

import Distribution.Simple

setupHelperDefaultMain = putStrLn "This is setup-helper-1.0." >> defaultMain
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
name: setup-helper
version: 1.0
build-type: Simple
cabal-version: >= 1.2

library
exposed-modules: SetupHelper
build-depends: base, Cabal
default-language: Haskell2010