From bdd6c037c0b64a60d3e5a118f9d73e326cbfd5d2 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Thu, 31 Aug 2017 15:29:03 -0400 Subject: [PATCH] cc-wrapper: Use separate mangler for "bool" variables This avoids any `NIX_FOOBAR=1 1` not triggering conditions. --- pkgs/build-support/cc-wrapper/add-flags.sh | 9 ++++++-- pkgs/build-support/cc-wrapper/utils.sh | 25 +++++++++++++++++----- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/pkgs/build-support/cc-wrapper/add-flags.sh b/pkgs/build-support/cc-wrapper/add-flags.sh index 5f7c071fb9c..978041fb4d8 100644 --- a/pkgs/build-support/cc-wrapper/add-flags.sh +++ b/pkgs/build-support/cc-wrapper/add-flags.sh @@ -4,7 +4,7 @@ # that case, it is cheaper/better to not repeat this step and let the forked # wrapped binary just inherit the work of the forker's wrapper script. -var_templates=( +var_templates_list=( NIX+CFLAGS_COMPILE NIX+CFLAGS_LINK NIX+CXXSTDLIB_COMPILE @@ -14,7 +14,9 @@ var_templates=( NIX+LDFLAGS NIX+LDFLAGS_BEFORE NIX+LDFLAGS_AFTER +) +var_templates_bool=( NIX+SET_BUILD_ID NIX+DONT_SET_RPATH NIX+ENFORCE_NO_NATIVE @@ -35,9 +37,12 @@ fi # We need to mangle names for hygiene, but also take parameters/overrides # from the environment. -for var in "${var_templates[@]}"; do +for var in "${var_templates_list[@]}"; do mangleVarList "$var" "${role_infixes[@]}" done +for var in "${var_templates_bool[@]}"; do + mangleVarBool "$var" "${role_infixes[@]}" +done # `-B@out@/bin' forces cc to use ld-wrapper.sh when calling ld. NIX_@infixSalt@_CFLAGS_COMPILE="-B@out@/bin/ $NIX_@infixSalt@_CFLAGS_COMPILE" diff --git a/pkgs/build-support/cc-wrapper/utils.sh b/pkgs/build-support/cc-wrapper/utils.sh index 41afde5c3c5..4b2b1380918 100644 --- a/pkgs/build-support/cc-wrapper/utils.sh +++ b/pkgs/build-support/cc-wrapper/utils.sh @@ -1,20 +1,35 @@ mangleVarList() { - declare var="$1" + local var="$1" shift - declare -a role_infixes=("$@") + local -a role_infixes=("$@") - outputVar="${var/+/_@infixSalt@_}" - export ${outputVar}+='' + local outputVar="${var/+/_@infixSalt@_}" + declare -gx ${outputVar}+='' # For each role we serve, we accumulate the input parameters into our own # cc-wrapper-derivation-specific environment variables. for infix in "${role_infixes[@]}"; do - inputVar="${var/+/${infix}}" + local inputVar="${var/+/${infix}}" if [ -v "$inputVar" ]; then export ${outputVar}+="${!outputVar:+ }${!inputVar}" fi done } +mangleVarBool() { + local var="$1" + shift + local -a role_infixes=("$@") + + local outputVar="${var/+/_@infixSalt@_}" + declare -gxi ${outputVar}+=0 + for infix in "${role_infixes[@]}"; do + local inputVar="${var/+/${infix}}" + if [ -v "$inputVar" ]; then + let "${outputVar} |= ${!inputVar}" + fi + done +} + skip () { if (( "${NIX_DEBUG:-0}" >= 1 )); then echo "skipping impure path $1" >&2