aboutsummaryrefslogtreecommitdiff
path: root/lib/strings-with-deps.nix
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2013-10-10 13:28:21 +0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2013-10-10 13:28:21 +0200
commit5fef92c4a0c91153e3edac3a61a232581765074a (patch)
tree291d684d0ef71e200e6d8ab5c33fc1aca467cbb3 /lib/strings-with-deps.nix
parent2a537fb369d1479748fe233261eaadfa5c2fa930 (diff)
Move pkgs/lib/ to lib/
Diffstat (limited to 'lib/strings-with-deps.nix')
-rw-r--r--lib/strings-with-deps.nix78
1 files changed, 78 insertions, 0 deletions
diff --git a/lib/strings-with-deps.nix b/lib/strings-with-deps.nix
new file mode 100644
index 000000000000..3ad3e5991506
--- /dev/null
+++ b/lib/strings-with-deps.nix
@@ -0,0 +1,78 @@
+/*
+Usage:
+
+ You define you custom builder script by adding all build steps to a list.
+ for example:
+ builder = writeScript "fsg-4.4-builder"
+ (textClosure [doUnpack addInputs preBuild doMake installPhase doForceShare]);
+
+ a step is defined by noDepEntry, fullDepEntry or packEntry.
+ To ensure that prerequisite are met those are added before the task itself by
+ textClosureDupList. Duplicated items are removed again.
+
+ See trace/nixpkgs/trunk/pkgs/top-level/builder-defs.nix for some predefined build steps
+
+ Attention:
+
+ let
+ pkgs = (import /etc/nixos/nixpkgs/pkgs/top-level/all-packages.nix) {};
+ in let
+ inherit (pkgs.stringsWithDeps) fullDepEntry packEntry noDepEntry textClosureMap;
+ inherit (pkgs.lib) id;
+
+ nameA = noDepEntry "Text a";
+ nameB = fullDepEntry "Text b" ["nameA"];
+ nameC = fullDepEntry "Text c" ["nameA"];
+
+ stages = {
+ nameHeader = noDepEntry "#! /bin/sh \n";
+ inherit nameA nameB nameC;
+ };
+ in
+ textClosureMap id stages
+ [ "nameHeader" "nameA" "nameB" "nameC"
+ nameC # <- added twice. add a dep entry if you know that it will be added once only [1]
+ "nameB" # <- this will not be added again because the attr name (reference) is used
+ ]
+
+ # result: Str("#! /bin/sh \n\nText a\nText b\nText c\nText c",[])
+
+ [1] maybe this behaviour should be removed to keep things simple (?)
+*/
+
+with import ./lists.nix;
+with import ./attrsets.nix;
+with import ./strings.nix;
+
+rec {
+
+ /* !!! The interface of this function is kind of messed up, since
+ it's way too overloaded and almost but not quite computes a
+ topological sort of the depstrings. */
+
+ textClosureList = predefined: arg:
+ let
+ f = done: todo:
+ if todo == [] then {result = []; inherit done;}
+ else
+ let entry = head todo; in
+ if isAttrs entry then
+ let x = f done entry.deps;
+ y = f x.done (tail todo);
+ in { result = x.result ++ [entry.text] ++ y.result;
+ done = y.done;
+ }
+ else if hasAttr entry done then f done (tail todo)
+ else f (done // listToAttrs [{name = entry; value = 1;}]) ([(builtins.getAttr entry predefined)] ++ tail todo);
+ in (f {} arg).result;
+
+ textClosureMap = f: predefined: names:
+ concatStringsSep "\n" (map f (textClosureList predefined names));
+
+ noDepEntry = text: {inherit text; deps = [];};
+ fullDepEntry = text: deps: {inherit text deps;};
+ packEntry = deps: {inherit deps; text="";};
+
+ stringAfter = deps: text: { inherit text deps; };
+
+}