rustBuildCrate: properly handle cargo env pragmas with spaces
There are two problems: first that we end up splitting on spaces in the loop. Even when that is fixed, we still would split on spaces in the `export` inside the loop. We need to guard against both. Fixes #199298 Confirmed that it fixes the case mentioned in the ticket: ```console [nix-develop]$ $(nix-build -I nixpkgs=/home/shana/programming/nixpkgs Cargo.nix -A rootCrate.build --no-out-link)/bin/nix-rustc-env-escape-repro Expecting three words, got: first second third ``` I think this is going to cause a rebuild of every Rust package even if they were unaffected, not much we can do here.
This commit is contained in:
parent
1f1ed641de
commit
233205c464
1 changed files with 13 additions and 1 deletions
|
@ -189,9 +189,21 @@ in ''
|
||||||
EXTRA_LINK=$(sed -n "s/^cargo:rustc-link-lib=\(.*\)/\1/p" target/build/${crateName}.opt | tr '\n' ' ')
|
EXTRA_LINK=$(sed -n "s/^cargo:rustc-link-lib=\(.*\)/\1/p" target/build/${crateName}.opt | tr '\n' ' ')
|
||||||
EXTRA_LINK_SEARCH=$(sed -n "s/^cargo:rustc-link-search=\(.*\)/\1/p" target/build/${crateName}.opt | tr '\n' ' ' | sort -u)
|
EXTRA_LINK_SEARCH=$(sed -n "s/^cargo:rustc-link-search=\(.*\)/\1/p" target/build/${crateName}.opt | tr '\n' ' ' | sort -u)
|
||||||
|
|
||||||
|
# We want to read part of every line that has cargo:rustc-env= prefix and
|
||||||
|
# export it as environment variables. This turns out tricky if the lines
|
||||||
|
# have spaces: we can't wrap the command in double quotes as that captures
|
||||||
|
# all the lines in single output. We can't use while read loop because
|
||||||
|
# exporting from inside of it doesn't make it to the outside scope. We
|
||||||
|
# can't use xargs as export is a built-in and does not work from it. As a
|
||||||
|
# last resort then, we change the IFS so that the for loop does not split
|
||||||
|
# on spaces and reset it after we are done. See ticket #199298.
|
||||||
|
#
|
||||||
|
_OLDIFS="$IFS"
|
||||||
|
IFS=$'\n'
|
||||||
for env in $(sed -n "s/^cargo:rustc-env=\(.*\)/\1/p" target/build/${crateName}.opt); do
|
for env in $(sed -n "s/^cargo:rustc-env=\(.*\)/\1/p" target/build/${crateName}.opt); do
|
||||||
export $env
|
export "$env"
|
||||||
done
|
done
|
||||||
|
IFS="$_OLDIFS"
|
||||||
|
|
||||||
CRATENAME=$(echo ${crateName} | sed -e "s/\(.*\)-sys$/\U\1/" -e "s/-/_/g")
|
CRATENAME=$(echo ${crateName} | sed -e "s/\(.*\)-sys$/\U\1/" -e "s/-/_/g")
|
||||||
grep -P "^cargo:(?!(rustc-|warning=|rerun-if-changed=|rerun-if-env-changed))" target/build/${crateName}.opt \
|
grep -P "^cargo:(?!(rustc-|warning=|rerun-if-changed=|rerun-if-env-changed))" target/build/${crateName}.opt \
|
||||||
|
|
Loading…
Reference in a new issue