Skip to content

Commit

Permalink
stdenv-setup: fix substituteAll with set -eu
Browse files Browse the repository at this point in the history
Environment variable filter in substituteAll was not precise and produced
undefined and invalid variable names.  Vladimír Čunát tried to fix that in [1],
but `env -0` did not work during Darwin bootstrap, so [2] reverted this change
and replaced an error due to invalid variables with a warning.  Recently in #28057
John Ericson added `set -u` to `setup.sh` and undefined variables made the setup
fail during e.g. `nix-build -A gnat` with `setup: line 519: !varName: unbound
variable`.

[1] 62fc885
[2] 81df035
  • Loading branch information
orivej committed Sep 3, 2017
1 parent 447240b commit a09d9e7
Showing 1 changed file with 17 additions and 12 deletions.
29 changes: 17 additions & 12 deletions pkgs/stdenv/generic/setup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -473,14 +473,14 @@ substitute() {
shift 2

if [ ! -f "$input" ]; then
echo "${FUNCNAME[0]}(): ERROR: file '$input' does not exist" >&2
echo "substitute(): ERROR: file '$input' does not exist" >&2
return 1
fi

local content
# read returns non-0 on EOF, so we want read to fail
if IFS='' read -r -N 0 content < "$input"; then
echo "${FUNCNAME[0]}(): ERROR: File \"$input\" has null bytes, won't process" >&2
echo "substitute(): ERROR: File \"$input\" has null bytes, won't process" >&2
return 1
fi

Expand All @@ -497,10 +497,8 @@ substitute() {
shift 2
# check if the used nix attribute name is a valid bash name
if ! [[ "$varName" =~ ^[a-zA-Z_][a-zA-Z0-9_]*$ ]]; then
echo "${FUNCNAME[0]}(): WARNING: substitution variables should be valid bash names," >&2
echo " \"$varName\" isn't and therefore was skipped; it might be caused" >&2
echo " by multi-line phases in variables - see #14907 for details." >&2
continue
echo "substitute(): ERROR: substitution variables must be valid Bash names, \"$varName\" isn't." >&2
return 1
fi
pattern="@$varName@"
replacement="${!varName}"
Expand All @@ -513,7 +511,7 @@ substitute() {
;;

*)
echo "${FUNCNAME[0]}(): ERROR: Invalid command line argument: $1" >&2
echo "substitute(): ERROR: Invalid command line argument: $1" >&2
return 1
;;
esac
Expand All @@ -532,17 +530,24 @@ substituteInPlace() {
substitute "$fileName" "$fileName" "$@"
}

# List the names of the environment variables that are valid Bash names.
listVars() {
# "export" prints "declare -x name=value", quoted for eval.
declare() {
echo "${2%%=*}"
}
eval "$(export)"
unset declare
}

# Substitute all environment variables that do not start with an upper-case
# character or underscore. Note: other names that aren't bash-valid
# will cause an error during `substitute --subst-var`.
# Substitute all environment variables that start with a lowercase character and
# are valid Bash names.
substituteAll() {
local input="$1"
local output="$2"
local -a args=()

# Select all environment variables that start with a lowercase character.
for varName in $(env | sed -e $'s/^\([a-z][^= \t]*\)=.*/\\1/; t \n d'); do
for varName in $(listVars | grep '^[a-z]'); do
if [ "${NIX_DEBUG:-}" = "1" ]; then
echo "@${varName}@ -> '${!varName}'"
fi
Expand Down

0 comments on commit a09d9e7

Please sign in to comment.