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>
This commit is contained in:
parent
5a08316a3c
commit
abbc538ef3
1 changed files with 43 additions and 0 deletions
43
nix/drvSeqL/default.nix
Normal file
43
nix/drvSeqL/default.nix
Normal file
|
@ -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;
|
||||||
|
}
|
Loading…
Reference in a new issue