Skip to content

Commit 2f7722e

Browse files
mpickeringTeofilC
authored andcommitted
wip: Add constraint form for a precise unit-id
1 parent 2e30cb8 commit 2f7722e

File tree

6 files changed

+32
-3
lines changed

6 files changed

+32
-3
lines changed

cabal-install-solver/src/Distribution/Solver/Modular/Message.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,7 @@ showFR _ UnknownPackage = " (unknown package)"
295295
showFR _ (GlobalConstraintVersion vr (ConstraintSourceProjectConfig pc)) = '\n' : (render . nest 6 $ docProjectConfigPathFailReason vr pc)
296296
showFR _ (GlobalConstraintVersion vr src) = " (" ++ constraintSource src ++ " requires " ++ prettyShow vr ++ ")"
297297
showFR _ (GlobalConstraintInstalled src) = " (" ++ constraintSource src ++ " requires installed instance)"
298+
showFR _ (GlobalConstraintInstalledSpecificUnitId unitId src) = " (" ++ constraintSource src ++ " requires installed instance with unit id " ++ prettyShow unitId ++ ")"
298299
showFR _ (GlobalConstraintSource src) = " (" ++ constraintSource src ++ " requires source instance)"
299300
showFR _ (GlobalConstraintFlag src) = " (" ++ constraintSource src ++ " requires opposite flag selection)"
300301
showFR _ ManualFlag = " (manual flag can only be changed explicitly)"

cabal-install-solver/src/Distribution/Solver/Modular/Package.hs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ module Distribution.Solver.Modular.Package
1010
, PN
1111
, QPV
1212
, instI
13+
, instUid
1314
, makeIndependent
1415
, primaryPP
1516
, setupPP
@@ -77,6 +78,10 @@ instI :: I -> Bool
7778
instI (I _ (Inst _)) = True
7879
instI _ = False
7980

81+
instUid :: UnitId -> I -> Bool
82+
instUid uid (I _ (Inst uid')) = uid == uid'
83+
instUid _ _ = False
84+
8085
-- | Is the package in the primary group of packages. This is used to
8186
-- determine (1) if we should try to establish stanza preferences
8287
-- for this goal, and (2) whether or not a user specified @--constraint@

cabal-install-solver/src/Distribution/Solver/Modular/Preference.hs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,9 @@ processPackageConstraintP qpn c i (LabeledPackageConstraint (PackageConstraint s
190190
go _ PackagePropertyInstalled
191191
| instI i = r
192192
| otherwise = Fail c (GlobalConstraintInstalled src)
193+
go _ (PackagePropertyInstalledSpecificUnitId unitId)
194+
| instUid unitId i = r
195+
| otherwise = Fail c (GlobalConstraintInstalledSpecificUnitId unitId src)
193196
go _ PackagePropertySource
194197
| not (instI i) = r
195198
| otherwise = Fail c (GlobalConstraintSource src)

cabal-install-solver/src/Distribution/Solver/Modular/Tree.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ data FailReason = UnsupportedExtension Extension
118118
| UnknownPackage
119119
| GlobalConstraintVersion VR ConstraintSource
120120
| GlobalConstraintInstalled ConstraintSource
121+
| GlobalConstraintInstalledSpecificUnitId UnitId ConstraintSource
121122
| GlobalConstraintSource ConstraintSource
122123
| GlobalConstraintFlag ConstraintSource
123124
| ManualFlag

cabal-install-solver/src/Distribution/Solver/Types/PackageConstraint.hs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ module Distribution.Solver.Types.PackageConstraint (
1919
import Distribution.Solver.Compat.Prelude
2020
import Prelude ()
2121

22-
import Distribution.Package (PackageName)
22+
import Distribution.Package (PackageName, UnitId)
2323
import Distribution.PackageDescription (FlagAssignment, dispFlagAssignment)
2424
import Distribution.Pretty (flatStyle, Pretty(pretty))
2525
import Distribution.Types.PackageVersionConstraint (PackageVersionConstraint (..))
@@ -90,6 +90,7 @@ instance Pretty ConstraintScope where
9090
data PackageProperty
9191
= PackagePropertyVersion VersionRange
9292
| PackagePropertyInstalled
93+
| PackagePropertyInstalledSpecificUnitId UnitId
9394
| PackagePropertySource
9495
| PackagePropertyFlags FlagAssignment
9596
| PackagePropertyStanzas [OptionalStanza]
@@ -101,6 +102,7 @@ instance Structured PackageProperty
101102
instance Pretty PackageProperty where
102103
pretty (PackagePropertyVersion verrange) = pretty verrange
103104
pretty PackagePropertyInstalled = Disp.text "installed"
105+
pretty (PackagePropertyInstalledSpecificUnitId unitId) = Disp.text "installed(" <> pretty unitId <> Disp.text ")"
104106
pretty PackagePropertySource = Disp.text "source"
105107
pretty (PackagePropertyFlags flags) = dispFlagAssignment flags
106108
pretty (PackagePropertyStanzas stanzas) =
@@ -138,6 +140,7 @@ packageConstraintToDependency (PackageConstraint scope prop) = toDep prop
138140
where
139141
toDep (PackagePropertyVersion vr) = Just $ PackageVersionConstraint (scopeToPackageName scope) vr
140142
toDep (PackagePropertyInstalled) = Nothing
143+
toDep (PackagePropertyInstalledSpecificUnitId {}) = Nothing
141144
toDep (PackagePropertySource) = Nothing
142145
toDep (PackagePropertyFlags _) = Nothing
143146
toDep (PackagePropertyStanzas _) = Nothing

cabal-install/src/Distribution/Client/Dependency.hs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ import Distribution.Client.Utils
9898
import qualified Distribution.Compat.Graph as Graph
9999
import Distribution.Compiler
100100
( CompilerInfo (..)
101+
, AbiTag (..)
101102
)
102103
import Distribution.Package
103104
( Package (..)
@@ -107,6 +108,8 @@ import Distribution.Package
107108
, mkPackageName
108109
, packageName
109110
, packageVersion
111+
, UnitId
112+
, mkUnitId
110113
)
111114
import qualified Distribution.PackageDescription as PD
112115
import Distribution.PackageDescription.Configuration
@@ -435,6 +438,19 @@ setSolverVerbosity verbosity params =
435438
{ depResolverVerbosity = verbosity
436439
}
437440

441+
dependOnSpecificCompiler :: CompilerInfo -> DepResolverParams -> DepResolverParams
442+
dependOnSpecificCompiler compiler params = addConstraints extraConstraints params
443+
where
444+
extraConstraints =
445+
[ LabeledPackageConstraint
446+
(PackageConstraint (ScopeAnyQualifier (mkPackageName "ghc")) (PackagePropertyInstalledSpecificUnitId (compilerIdToUnitId ghc_lib_abi)))
447+
ConstraintSourceNonReinstallablePackage
448+
| AbiTag ghc_lib_abi <- [compilerInfoAbiTag compiler]
449+
]
450+
451+
compilerIdToUnitId :: String -> UnitId
452+
compilerIdToUnitId uid = mkUnitId (prettyShow (compilerInfoId compiler) ++ "-" ++ uid)
453+
438454
-- | Some packages are specific to a given compiler version and should never be
439455
-- reinstalled.
440456
dontInstallNonReinstallablePackages :: DepResolverParams -> DepResolverParams
@@ -841,8 +857,8 @@ resolveDependencies platform comp pkgConfigDB params =
841857
verbosity
842858
) =
843859
if asBool (depResolverAllowBootLibInstalls params)
844-
then params
845-
else dontInstallNonReinstallablePackages params
860+
then dependOnSpecificCompiler comp params
861+
else dontInstallNonReinstallablePackages (dependOnSpecificCompiler comp params)
846862

847863
preferences :: PackageName -> PackagePreferences
848864
preferences = interpretPackagesPreference targets defpref prefs

0 commit comments

Comments
 (0)