@@ -21,6 +21,7 @@ module Distribution.Solver.Modular.Dependency (
21
21
, FlaggedDeps
22
22
, FlaggedDep (.. )
23
23
, Dep (.. )
24
+ , DepRole (.. )
24
25
, showDep
25
26
, flattenFlaggedDeps
26
27
, QualifyOptions (.. )
@@ -53,6 +54,7 @@ import qualified Data.List as L
53
54
import Language.Haskell.Extension (Extension (.. ), Language (.. ))
54
55
55
56
import Distribution.Text
57
+ import Distribution.Types.UnqualComponentName
56
58
57
59
import Distribution.Solver.Modular.ConflictSet (ConflictSet , ConflictMap )
58
60
import Distribution.Solver.Modular.Flag
@@ -166,8 +168,23 @@ flattenFlaggedDeps = concatMap aux
166
168
type TrueFlaggedDeps qpn = FlaggedDeps Component qpn
167
169
type FalseFlaggedDeps qpn = FlaggedDeps Component qpn
168
170
169
- -- | Is this dependency on an executable
170
- type IsExe = Bool
171
+
172
+ -- | Why do we depend on this package? The role of a dependency package is the
173
+ -- components to be used from that package.
174
+ --
175
+ -- If 'Nothing', then we depend on all executables in the package. If 'Just
176
+ -- name', then we depend on the executable with that name in the package.
177
+ --
178
+ -- TODO: add a similar field for 'Library' if allow depending on named
179
+ -- libraries.
180
+ data DepRole = DRLib
181
+ | DRExe (Maybe UnqualComponentName )
182
+ deriving (Eq , Show )
183
+
184
+ showDepRole :: DepRole -> String
185
+ showDepRole DRLib = " "
186
+ showDepRole (DRExe Nothing ) = " (all exes) "
187
+ showDepRole (DRExe (Just n)) = " (exe: " ++ display n ++ " ) "
171
188
172
189
-- | A dependency (constraint) associates a package name with a
173
190
-- constrained instance.
@@ -176,22 +193,20 @@ type IsExe = Bool
176
193
-- is used both to record the dependencies as well as who's doing the
177
194
-- depending; having a 'Functor' instance makes bugs where we don't distinguish
178
195
-- these two far too likely. (By rights 'Dep' ought to have two type variables.)
179
- data Dep qpn = Dep IsExe qpn (CI qpn ) -- ^ dependency on a package (possibly for executable
196
+ data Dep qpn = Dep DepRole qpn (CI qpn ) -- ^ dependency on a package (possibly for executable
180
197
| Ext Extension -- ^ dependency on a language extension
181
198
| Lang Language -- ^ dependency on a language version
182
199
| Pkg PkgconfigName VR -- ^ dependency on a pkg-config package
183
200
deriving (Eq , Show )
184
201
185
202
showDep :: Dep QPN -> String
186
- showDep (Dep is_exe qpn (Fixed i v) ) =
203
+ showDep (Dep role qpn (Fixed i v) ) =
187
204
(if P qpn /= v then showVar v ++ " => " else " " ) ++
188
- showQPN qpn ++
189
- (if is_exe then " (exe) " else " " ) ++ " ==" ++ showI i
190
- showDep (Dep is_exe qpn (Constrained [(vr, v)])) =
191
- showVar v ++ " => " ++ showQPN qpn ++
192
- (if is_exe then " (exe) " else " " ) ++ showVR vr
193
- showDep (Dep is_exe qpn ci ) =
194
- showQPN qpn ++ (if is_exe then " (exe) " else " " ) ++ showCI ci
205
+ showQPN qpn ++ showDepRole role ++ " ==" ++ showI i
206
+ showDep (Dep role qpn (Constrained [(vr, v)])) =
207
+ showVar v ++ " => " ++ showQPN qpn ++ showDepRole role ++ showVR vr
208
+ showDep (Dep role qpn ci ) =
209
+ showQPN qpn ++ showDepRole role ++ showCI ci
195
210
showDep (Ext ext) = " requires " ++ display ext
196
211
showDep (Lang lang) = " requires " ++ display lang
197
212
showDep (Pkg pn vr) = " requires pkg-config package "
@@ -243,11 +258,12 @@ qualifyDeps QO{..} (Q pp@(PackagePath ns q) pn) = go
243
258
goD (Ext ext) _ = Ext ext
244
259
goD (Lang lang) _ = Lang lang
245
260
goD (Pkg pkn vr) _ = Pkg pkn vr
246
- goD (Dep is_exe dep ci) comp
247
- | is_exe = Dep is_exe (Q (PackagePath ns (QualExe pn dep)) dep) (fmap (Q pp) ci)
248
- | qBase dep = Dep is_exe (Q (PackagePath ns (QualBase pn)) dep) (fmap (Q pp) ci)
249
- | qSetup comp = Dep is_exe (Q (PackagePath ns (QualSetup pn)) dep) (fmap (Q pp) ci)
250
- | otherwise = Dep is_exe (Q (PackagePath ns inheritedQ) dep) (fmap (Q pp) ci)
261
+ goD (Dep role dep ci) comp
262
+ | DRExe _ <- role = goQ $ Q (PackagePath ns (QualExe pn dep)) dep
263
+ | qBase dep = goQ $ Q (PackagePath ns (QualBase pn)) dep
264
+ | qSetup comp = goQ $ Q (PackagePath ns (QualSetup pn)) dep
265
+ | otherwise = goQ $ Q (PackagePath ns inheritedQ) dep
266
+ where goQ qual = Dep role qual (fmap (Q pp) ci)
251
267
252
268
-- If P has a setup dependency on Q, and Q has a regular dependency on R, then
253
269
-- we say that the 'Setup' qualifier is inherited: P has an (indirect) setup
@@ -290,7 +306,7 @@ unqualifyDeps = go
290
306
go1 (Simple dep comp) = Simple (goD dep) comp
291
307
292
308
goD :: Dep QPN -> Dep PN
293
- goD (Dep is_exe qpn ci) = Dep is_exe (unq qpn) (fmap unq ci)
309
+ goD (Dep role qpn ci) = Dep role (unq qpn) (fmap unq ci)
294
310
goD (Ext ext) = Ext ext
295
311
goD (Lang lang) = Lang lang
296
312
goD (Pkg pn vr) = Pkg pn vr
@@ -362,7 +378,7 @@ instance ResetVar CI where
362
378
resetVar v (Constrained vrs) = Constrained (L. map (\ (x, y) -> (x, resetVar v y)) vrs)
363
379
364
380
instance ResetVar Dep where
365
- resetVar v (Dep is_exe qpn ci) = Dep is_exe qpn (resetVar v ci)
381
+ resetVar v (Dep role qpn ci) = Dep role qpn (resetVar v ci)
366
382
resetVar _ (Ext ext) = Ext ext
367
383
resetVar _ (Lang lang) = Lang lang
368
384
resetVar _ (Pkg pn vr) = Pkg pn vr
0 commit comments