|
47 | 47 | # (the pkgconfig depends of `b` will still be included in the
|
48 | 48 | # system shell's `buildInputs` via `b`'s own `buildInputs`).
|
49 | 49 |
|
50 |
| - |
51 |
| - # all packages that are indirectly depended on by `directlySelectedComponents` |
52 |
| - # including `directlySelectedComponents` |
53 |
| - transitiveDependenciesComponents = |
| 50 | + # The transitive reflexive depedency closure of the `directlySelectedComponents` |
| 51 | + # used to compute `selectedComponents` |
| 52 | + dependencyClosure = |
| 53 | + let |
| 54 | + shouldSelect = comp: builtins.any isSelectedComponent comp.config.depends or []; |
| 55 | + makePairs = |
| 56 | + builtins.map |
| 57 | + (p: rec {key=val.name; val=(p.components.library or p); isSelected = shouldSelect val;}); |
| 58 | + makeInitialPairs = map (p: rec { key=val.name; val=(p.components.library or p); isSelected = true;}); |
| 59 | + closure = builtins.genericClosure { |
| 60 | + startSet = makeInitialPairs directlySelectedComponents; |
| 61 | + operator = {val,...}: makePairs (builtins.filter haskellLib.isLocalPackage val.config.depends); |
| 62 | + }; |
| 63 | + in closure; |
| 64 | + |
| 65 | + selectedComponentsBitset = |
54 | 66 | builtins.listToAttrs
|
55 |
| - (builtins.map (x: lib.nameValuePair (x.name) x) |
56 |
| - (haskellLib.flatLibDepends {depends = directlySelectedComponents;})); |
| 67 | + (builtins.map ({key,isSelected,...}: lib.nameValuePair key isSelected) dependencyClosure); |
57 | 68 |
|
58 |
| - selectedComponentsBitmap = |
59 |
| - lib.mapAttrs |
60 |
| - (_: x: (builtins.any |
61 |
| - (dep: selectedComponentsBitmap."${(haskellLib.dependToLib dep).name}") x.config.depends)) |
62 |
| - transitiveDependenciesComponents |
63 |
| - // builtins.listToAttrs (map (x: lib.nameValuePair x.name true) directlySelectedComponents); # base case |
| 69 | + isSelectedComponent = comp : selectedComponentsBitset."${(haskellLib.dependToLib comp).name or null}" or false; |
64 | 70 |
|
65 |
| - selectedComponents = |
66 |
| - lib.filter (x: selectedComponentsBitmap."${x.name}") (lib.attrValues transitiveDependenciesComponents); |
| 71 | + selectedComponents = map (x: x.val) (lib.filter (x: x.isSelected) dependencyClosure); |
67 | 72 |
|
68 | 73 | # Given a list of `depends`, removes those which are selected components
|
69 | 74 | removeSelectedInputs =
|
70 |
| - lib.filter (input: !(selectedComponentsBitmap."${((haskellLib.dependToLib input).name or null)}" or false)); |
| 75 | + lib.filter (input: !(isSelectedComponent input)); |
71 | 76 |
|
72 | 77 | # The configs of all the selected components
|
73 | 78 | selectedConfigs = map (c: c.config) selectedComponents
|
|
0 commit comments