diff options
author | sterni <sternenseemann@systemli.org> | 2021-02-14T11·29+0100 |
---|---|---|
committer | sterni <sternenseemann@systemli.org> | 2021-02-14T12·40+0000 |
commit | abbc538ef348f4faa31c93d145193a38b2af9bf9 (patch) | |
tree | 667ae968faa27037ac95edd40e3650c1e8c9ab26 /nix/drvSeqL | |
parent | 5a08316a3c26f6df10a62c8962b1b468ebb30290 (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.nix | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/nix/drvSeqL/default.nix b/nix/drvSeqL/default.nix new file mode 100644 index 000000000000..3339289b3bd1 --- /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; +} |