From a42643c2eee5c8e1246b33d6f9d47b632a09bfae Mon Sep 17 00:00:00 2001 From: PaleRoses Date: Wed, 14 Oct 2026 23:57:46 -0700 Subject: [PATCH] Drop elabGPkgDescription from the elaborated plan Every unit carried its package's GenericPackageDescription, so the plan caches grew with the square of a package's component count. The in-library configure now reads it from the package's .cabal file, as a Setup script does. Fixes #12463. Co-Authored-By: Claude Opus 5.5 --- .../src/Distribution/Client/InLibrary.hs | 17 ++++++++--------- .../src/Distribution/Client/ProjectPlanning.hs | 1 - .../Client/ProjectPlanning/Types.hs | 2 -- changelog.d/plan-cache-gpkg-description.md | 9 +++++++++ 4 files changed, 17 insertions(+), 12 deletions(-) create mode 100644 changelog.d/plan-cache-gpkg-description.md diff --git a/cabal-install/src/Distribution/Client/InLibrary.hs b/cabal-install/src/Distribution/Client/InLibrary.hs index bda360b455b..acda3269700 100644 --- a/cabal-install/src/Distribution/Client/InLibrary.hs +++ b/cabal-install/src/Distribution/Client/InLibrary.hs @@ -30,6 +30,7 @@ import qualified Distribution.Simple.Configure as Cabal import Distribution.Simple.Haddock (haddock_setupHooks) import Distribution.Simple.Install (install_setupHooks) import Distribution.Simple.LocalBuildInfo (mbWorkDirLBI) +import Distribution.Simple.PackageDescription (readGenericPackageDescription) import Distribution.Simple.PackageIndex (InstalledPackageIndex) import qualified Distribution.Simple.PreProcess as Cabal import Distribution.Simple.Program.Db @@ -67,7 +68,6 @@ data LibraryConfigureInputs = LibraryConfigureInputs , localBuildConfig :: LBC.LocalBuildConfig , packageDBStack :: PackageDBStackCWD , packageDescription :: PD.PackageDescription - , gPackageDescription :: PD.GenericPackageDescription , flagAssignment :: PD.FlagAssignment , installedPkgIndex :: InstalledPackageIndex } @@ -121,13 +121,11 @@ libraryConfigureInputsFromElabPackage } , packageDBStack = elabBuildPackageDBStack pkg , packageDescription = pkgDescr - , gPackageDescription = gpkgDescr , flagAssignment = elabFlagAssignment pkg , installedPkgIndex = ipi } where pkgDescr = elabPkgDescription pkg - gpkgDescr = elabGPkgDescription pkg configure :: LibraryConfigureInputs @@ -143,7 +141,6 @@ configure , localBuildConfig = lbc0 , packageDBStack = packageDBs , packageDescription = pkgDescr - , gPackageDescription = gpkgDescr , flagAssignment = flagAssgn , installedPkgIndex = ipi } @@ -196,6 +193,13 @@ configure , benchmarksRequested = Cabal.fromFlag (Cabal.configBenchmarks cfg) } + -- Read the .cabal file, as a Setup script would; the plan does not carry it. + pkgDescrFilePath <- + case Cabal.flagToMaybe $ Cabal.configCabalFilePath cfg of + Just pkgFile -> return pkgFile + Nothing -> relativeSymbolicPath <$> tryFindPackageDesc verbosity mbWorkDir + gpkgDescr <- readGenericPackageDescription verbosity mbWorkDir pkgDescrFilePath + -- NB: it's OK to discard constraints here: we already have a finalized PackageDescription -- in hand, and we are using exact UnitIds for all dependencies (this corresponds -- to using --exact-configuration and --dependency flags with the Setup CLI). @@ -223,11 +227,6 @@ configure packageDBs' pkgInfo - -- Remember the .cabal filename if we know it. - pkgDescrFilePath <- - case Cabal.flagToMaybe $ Cabal.configCabalFilePath cfg of - Just pkgFile -> return pkgFile - Nothing -> relativeSymbolicPath <$> tryFindPackageDesc verbosity mbWorkDir return $ lbi1{pkgDescrFile = Just pkgDescrFilePath} -------------------------------------------------------------------------------- diff --git a/cabal-install/src/Distribution/Client/ProjectPlanning.hs b/cabal-install/src/Distribution/Client/ProjectPlanning.hs index da185e990c0..f0767e8e302 100644 --- a/cabal-install/src/Distribution/Client/ProjectPlanning.hs +++ b/cabal-install/src/Distribution/Client/ProjectPlanning.hs @@ -2284,7 +2284,6 @@ elaborateInstallPlan gdesc of Right (desc, _) -> desc Left _ -> error "Failed to finalizePD in elaborateSolverToCommon" - elabGPkgDescription = gdesc elabFlagAssignment = flags elabFlagDefaults = PD.mkFlagAssignment diff --git a/cabal-install/src/Distribution/Client/ProjectPlanning/Types.hs b/cabal-install/src/Distribution/Client/ProjectPlanning/Types.hs index 67e10c46813..099ff4398dc 100644 --- a/cabal-install/src/Distribution/Client/ProjectPlanning/Types.hs +++ b/cabal-install/src/Distribution/Client/ProjectPlanning/Types.hs @@ -221,8 +221,6 @@ data ElaboratedConfiguredPackage = ElaboratedConfiguredPackage , elabFlagDefaults :: Cabal.FlagAssignment -- ^ The original default flag assignment, used only for reporting. , elabPkgDescription :: Cabal.PackageDescription - , elabGPkgDescription :: Cabal.GenericPackageDescription - -- ^ Original 'GenericPackageDescription' (just used to report errors/warnings) , elabPkgSourceLocation :: PackageLocation (Maybe FilePath) -- ^ Where the package comes from, e.g. tarball, local dir etc. This -- is not the same as where it may be unpacked to for the build. diff --git a/changelog.d/plan-cache-gpkg-description.md b/changelog.d/plan-cache-gpkg-description.md new file mode 100644 index 00000000000..31ec9919ada --- /dev/null +++ b/changelog.d/plan-cache-gpkg-description.md @@ -0,0 +1,9 @@ +--- +synopsis: Plan caches no longer hold a GenericPackageDescription per component +packages: [cabal-install] +prs: 12464 +issues: 12463 +--- + +The in-library configure reads it from the package's `.cabal` file. With 80 public +sublibraries, `improved-plan` falls from 27 MB to 15 MB.