stdenv: Support concatenating setup hooks from multiple parts.
This commit is contained in:
parent
39df5831ca
commit
34a3233a2e
@ -641,22 +641,9 @@ fi
|
|||||||
# Textual substitution functions.
|
# Textual substitution functions.
|
||||||
|
|
||||||
|
|
||||||
substitute() {
|
substituteStream() {
|
||||||
local input="$1"
|
local var=$1
|
||||||
local output="$2"
|
shift
|
||||||
shift 2
|
|
||||||
|
|
||||||
if [ ! -f "$input" ]; then
|
|
||||||
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 "substitute(): ERROR: File \"$input\" has null bytes, won't process" >&2
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
while (( "$#" )); do
|
while (( "$#" )); do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
@ -671,7 +658,7 @@ substitute() {
|
|||||||
shift 2
|
shift 2
|
||||||
# check if the used nix attribute name is a valid bash name
|
# check if the used nix attribute name is a valid bash name
|
||||||
if ! [[ "$varName" =~ ^[a-zA-Z_][a-zA-Z0-9_]*$ ]]; then
|
if ! [[ "$varName" =~ ^[a-zA-Z_][a-zA-Z0-9_]*$ ]]; then
|
||||||
echo "substitute(): ERROR: substitution variables must be valid Bash names, \"$varName\" isn't." >&2
|
echo "substituteStream(): ERROR: substitution variables must be valid Bash names, \"$varName\" isn't." >&2
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
pattern="@$varName@"
|
pattern="@$varName@"
|
||||||
@ -685,18 +672,41 @@ substitute() {
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
*)
|
*)
|
||||||
echo "substitute(): ERROR: Invalid command line argument: $1" >&2
|
echo "substituteStream(): ERROR: Invalid command line argument: $1" >&2
|
||||||
return 1
|
return 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
content="${content//"$pattern"/$replacement}"
|
eval "$var"'=${'"$var"'//"$pattern"/"$replacement"}'
|
||||||
done
|
done
|
||||||
|
|
||||||
if [ -e "$output" ]; then chmod +w "$output"; fi
|
printf "%s" "${!var}"
|
||||||
printf "%s" "$content" > "$output"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
consumeEntire() {
|
||||||
|
# read returns non-0 on EOF, so we want read to fail
|
||||||
|
if IFS='' read -r -N 0 $1; then
|
||||||
|
echo "consumeEntire(): ERROR: Input null bytes, won't process" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
substitute() {
|
||||||
|
local input="$1"
|
||||||
|
local output="$2"
|
||||||
|
shift 2
|
||||||
|
|
||||||
|
if [ ! -f "$input" ]; then
|
||||||
|
echo "substitute(): ERROR: file '$input' does not exist" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local content
|
||||||
|
consumeEntire content < "$input"
|
||||||
|
|
||||||
|
if [ -e "$output" ]; then chmod +w "$output"; fi
|
||||||
|
substituteStream content "$@" > "$output"
|
||||||
|
}
|
||||||
|
|
||||||
substituteInPlace() {
|
substituteInPlace() {
|
||||||
local fileName="$1"
|
local fileName="$1"
|
||||||
@ -704,20 +714,30 @@ substituteInPlace() {
|
|||||||
substitute "$fileName" "$fileName" "$@"
|
substitute "$fileName" "$fileName" "$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_allFlags() {
|
||||||
# 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=()
|
|
||||||
|
|
||||||
for varName in $(awk 'BEGIN { for (v in ENVIRON) if (v ~ /^[a-z][a-zA-Z0-9_]*$/) print v }'); do
|
for varName in $(awk 'BEGIN { for (v in ENVIRON) if (v ~ /^[a-z][a-zA-Z0-9_]*$/) print v }'); do
|
||||||
if (( "${NIX_DEBUG:-0}" >= 1 )); then
|
if (( "${NIX_DEBUG:-0}" >= 1 )); then
|
||||||
printf "@%s@ -> %q\n" "${varName}" "${!varName}"
|
printf "@%s@ -> %q\n" "${varName}" "${!varName}"
|
||||||
fi
|
fi
|
||||||
args+=("--subst-var" "$varName")
|
args+=("--subst-var" "$varName")
|
||||||
done
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
substituteAllStream() {
|
||||||
|
local -a args=()
|
||||||
|
_allFlags
|
||||||
|
|
||||||
|
substituteStream "$1" "${args[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 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=()
|
||||||
|
_allFlags
|
||||||
|
|
||||||
substitute "$input" "$output" "${args[@]}"
|
substitute "$input" "$output" "${args[@]}"
|
||||||
}
|
}
|
||||||
@ -1091,6 +1111,19 @@ fixupPhase() {
|
|||||||
substituteAll "$setupHook" "${!outputDev}/nix-support/setup-hook"
|
substituteAll "$setupHook" "${!outputDev}/nix-support/setup-hook"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# TODO(@Ericson2314): Remove after https://github.com/NixOS/nixpkgs/pull/31414
|
||||||
|
if [ -n "${setupHooks:-}" ]; then
|
||||||
|
mkdir -p "${!outputDev}/nix-support"
|
||||||
|
local hook
|
||||||
|
for hook in $setupHooks; do
|
||||||
|
local content
|
||||||
|
consumeEntire content < "$hook"
|
||||||
|
substituteAllStream content >> "${!outputDev}/nix-support/setup-hook"
|
||||||
|
unset -v content
|
||||||
|
done
|
||||||
|
unset -v hook
|
||||||
|
fi
|
||||||
|
|
||||||
# Propagate user-env packages into the output with binaries, TODO?
|
# Propagate user-env packages into the output with binaries, TODO?
|
||||||
|
|
||||||
if [ -n "${propagatedUserEnvPkgs:-}" ]; then
|
if [ -n "${propagatedUserEnvPkgs:-}" ]; then
|
||||||
|
Loading…
x
Reference in New Issue
Block a user