aboutsummaryrefslogtreecommitdiff
path: root/pkgs/build-support/rust
diff options
context:
space:
mode:
authorMaximilian Bosch <maximilian@mbosch.me>2020-07-14 17:32:06 +0200
committerMaximilian Bosch <maximilian@mbosch.me>2020-07-15 20:08:30 +0200
commitd2694d936ef88d0d6028203105552efddf6db23d (patch)
tree740ea06448614c5ae0eed0ba148fc9c743d7e242 /pkgs/build-support/rust
parent7713fba8f89a15fd0413ea61b98880e90a978eec (diff)
rustPlatform: don't install artifacts modified by `checkPhase`
While the artifacts from `buildPhase` should be used for testing as well, it should be avoided that those are modified during `checkPhase`. This can happen if a package is built e.g. with special `cargoBuildFlags` that don't apply to the `checkPhase`. In that case, a binary would be installed into `$out` without those flags since `checkPhase` overrides the binary in the `target`-directory. This patch copies the state of `target/release` into a temporary location at the end of the `buildPhase` and installs the results from that temporary directory into `$out` while `checkPhase` can continue using the configured build-dir. cc #91689 Closes #93119 Closes #91191
Diffstat (limited to 'pkgs/build-support/rust')
-rw-r--r--pkgs/build-support/rust/default.nix11
1 files changed, 7 insertions, 4 deletions
diff --git a/pkgs/build-support/rust/default.nix b/pkgs/build-support/rust/default.nix
index 8d3a7ba6929c..c292b8ea4d43 100644
--- a/pkgs/build-support/rust/default.nix
+++ b/pkgs/build-support/rust/default.nix
@@ -74,6 +74,7 @@ let
ccForHost="${stdenv.cc}/bin/${stdenv.cc.targetPrefix}cc";
cxxForHost="${stdenv.cc}/bin/${stdenv.cc.targetPrefix}c++";
releaseDir = "target/${rustTarget}/${buildType}";
+ tmpDir = "${releaseDir}-tmp";
# Specify the stdenv's `diff` by abspath to ensure that the user's build
# inputs do not cause us to find the wrong `diff`.
@@ -193,7 +194,9 @@ stdenv.mkDerivation (args // {
# This needs to be done after postBuild: packages like `cargo` do a pushd/popd in
# the pre/postBuild-hooks that need to be taken into account before gathering
# all binaries to install.
- bins=$(find $releaseDir \
+ mkdir -p $tmpDir
+ cp -r $releaseDir/* $tmpDir/
+ bins=$(find $tmpDir \
-maxdepth 1 \
-type f \
-executable ! \( -regex ".*\.\(so.[0-9.]+\|so\|a\|dylib\)" \))
@@ -214,13 +217,13 @@ stdenv.mkDerivation (args // {
strictDeps = true;
- inherit releaseDir;
+ inherit releaseDir tmpDir;
installPhase = args.installPhase or ''
runHook preInstall
# rename the output dir to a architecture independent one
- mapfile -t targets < <(find "$NIX_BUILD_TOP" -type d | grep '${releaseDir}$')
+ mapfile -t targets < <(find "$NIX_BUILD_TOP" -type d | grep '${tmpDir}$')
for target in "''${targets[@]}"; do
rm -rf "$target/../../${buildType}"
ln -srf "$target" "$target/../../"
@@ -228,7 +231,7 @@ stdenv.mkDerivation (args // {
mkdir -p $out/bin $out/lib
xargs -r cp -t $out/bin <<< $bins
- find $releaseDir \
+ find $tmpDir \
-maxdepth 1 \
-regex ".*\.\(so.[0-9.]+\|so\|a\|dylib\)" \
-print0 | xargs -r -0 cp -t $out/lib