From 3ff1bf0028085f5bf3ff9dab1aa7b1dcd5b7b033 Mon Sep 17 00:00:00 2001 From: Andrea Bedini Date: Mon, 3 Aug 2026 15:25:50 +0800 Subject: [PATCH] cabal-install: only add base>=4.22 constraint with wired-in unit ids `dependOnWiredIns` adds two kinds of constraint: one installed-unit-id constraint per wired-in unit of the compiler, and one `base >= 4.22` version constraint. The second only makes sense next to the first. The unit-id constraints pin the new, reinstallable `base`; the version constraint then excludes the old, non-reinstallable one. But it was added unconditionally, while the unit-id constraints are empty for a compiler that reports no wired-in units. Such a compiler has no installed `base` satisfying the bound, so plans that reach this code fail, and `--allow-boot-library-installs` alone is enough to reach it. Fixes #12328. --- cabal-install/src/Distribution/Client/Dependency.hs | 9 ++++++--- .../UnitTests/Distribution/Solver/Modular/Solver.hs | 7 +++++++ changelog.d/base-422-wired-in-guard.md | 10 ++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 changelog.d/base-422-wired-in-guard.md diff --git a/cabal-install/src/Distribution/Client/Dependency.hs b/cabal-install/src/Distribution/Client/Dependency.hs index afc77c032aa..04815cea7d5 100644 --- a/cabal-install/src/Distribution/Client/Dependency.hs +++ b/cabal-install/src/Distribution/Client/Dependency.hs @@ -445,13 +445,16 @@ setSolverVerbosity verbosity params = } dependOnWiredIns :: CompilerInfo -> DepResolverParams -> DepResolverParams -dependOnWiredIns compiler params = addConstraints extraConstraints params +dependOnWiredIns compiler params = + case compilerInfoWiredInUnitIds compiler of + Nothing -> params + Just wiredInUnitIds -> addConstraints (extraConstraints wiredInUnitIds) params where - extraConstraints = + extraConstraints wiredInUnitIds = [ LabeledPackageConstraint (PackageConstraint (ScopeAnyQualifier pkgName) (PackagePropertyInstalledSpecificUnitId unitId)) ConstraintSourceNonReinstallablePackage - | (pkgName, unitId) <- fromMaybe [] $ compilerInfoWiredInUnitIds compiler + | (pkgName, unitId) <- wiredInUnitIds ] ++ -- Old versions of `base` must be excluded from build plans still as they do not depend on any version of a wired-in unit. diff --git a/cabal-install/tests/UnitTests/Distribution/Solver/Modular/Solver.hs b/cabal-install/tests/UnitTests/Distribution/Solver/Modular/Solver.hs index d76928e982f..cdacc2ee44b 100644 --- a/cabal-install/tests/UnitTests/Distribution/Solver/Modular/Solver.hs +++ b/cabal-install/tests/UnitTests/Distribution/Solver/Modular/Solver.hs @@ -218,6 +218,13 @@ tests = allowBootLibInstalls $ mkTest dbBase "Install base with --allow-boot-library-installs" ["base"] $ solverSuccess [("base", 5), ("ghc-prim", 1), ("integer-gmp", 1), ("integer-simple", 1)] + , -- The base >= 4.22 constraint only makes sense alongside the wired-in + -- unit id constraints. A compiler that reports none has no installed + -- base satisfying it, so it must not be added here. + runTest $ + allowBootLibInstalls $ + mkTest dbBaseOld "Install old base with --allow-boot-library-installs" ["base"] $ + solverSuccess [("base", 1)] ] , testGroup "Reinstallable base, template-haskell, but not ghc{,-internal} (GHC with wiredInUnitIds)" diff --git a/changelog.d/base-422-wired-in-guard.md b/changelog.d/base-422-wired-in-guard.md new file mode 100644 index 00000000000..cdcb654fd59 --- /dev/null +++ b/changelog.d/base-422-wired-in-guard.md @@ -0,0 +1,10 @@ +--- +synopsis: Fix `--allow-boot-library-installs` on GHC < 9.14 +packages: [cabal-install] +prs: 12301 +issues: 12328 +--- + +`--allow-boot-library-installs` made builds fail on compilers that report no +wired-in unit ids, because `base` was constrained to version 4.22 or later +regardless of the compiler.