Skip to content

Commit c1b22a2

Browse files
committed
Improve shellFor selectComponents performance
Only traverse local packages in search of components to add to `selectComponents`.
1 parent 2b842f2 commit c1b22a2

File tree

1 file changed

+20
-15
lines changed

1 file changed

+20
-15
lines changed

builder/shell-for.nix

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -47,27 +47,32 @@ let
4747
# (the pkgconfig depends of `b` will still be included in the
4848
# system shell's `buildInputs` via `b`'s own `buildInputs`).
4949

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 =
5466
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);
5768

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;
6470

65-
selectedComponents =
66-
lib.filter (x: selectedComponentsBitmap."${x.name}") (lib.attrValues transitiveDependenciesComponents);
71+
selectedComponents = map (x: x.val) (lib.filter (x: x.isSelected) dependencyClosure);
6772

6873
# Given a list of `depends`, removes those which are selected components
6974
removeSelectedInputs =
70-
lib.filter (input: !(selectedComponentsBitmap."${((haskellLib.dependToLib input).name or null)}" or false));
75+
lib.filter (input: !(isSelectedComponent input));
7176

7277
# The configs of all the selected components
7378
selectedConfigs = map (c: c.config) selectedComponents

0 commit comments

Comments
 (0)