about summary refs log tree commit diff
path: root/nix/drvSeqL
diff options
context:
space:
mode:
authorsterni <sternenseemann@systemli.org>2021-02-14T11·29+0100
committersterni <sternenseemann@systemli.org>2021-02-14T12·40+0000
commitabbc538ef348f4faa31c93d145193a38b2af9bf9 (patch)
tree667ae968faa27037ac95edd40e3650c1e8c9ab26 /nix/drvSeqL
parent5a08316a3c26f6df10a62c8962b1b468ebb30290 (diff)
feat(nix/drvSeqL): make build of a drv depend on unrelated drvs r/2214
This adds the star of NixCon 2017 from vuizvui, slightly reformatted and
now using yants. While it has some flaws, I realized that it is ideal to
run the tests of rustSimple{Lib,Bin} where the normal and the -tests
variant would have to be rebuilt if either the tests or the library /
executable itself changes.

Change-Id: Ie8f84f98c51c9fafc046eff916c8f0df7e8f224b
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2528
Tested-by: BuildkiteCI
Reviewed-by: Profpatsch <mail@profpatsch.de>
Diffstat (limited to 'nix/drvSeqL')
-rw-r--r--nix/drvSeqL/default.nix43
1 files changed, 43 insertions, 0 deletions
diff --git a/nix/drvSeqL/default.nix b/nix/drvSeqL/default.nix
new file mode 100644
index 0000000000..3339289b3b
--- /dev/null
+++ b/nix/drvSeqL/default.nix
@@ -0,0 +1,43 @@
+{ depot, lib, pkgs, ... }:
+
+let
+
+  inherit (depot.nix.yants)
+    defun
+    list
+    drv
+    ;
+
+  /* Realize drvDeps, then return drvOut if that succeds.
+   * This can be used to make drvOut depend on the
+   * build success of all drvDeps without making each drvDep
+   * a dependency of drvOut.
+   * => drvOut is not rebuilt if drvDep changes
+   */
+  drvSeqL = defun [ (list drv) drv drv ]
+    (drvDeps: drvOut:
+      let
+        drvOutOutputs = drvOut.outputs or ["out"];
+      in
+        pkgs.runCommandLocal drvOut.name {
+          # we inherit all attributes in order to replicate
+          # the original derivation as much as possible
+          outputs = drvOutOutputs;
+          passthru = drvOut.drvAttrs;
+          # depend on drvDeps (by putting it in builder context)
+          inherit drvDeps;
+        }
+        # the outputs of the original derivation are replicated
+        # by creating a symlink to the old output path
+        (lib.concatMapStrings (output: ''
+          target=${lib.escapeShellArg drvOut.${output}}
+          # if the target is already a symlink, follow it until it’s not;
+          # this is done to prevent too many dereferences
+          target=$(readlink -e "$target")
+          # link to the output
+          ln -s "$target" "${"$"}${output}"
+        '') drvOutOutputs));
+
+in {
+  __functor = _: drvSeqL;
+}