diff --git a/pkgs/build-support/setup-hooks/autoreconf.sh b/pkgs/build-support/setup-hooks/autoreconf.sh index 763ea649c1c4..bb168aad4c51 100644 --- a/pkgs/build-support/setup-hooks/autoreconf.sh +++ b/pkgs/build-support/setup-hooks/autoreconf.sh @@ -4,8 +4,11 @@ autoreconfPhase() { runHook preAutoreconf local flagsArray=() - : "${autoreconfFlags:=--install --force --verbose}" - concatTo flagsArray autoreconfFlags + if [[ -v autoreconfFlags ]]; then + concatTo flagsArray autoreconfFlags + else + flagsArray+=(--install --force --verbose) + fi autoreconf "${flagsArray[@]}" runHook postAutoreconf diff --git a/pkgs/by-name/ni/ninja/setup-hook.sh b/pkgs/by-name/ni/ninja/setup-hook.sh index 4f3bc5b5acfa..4573aceea3c6 100644 --- a/pkgs/by-name/ni/ninja/setup-hook.sh +++ b/pkgs/by-name/ni/ninja/setup-hook.sh @@ -65,8 +65,7 @@ ninjaInstallPhase() { local flagsArray=( "-j$buildCores" ) - : "${installTargets:=install}" - concatTo flagsArray ninjaFlags ninjaFlagsArray installTargets + concatTo flagsArray ninjaFlags ninjaFlagsArray installTargets=install echoCmd 'install flags' "${flagsArray[@]}" TERM=dumb ninja "${flagsArray[@]}" diff --git a/pkgs/stdenv/generic/setup.sh b/pkgs/stdenv/generic/setup.sh index 1b4f7a89d358..3c197171e801 100644 --- a/pkgs/stdenv/generic/setup.sh +++ b/pkgs/stdenv/generic/setup.sh @@ -387,12 +387,16 @@ appendToVar() { # Accumulate flags from the named variables $2+ into the indexed array $1. # # Arrays are simply concatenated, strings are split on whitespace. +# Default values can be passed via name=default. concatTo() { local -n targetref="$1"; shift - local name type - for name in "$@"; do - if type=$(declare -p "$name" 2> /dev/null); then - local -n nameref="$name" + local arg default name type + for arg in "$@"; do + IFS="=" read -r name default <<< "$arg" + local -n nameref="$name" + if [[ ! -n "${nameref[@]}" && -n "$default" ]]; then + targetref+=( "$default" ) + elif type=$(declare -p "$name" 2> /dev/null); then case "${type#* }" in -A*) echo "concatTo(): ERROR: trying to use concatTo on an associative array." >&2 @@ -1340,8 +1344,7 @@ patchPhase() { esac local -a flagsArray - : "${patchFlags:=-p1}" - concatTo flagsArray patchFlags + concatTo flagsArray patchFlags=-p1 # "2>&1" is a hack to make patch fail if the decompressor fails (nonexistent patch, etc.) # shellcheck disable=SC2086 $uncompress < "$i" 2>&1 | patch "${flagsArray[@]}" @@ -1493,8 +1496,7 @@ checkPhase() { SHELL="$SHELL" ) - : "${checkFlags:=VERBOSE=y}" - concatTo flagsArray makeFlags makeFlagsArray checkFlags checkFlagsArray checkTarget + concatTo flagsArray makeFlags makeFlagsArray checkFlags=VERBOSE=y checkFlagsArray checkTarget echoCmd 'check flags' "${flagsArray[@]}" make ${makefile:+-f $makefile} "${flagsArray[@]}" @@ -1528,8 +1530,7 @@ installPhase() { SHELL="$SHELL" ) - : "${installTargets:=install}" - concatTo flagsArray makeFlags makeFlagsArray installFlags installFlagsArray installTargets + concatTo flagsArray makeFlags makeFlagsArray installFlags installFlagsArray installTargets=install echoCmd 'install flags' "${flagsArray[@]}" make ${makefile:+-f $makefile} "${flagsArray[@]}" @@ -1612,9 +1613,8 @@ installCheckPhase() { SHELL="$SHELL" ) - : "${installCheckTarget:=installcheck}" concatTo flagsArray makeFlags makeFlagsArray \ - installCheckFlags installCheckFlagsArray installCheckTarget + installCheckFlags installCheckFlagsArray installCheckTarget=installcheck echoCmd 'installcheck flags' "${flagsArray[@]}" make ${makefile:+-f $makefile} "${flagsArray[@]}" @@ -1629,8 +1629,7 @@ distPhase() { runHook preDist local flagsArray=() - : "${distTarget:=dist}" - concatTo flagsArray distFlags distFlagsArray distTarget + concatTo flagsArray distFlags distFlagsArray distTarget=dist echo 'dist flags: %q' "${flagsArray[@]}" make ${makefile:+-f $makefile} "${flagsArray[@]}" diff --git a/pkgs/test/stdenv/default.nix b/pkgs/test/stdenv/default.nix index a5b571b5a9f4..6ed430f5da3f 100644 --- a/pkgs/test/stdenv/default.nix +++ b/pkgs/test/stdenv/default.nix @@ -109,21 +109,30 @@ let declare -A associativeArray=(["X"]="Y") [[ $(concatTo nowhere associativeArray 2>&1) =~ "trying to use" ]] || (echo "concatTo did not throw concatenating associativeArray" && false) + empty_array=() + empty_string="" + declare -a flagsArray - concatTo flagsArray string list + concatTo flagsArray string list notset=e=f empty_array=g empty_string=h declare -p flagsArray [[ "''${flagsArray[0]}" == "a" ]] || (echo "'\$flagsArray[0]' was not 'a'" && false) [[ "''${flagsArray[1]}" == "b" ]] || (echo "'\$flagsArray[1]' was not 'b'" && false) [[ "''${flagsArray[2]}" == "c" ]] || (echo "'\$flagsArray[2]' was not 'c'" && false) [[ "''${flagsArray[3]}" == "d" ]] || (echo "'\$flagsArray[3]' was not 'd'" && false) + [[ "''${flagsArray[4]}" == "e=f" ]] || (echo "'\$flagsArray[4]' was not 'e=f'" && false) + [[ "''${flagsArray[5]}" == "g" ]] || (echo "'\$flagsArray[5]' was not 'g'" && false) + [[ "''${flagsArray[6]}" == "h" ]] || (echo "'\$flagsArray[6]' was not 'h'" && false) # test concatenating to unset variable - concatTo nonExistant string list + concatTo nonExistant string list notset=e=f empty_array=g empty_string=h declare -p nonExistant [[ "''${nonExistant[0]}" == "a" ]] || (echo "'\$nonExistant[0]' was not 'a'" && false) [[ "''${nonExistant[1]}" == "b" ]] || (echo "'\$nonExistant[1]' was not 'b'" && false) [[ "''${nonExistant[2]}" == "c" ]] || (echo "'\$nonExistant[2]' was not 'c'" && false) [[ "''${nonExistant[3]}" == "d" ]] || (echo "'\$nonExistant[3]' was not 'd'" && false) + [[ "''${nonExistant[4]}" == "e=f" ]] || (echo "'\$nonExistant[4]' was not 'e=f'" && false) + [[ "''${nonExistant[5]}" == "g" ]] || (echo "'\$nonExistant[5]' was not 'g'" && false) + [[ "''${nonExistant[6]}" == "h" ]] || (echo "'\$nonExistant[6]' was not 'h'" && false) eval "$extraTest"