chore(third_party/crate2nix): run tests in /build/source

Cherry-pick of https://github.com/nix-community/crate2nix/pull/328. This
should fix rstest runs inside crate2nix-generated derivations.

Change-Id: I9d393768f7f764e33c5938bd8fa14bd1bb0b72e1
Reviewed-on: https://cl.tvl.fyi/c/depot/+/10650
Reviewed-by: raitobezarius <tvl@lahfa.xyz>
Tested-by: BuildkiteCI
This commit is contained in:
Florian Klink 2024-01-16 22:00:41 +02:00 committed by flokli
parent 62b10cac44
commit 850a4bfc7b
3 changed files with 81 additions and 0 deletions

View file

@ -0,0 +1,69 @@
From 7cf084f73f7d15fe0538a625182fa7179c083b3d Mon Sep 17 00:00:00 2001
From: Raito Bezarius <masterancpp@gmail.com>
Date: Tue, 16 Jan 2024 02:10:48 +0100
Subject: [PATCH] fix(template): run tests in `/build/source` instead `/build`
Previously, the source tree was located inline in `/build` during tests, this was a mistake
because the crates more than often are built in `/build/source` as per the `sourceRoot` system.
This can cause issues with test binaries hardcoding `/build/source/...` as their choice for doing things,
causing them to be confused in the test phase which is relocated without rewriting the paths inside test binaries.
We fix that by relocating ourselves in the right hierarchy.
This is a "simple" fix in the sense that more edge cases could exist but they are hard to reason about
because they would be crates using custom `sourceRoot`, i.e. having `crate.sourceRoot` set and then it becomes
a bit hard to reproduce the hierarchy, you need to analyze whether the path is absolute or relative,
If it's relative, you can just reuse it and reproduce that specific hierarchy.
If it's absolute, you need to cut the "absolute" meaningless part, e.g. `$NIX_BUILD_TOP/` and proceed like
it's a relative path IMHO.
---
crate2nix/Cargo.nix | 10 ++++++++++
crate2nix/templates/nix/crate2nix/default.nix | 10 ++++++++++
diff --git a/Cargo.nix b/Cargo.nix
index 6ef7a49..172ff34 100644
--- a/Cargo.nix
+++ b/Cargo.nix
@@ -2889,6 +2889,16 @@ rec {
# 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.
+ # TODO(raitobezarius): I believe there could be more edge cases if `crate.sourceRoot`
+ # do exist but it's very hard to reason about them, so let's wait until the first bug report.
+ mkdir -p source/
+ cd source/
+
${pkgs.buildPackages.xorg.lndir}/bin/lndir ${crate.src}
# build outputs
diff --git a/crate2nix/templates/nix/crate2nix/default.nix b/crate2nix/templates/nix/crate2nix/default.nix
index e4fc2e9..dfb14c4 100644
--- a/templates/nix/crate2nix/default.nix
+++ b/templates/nix/crate2nix/default.nix
@@ -135,6 +135,16 @@ rec {
# 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.
+ # TODO(raitobezarius): I believe there could be more edge cases if `crate.sourceRoot`
+ # do exist but it's very hard to reason about them, so let's wait until the first bug report.
+ mkdir -p source/
+ cd source/
+
${pkgs.buildPackages.xorg.lndir}/bin/lndir ${crate.src}
# build outputs
--
2.43.0

View file

@ -85,6 +85,8 @@ depot.nix.readTree.drvTargets {
hash = "sha256-JTMe8GViCQt51WUiaaoIPmWtwEeeYrl6pBxo2DNuKig=";
};
patches = [ ./patches/crate2nix-run-tests-in-build-source.patch ];
sourceRoot = "${src.name}/crate2nix";
cargoHash = "sha256-dhlSXY1CJE+JJt+6Y7W1MVMz36nwr6ny543py1TcjyY=";

View file

@ -13541,6 +13541,16 @@ rec {
# 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.
# TODO(raitobezarius): I believe there could be more edge cases if `crate.sourceRoot`
# do exist but it's very hard to reason about them, so let's wait until the first bug report.
mkdir -p source/
cd source/
${pkgs.buildPackages.xorg.lndir}/bin/lndir ${crate.src}
# build outputs