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>
		
	
			
		
			
				
	
	
		
			43 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| { 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;
 | ||
| }
 |