tvl-depot/nix/drvSeqL/default.nix
sterni abbc538ef3 feat(nix/drvSeqL): make build of a drv depend on unrelated drvs
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>
2021-02-14 12:40:06 +00:00

43 lines
1.3 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{ 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 its 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;
}