The problem with using runCommand and recreating the src directory with lndir is that it changes the file types of individual files, they will now be a symlink instead of a regular file. If you have a crate that tests that a file is of regular type then it will fail inside the crate2nix derivation. Also regenerate Cargo.nix for //tvix as it will be needed in the next commit. Change-Id: I9275602cc17a428f9fdf0e55daf12cd673bbc030 Reviewed-on: https://cl.tvl.fyi/c/depot/+/12131 Autosubmit: Ilan Joselevich <personal@ilanjoselevich.com> Reviewed-by: flokli <flokli@flokli.de> Tested-by: BuildkiteCI
		
			
				
	
	
		
			109 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 96f66ec32e003c6c215aa2a644281289a71dae7d Mon Sep 17 00:00:00 2001
 | |
| From: Ilan Joselevich <personal@ilanjoselevich.com>
 | |
| Date: Sun, 4 Aug 2024 02:35:27 +0300
 | |
| Subject: [PATCH] Fix: Use mkDerivation with src instead of runCommand for test
 | |
|  derivation
 | |
| 
 | |
| The problem with using runCommand and recreating the src directory with
 | |
| lndir is that it changes the file types of individual files, they will
 | |
| now be a symlink instead of a regular file. If you have a crate that tests
 | |
| that a file is of regular type then it will fail inside the crate2nix derivation.
 | |
| ---
 | |
|  templates/nix/crate2nix/default.nix | 81 ++++++++-----------
 | |
|  1 file changed, 35 insertions(+), 46 deletions(-)
 | |
| 
 | |
| diff --git a/templates/nix/crate2nix/default.nix b/templates/nix/crate2nix/default.nix
 | |
| index c53925e..90e10c6 100644
 | |
| --- a/templates/nix/crate2nix/default.nix
 | |
| +++ b/templates/nix/crate2nix/default.nix
 | |
| @@ -120,52 +120,41 @@ rec {
 | |
|                testPostRun
 | |
|              ]);
 | |
|          in
 | |
| -        pkgs.runCommand "run-tests-${testCrate.name}"
 | |
| -          {
 | |
| -            inherit testCrateFlags;
 | |
| -            buildInputs = testInputs;
 | |
| -          } ''
 | |
| -          set -e
 | |
| -
 | |
| -          export RUST_BACKTRACE=1
 | |
| -
 | |
| -          # recreate a file hierarchy as when running tests with cargo
 | |
| -
 | |
| -          # the source for test data
 | |
| -          # It's necessary to locate the source in $NIX_BUILD_TOP/source/
 | |
| -          # instead of $NIX_BUILD_TOP/
 | |
| -          # because we compiled those test binaries in the former and not the latter.
 | |
| -          # So all paths will expect source tree to be there and not in the build top directly.
 | |
| -          # For example: $NIX_BUILD_TOP := /build in general, if you ask yourself.
 | |
| -          # NOTE: There could be edge cases if `crate.sourceRoot` does exist but
 | |
| -          # it's very hard to reason about them.
 | |
| -          # Open a bug if you run into this!
 | |
| -          mkdir -p source/
 | |
| -          cd source/
 | |
| -
 | |
| -          ${pkgs.buildPackages.xorg.lndir}/bin/lndir ${crate.src}
 | |
| -
 | |
| -          # build outputs
 | |
| -          testRoot=target/debug
 | |
| -          mkdir -p $testRoot
 | |
| -
 | |
| -          # executables of the crate
 | |
| -          # we copy to prevent std::env::current_exe() to resolve to a store location
 | |
| -          for i in ${crate}/bin/*; do
 | |
| -            cp "$i" "$testRoot"
 | |
| -          done
 | |
| -          chmod +w -R .
 | |
| -
 | |
| -          # test harness executables are suffixed with a hash, like cargo does
 | |
| -          # this allows to prevent name collision with the main
 | |
| -          # executables of the crate
 | |
| -          hash=$(basename $out)
 | |
| -          for file in ${drv}/tests/*; do
 | |
| -            f=$testRoot/$(basename $file)-$hash
 | |
| -            cp $file $f
 | |
| -            ${testCommand}
 | |
| -          done
 | |
| -        '';
 | |
| +        pkgs.stdenvNoCC.mkDerivation {
 | |
| +          name = "run-tests-${testCrate.name}";
 | |
| +
 | |
| +          inherit (crate) src;
 | |
| +
 | |
| +          inherit testCrateFlags;
 | |
| +
 | |
| +          buildInputs = testInputs;
 | |
| +
 | |
| +          buildPhase = ''
 | |
| +            set -e
 | |
| +            export RUST_BACKTRACE=1
 | |
| +
 | |
| +            # build outputs
 | |
| +            testRoot=target/debug
 | |
| +            mkdir -p $testRoot
 | |
| +
 | |
| +            # executables of the crate
 | |
| +            # we copy to prevent std::env::current_exe() to resolve to a store location
 | |
| +            for i in ${crate}/bin/*; do
 | |
| +              cp "$i" "$testRoot"
 | |
| +            done
 | |
| +            chmod +w -R .
 | |
| +
 | |
| +            # test harness executables are suffixed with a hash, like cargo does
 | |
| +            # this allows to prevent name collision with the main
 | |
| +            # executables of the crate
 | |
| +            hash=$(basename $out)
 | |
| +            for file in ${drv}/tests/*; do
 | |
| +              f=$testRoot/$(basename $file)-$hash
 | |
| +              cp $file $f
 | |
| +              ${testCommand}
 | |
| +            done
 | |
| +          '';
 | |
| +        };
 | |
|      in
 | |
|      pkgs.runCommand "${crate.name}-linked"
 | |
|        {
 | |
| -- 
 | |
| 2.44.0
 | |
| 
 |