@@ -37,6 +37,7 @@ import qualified Distribution.Solver.Modular.WeightedPSQ as W
37
37
38
38
import Distribution.Solver.Types.PackagePath
39
39
import Distribution.Solver.Types.PkgConfigDb (PkgConfigDb , pkgConfigPkgIsPresent )
40
+ import Distribution.Types.UnqualComponentName
40
41
41
42
#ifdef DEBUG_CONFLICT_SETS
42
43
import GHC.Stack (CallStack )
@@ -124,16 +125,16 @@ data PreAssignment = PA PPreAssignment FAssignment SAssignment
124
125
type PPreAssignment = Map QPN MergedPkgDep
125
126
126
127
-- | A dependency on a package, including its DependencyReason.
127
- data PkgDep = PkgDep (DependencyReason QPN ) IsExe QPN CI
128
+ data PkgDep = PkgDep (DependencyReason QPN ) ( Maybe UnqualComponentName ) QPN CI
128
129
129
130
-- | MergedPkgDep records constraints about the instances that can still be
130
131
-- chosen, and in the extreme case fixes a concrete instance. Otherwise, it is a
131
132
-- list of version ranges paired with the goals / variables that introduced
132
133
-- them. It also records whether a package is a build-tool dependency, for use
133
134
-- in log messages.
134
135
data MergedPkgDep =
135
- MergedDepFixed IsExe (DependencyReason QPN ) I
136
- | MergedDepConstrained IsExe [VROrigin ]
136
+ MergedDepFixed ( Maybe UnqualComponentName ) (DependencyReason QPN ) I
137
+ | MergedDepConstrained ( Maybe UnqualComponentName ) [VROrigin ]
137
138
138
139
-- | Version ranges paired with origins.
139
140
type VROrigin = (VR , DependencyReason QPN )
@@ -185,7 +186,7 @@ validate = cata go
185
186
svd <- asks saved -- obtain saved dependencies
186
187
qo <- asks qualifyOptions
187
188
-- obtain dependencies and index-dictated exclusions introduced by the choice
188
- let (PInfo deps _ mfr) = idx ! pn ! i
189
+ let (PInfo deps _ _ mfr) = idx ! pn ! i
189
190
-- qualify the deps in the current scope
190
191
let qdeps = qualifyDeps qo qpn deps
191
192
-- the new active constraints are given by the instance we have chosen,
@@ -328,9 +329,9 @@ extend extSupported langSupported pkgPresent newactives ppa = foldM extendSingle
328
329
extendSingle a (LDep dr (Pkg pn vr)) =
329
330
if pkgPresent pn vr then Right a
330
331
else Left (dependencyReasonToCS dr, MissingPkgconfigPackage pn vr)
331
- extendSingle a (LDep dr (Dep is_exe qpn ci)) =
332
- let mergedDep = M. findWithDefault (MergedDepConstrained ( IsExe False ) [] ) qpn a
333
- in case (\ x -> M. insert qpn x a) <$> merge mergedDep (PkgDep dr is_exe qpn ci) of
332
+ extendSingle a (LDep dr (Dep mExe qpn ci)) =
333
+ let mergedDep = M. findWithDefault (MergedDepConstrained Nothing [] ) qpn a
334
+ in case (\ x -> M. insert qpn x a) <$> merge mergedDep (PkgDep dr mExe qpn ci) of
334
335
Left (c, (d, d')) -> Left (c, ConflictingConstraints d d')
335
336
Right x -> Right x
336
337
@@ -340,8 +341,8 @@ extendWithPackageChoice :: PI QPN
340
341
-> PPreAssignment
341
342
-> Either (ConflictSet , FailReason ) PPreAssignment
342
343
extendWithPackageChoice (PI qpn i) ppa =
343
- let mergedDep = M. findWithDefault (MergedDepConstrained ( IsExe False ) [] ) qpn ppa
344
- newChoice = PkgDep (DependencyReason qpn [] [] ) ( IsExe False ) qpn (Fixed i)
344
+ let mergedDep = M. findWithDefault (MergedDepConstrained Nothing [] ) qpn ppa
345
+ newChoice = PkgDep (DependencyReason qpn [] [] ) Nothing qpn (Fixed i)
345
346
in case (\ x -> M. insert qpn x ppa) <$> merge mergedDep newChoice of
346
347
Left (c, (d, _d')) -> -- Don't include the package choice in the
347
348
-- FailReason, because it is redundant.
@@ -370,46 +371,49 @@ merge ::
370
371
(? loc :: CallStack ) =>
371
372
#endif
372
373
MergedPkgDep -> PkgDep -> Either (ConflictSet , (ConflictingDep , ConflictingDep )) MergedPkgDep
373
- merge (MergedDepFixed is_exe1 vs1 i1) (PkgDep vs2 is_exe2 p ci@ (Fixed i2))
374
- | i1 == i2 = Right $ MergedDepFixed (mergeIsExe is_exe1 is_exe2 ) vs1 i1
374
+ merge (MergedDepFixed mExe1 vs1 i1) (PkgDep vs2 mExe2 p ci@ (Fixed i2))
375
+ | i1 == i2 = Right $ MergedDepFixed (mergeExes mExe1 mExe2 ) vs1 i1
375
376
| otherwise =
376
377
Left ( (CS. union `on` dependencyReasonToCS) vs1 vs2
377
- , ( ConflictingDep vs1 is_exe1 p (Fixed i1)
378
- , ConflictingDep vs2 is_exe2 p ci ) )
378
+ , ( ConflictingDep vs1 mExe1 p (Fixed i1)
379
+ , ConflictingDep vs2 mExe2 p ci ) )
379
380
380
- merge (MergedDepFixed is_exe1 vs1 i@ (I v _)) (PkgDep vs2 is_exe2 p ci@ (Constrained vr))
381
- | checkVR vr v = Right $ MergedDepFixed (mergeIsExe is_exe1 is_exe2 ) vs1 i
381
+ merge (MergedDepFixed mExe1 vs1 i@ (I v _)) (PkgDep vs2 mExe2 p ci@ (Constrained vr))
382
+ | checkVR vr v = Right $ MergedDepFixed (mergeExes mExe1 mExe2 ) vs1 i
382
383
| otherwise =
383
384
Left ( (CS. union `on` dependencyReasonToCS) vs1 vs2
384
- , ( ConflictingDep vs1 is_exe1 p (Fixed i)
385
- , ConflictingDep vs2 is_exe2 p ci ) )
385
+ , ( ConflictingDep vs1 mExe1 p (Fixed i)
386
+ , ConflictingDep vs2 mExe2 p ci ) )
386
387
387
- merge (MergedDepConstrained is_exe1 vrOrigins) (PkgDep vs2 is_exe2 p ci@ (Fixed i@ (I v _))) =
388
+ merge (MergedDepConstrained mExe1 vrOrigins) (PkgDep vs2 mExe2 p ci@ (Fixed i@ (I v _))) =
388
389
go vrOrigins -- I tried "reverse vrOrigins" here, but it seems to slow things down ...
389
390
where
390
391
go :: [VROrigin ] -> Either (ConflictSet , (ConflictingDep , ConflictingDep )) MergedPkgDep
391
- go [] = Right (MergedDepFixed (mergeIsExe is_exe1 is_exe2 ) vs2 i)
392
+ go [] = Right (MergedDepFixed (mergeExes mExe1 mExe2 ) vs2 i)
392
393
go ((vr, vs1) : vros)
393
394
| checkVR vr v = go vros
394
395
| otherwise =
395
396
Left ( (CS. union `on` dependencyReasonToCS) vs1 vs2
396
- , ( ConflictingDep vs1 is_exe1 p (Constrained vr)
397
- , ConflictingDep vs2 is_exe2 p ci ) )
397
+ , ( ConflictingDep vs1 mExe1 p (Constrained vr)
398
+ , ConflictingDep vs2 mExe2 p ci ) )
398
399
399
- merge (MergedDepConstrained is_exe1 vrOrigins) (PkgDep vs2 is_exe2 _ (Constrained vr)) =
400
- Right (MergedDepConstrained (mergeIsExe is_exe1 is_exe2 ) $
400
+ merge (MergedDepConstrained mExe1 vrOrigins) (PkgDep vs2 mExe2 _ (Constrained vr)) =
401
+ Right (MergedDepConstrained (mergeExes mExe1 mExe2 ) $
401
402
402
403
-- TODO: This line appends the new version range, to preserve the order used
403
404
-- before a refactoring. Consider prepending the version range, if there is
404
405
-- no negative performance impact.
405
406
vrOrigins ++ [(vr, vs2)])
406
407
407
- -- TODO: This function isn't correct, because cabal may need to build both libs
408
- -- and exes for a package. The merged value is only used to determine whether to
409
- -- print "(exe)" next to conflicts in log message, though. It should be removed
410
- -- when component-based solving is implemented.
411
- mergeIsExe :: IsExe -> IsExe -> IsExe
412
- mergeIsExe (IsExe ie1) (IsExe ie2) = IsExe (ie1 || ie2)
408
+ -- TODO: This function isn't correct, because cabal may need to build libs
409
+ -- and/or multiple exes for a package. The merged value is only used to
410
+ -- determine whether to print the name of an exe next to conflicts in log
411
+ -- message, though. It should be removed when component-based solving is
412
+ -- implemented.
413
+ mergeExes :: Maybe UnqualComponentName
414
+ -> Maybe UnqualComponentName
415
+ -> Maybe UnqualComponentName
416
+ mergeExes = (<|>)
413
417
414
418
-- | Interface.
415
419
validateTree :: CompilerInfo -> Index -> PkgConfigDb -> Tree d c -> Tree d c
0 commit comments