Skip to content

Commit 42938e3

Browse files
committed
Filter build-tool-resolving components to what's needed
I'd like to instead change the solver to route the used components through (baby steps towards per-component solving), rather than reconstruct it post-hoc from the Package Description, but this gets the job done for now.
1 parent e9dee12 commit 42938e3

File tree

1 file changed

+36
-5
lines changed

1 file changed

+36
-5
lines changed

cabal-install/Distribution/Client/ProjectPlanning.hs

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ module Distribution.Client.ProjectPlanning (
5454
import Prelude ()
5555
import Distribution.Client.Compat.Prelude
5656

57-
import Distribution.Client.ProjectPlanning.Types
57+
import Distribution.Client.ProjectPlanning.Types as Ty
5858
import Distribution.Client.PackageHash
5959
import Distribution.Client.RebuildMonad
6060
import Distribution.Client.ProjectConfig
@@ -95,12 +95,14 @@ import Distribution.ModuleName
9595
import Distribution.Package hiding
9696
(InstalledPackageId, installedPackageId)
9797
import Distribution.Types.Dependency
98+
import Distribution.Types.ExeDependency
9899
import Distribution.Types.PkgconfigDependency
99100
import Distribution.Types.UnqualComponentName
100101
import Distribution.System
101102
import qualified Distribution.PackageDescription as Cabal
102103
import qualified Distribution.PackageDescription as PD
103104
import qualified Distribution.PackageDescription.Configuration as PD
105+
import Distribution.Simple.BuildToolDepends
104106
import Distribution.Simple.PackageIndex (InstalledPackageIndex)
105107
import Distribution.Simple.Compiler hiding (Flag)
106108
import qualified Distribution.Simple.GHC as GHC --TODO: [code cleanup] eliminate
@@ -1011,7 +1013,7 @@ planPackages comp platform solver SolverSettings{..}
10111013
-- former we just apply all these flags to all local targets which
10121014
-- is silly. We should check if the flags are appropriate.
10131015
[ LabeledPackageConstraint
1014-
(PackageConstraint (scopeToplevel pkgname)
1016+
(PackageConstraint (scopeToplevel pkgname)
10151017
(PackagePropertyFlags flags))
10161018
ConstraintSourceConfigFlagOrTarget
10171019
| let flags = solverSettingFlagAssignment
@@ -1270,12 +1272,42 @@ elaborateInstallPlan verbosity platform compiler compilerprogdb pkgConfigDB
12701272
compLibDependencies =
12711273
-- concatMap (elaborateLibSolverId mapDep) external_lib_dep_sids
12721274
ordNub (map (\ci -> ConfiguredId (ci_pkgid ci) (ci_id ci)) (cc_includes cc))
1275+
1276+
filterExeMapDep :: SolverId -> [ElaboratedPlanPackage]
1277+
filterExeMapDep = filter go . mapDep
1278+
where
1279+
toolDeps = getAllToolDependencies pd $ Cabal.componentBuildInfo comp
1280+
exeKV :: [(PackageName, Maybe (Set UnqualComponentName))]
1281+
exeKV = map go' toolDeps where
1282+
go' (ExeDependency p n _) = (p, Set.singleton <$> n)
1283+
1284+
-- Nothing means wildcard, the complete subset
1285+
exeMap :: Map PackageName (Maybe (Set UnqualComponentName))
1286+
exeMap = Map.fromListWith mappend exeKV
1287+
1288+
go (InstallPlan.Installed _) = error "unexpected state"
1289+
go (InstallPlan.PreExisting _) = True
1290+
go (InstallPlan.Configured (ElaboratedConfiguredPackage {
1291+
elabPkgSourceId = PackageIdentifier { pkgName, .. },
1292+
elabPkgOrComp,
1293+
..
1294+
})) = case elabPkgOrComp of
1295+
ElabPackage _ -> True
1296+
ElabComponent comp' ->
1297+
case Ty.compSolverName comp' of
1298+
CD.ComponentExe n
1299+
| Just maybeSet <- Map.lookup pkgName exeMap
1300+
-> case maybeSet of
1301+
Nothing -> True -- Wildcard, accept anything
1302+
Just set -> Set.member n set
1303+
_ -> error "unexpected state"
1304+
12731305
compExeDependencies =
12741306
map confInstId
1275-
(concatMap (elaborateExeSolverId mapDep) external_exe_dep_sids) ++
1307+
(concatMap (elaborateExeSolverId filterExeMapDep) external_exe_dep_sids) ++
12761308
cc_internal_build_tools cc
12771309
compExeDependencyPaths =
1278-
concatMap (elaborateExePath mapDep) external_exe_dep_sids ++
1310+
concatMap (elaborateExePath filterExeMapDep) external_exe_dep_sids ++
12791311
[ path
12801312
| cid' <- cc_internal_build_tools cc
12811313
, Just path <- [Map.lookup cid' exe_map]]
@@ -2963,4 +2995,3 @@ improveInstallPlanWithInstalledPackages installedPkgIdSet =
29632995

29642996
--TODO: decide what to do if we encounter broken installed packages,
29652997
-- since overwriting is never safe.
2966-

0 commit comments

Comments
 (0)