stdenv: support default values in concatTo

The previously used pattern was introduced in #318614, but technically
leaked the default flags into the global scope. While this would
probably not make much of a practical difference, making concatTo
support default values is a much cleaner approach.
This commit is contained in:
Wolfgang Walther 2024-08-23 21:34:11 +02:00
parent a3836576dd
commit 1efcffa700
No known key found for this signature in database
GPG Key ID: B39893FA5F65CAE1
4 changed files with 30 additions and 20 deletions

View File

@ -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

View File

@ -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[@]}"

View File

@ -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[@]}"

View File

@ -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"