@@ -3,7 +3,8 @@ module Distribution.Solver.Modular.IndexConversion
3
3
) where
4
4
5
5
import Data.List as L
6
- import Data.Map as M
6
+ import Data.Map (Map )
7
+ import qualified Data.Map as M
7
8
import Data.Maybe
8
9
import Data.Monoid as Mon
9
10
import Data.Set as S
@@ -245,12 +246,12 @@ flagInfo (StrongFlags strfl) =
245
246
-- dependencies.
246
247
type IPNs = Set PN
247
248
248
- -- | Convenience function to delete a 'FlaggedDep ' if it's
249
+ -- | Convenience function to delete a 'Dependency ' if it's
249
250
-- for a 'PN' that isn't actually real.
250
- filterIPNs :: IPNs -> Dependency -> FlaggedDep PN -> FlaggedDeps PN
251
- filterIPNs ipns (Dependency pn _) fd
252
- | S. notMember pn ipns = [fd]
253
- | otherwise = []
251
+ filterIPNs :: IPNs -> Dependency -> Maybe Dependency
252
+ filterIPNs ipns d @ (Dependency pn _)
253
+ | S. notMember pn ipns = Just d
254
+ | otherwise = Nothing
254
255
255
256
-- | Convert condition trees to flagged dependencies. Mutually
256
257
-- recursive with 'convBranch'. See 'convBranch' for an explanation
@@ -262,8 +263,8 @@ convCondTree :: Map FlagName Bool -> DependencyReason PN -> PackageDescription -
262
263
SolveExecutables ->
263
264
CondTree ConfVar [Dependency ] a -> FlaggedDeps PN
264
265
convCondTree flags dr pkg os arch cinfo pn fds comp getInfo ipns solveExes@ (SolveExecutables solveExes') (CondNode info ds branches) =
265
- concatMap
266
- ( \ d -> filterIPNs ipns d ( D. Simple (convLibDep dr d) comp)) ds -- unconditional package dependencies
266
+ L. map ( \ d -> D. Simple (convLibDep dr d) comp)
267
+ (mergeDeps $ mapMaybe ( filterIPNs ipns) ds) -- unconditional package dependencies
267
268
++ L. map (\ e -> D. Simple (LDep dr (Ext e)) comp) (PD. allExtensions bi) -- unconditional extension dependencies
268
269
++ L. map (\ l -> D. Simple (LDep dr (Lang l)) comp) (PD. allLanguages bi) -- unconditional language dependencies
269
270
++ L. map (\ (PkgconfigDependency pkn vr) -> D. Simple (LDep dr (Pkg pkn vr)) comp) (PD. pkgconfigDepends bi) -- unconditional pkg-config dependencies
@@ -273,14 +274,28 @@ convCondTree flags dr pkg os arch cinfo pn fds comp getInfo ipns solveExes@(Solv
273
274
-- is True. It might be false in the legacy solver
274
275
-- codepath, in which case there won't be any record of
275
276
-- an executable we need.
276
- ++ [ D. Simple (convExeDep dr exeDep) comp
277
+ ++ L. map (\ d -> D. Simple (convExeDep dr d) comp)
278
+ (mergeExeDeps
279
+ [ exeDep
277
280
| solveExes'
278
281
, exeDep <- getAllToolDependencies pkg bi
279
282
, not $ isInternal pkg exeDep
280
- ]
283
+ ])
281
284
where
282
285
bi = getInfo info
283
286
287
+ -- Combine dependencies on the same package.
288
+ mergeDeps :: [Dependency ] -> [Dependency ]
289
+ mergeDeps deps =
290
+ L. map (uncurry Dependency ) $ M. toList $
291
+ M. fromListWith (.&&.) [(p, vr) | Dependency p vr <- deps]
292
+
293
+ -- Combine dependencies on the same package and executable.
294
+ mergeExeDeps :: [ExeDependency ] -> [ExeDependency ]
295
+ mergeExeDeps deps =
296
+ L. map (\ ((p, exe), vr) -> ExeDependency p exe vr) $ M. toList $
297
+ M. fromListWith (.&&.) [((p, exe), vr) | ExeDependency p exe vr <- deps]
298
+
284
299
-- | Branch interpreter. Mutually recursive with 'convCondTree'.
285
300
--
286
301
-- Here, we try to simplify one of Cabal's condition tree branches into the
@@ -365,8 +380,8 @@ convBranch flags dr pkg os arch cinfo pn fds comp getInfo ipns solveExes (CondBr
365
380
addFlag v = M. insert fn v flags'
366
381
in extractCommon (t (addFlag True ) (addFlagValue FlagBoth ))
367
382
(f (addFlag False ) (addFlagValue FlagBoth ))
368
- ++ [ Flagged (FN pn fn) (fds ! fn) (t (addFlag True ) (addFlagValue FlagTrue ))
369
- (f (addFlag False ) (addFlagValue FlagFalse )) ]
383
+ ++ [ Flagged (FN pn fn) (fds M. ! fn) (t (addFlag True ) (addFlagValue FlagTrue ))
384
+ (f (addFlag False ) (addFlagValue FlagFalse )) ]
370
385
go (Var (OS os')) t f
371
386
| os == os' = t
372
387
| otherwise = f
0 commit comments