Skip to content

Commit

Permalink
stdenv: Support concatenating setup hooks from multiple parts.
Browse files Browse the repository at this point in the history
  • Loading branch information
Ericson2314 committed May 7, 2018
1 parent 39df583 commit 34a3233
Showing 1 changed file with 61 additions and 28 deletions.
89 changes: 61 additions & 28 deletions pkgs/stdenv/generic/setup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -641,22 +641,9 @@ fi
# Textual substitution functions.


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
# 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
substituteStream() {
local var=$1
shift

while (( "$#" )); do
case "$1" in
Expand All @@ -671,7 +658,7 @@ 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 "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
fi
pattern="@$varName@"
Expand All @@ -685,39 +672,72 @@ substitute() {
;;

*)
echo "substitute(): ERROR: Invalid command line argument: $1" >&2
echo "substituteStream(): ERROR: Invalid command line argument: $1" >&2
return 1
;;
esac

content="${content//"$pattern"/$replacement}"
eval "$var"'=${'"$var"'//"$pattern"/"$replacement"}'
done

if [ -e "$output" ]; then chmod +w "$output"; fi
printf "%s" "$content" > "$output"
printf "%s" "${!var}"
}

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() {
local fileName="$1"
shift
substitute "$fileName" "$fileName" "$@"
}

_allFlags() {
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
printf "@%s@ -> %q\n" "${varName}" "${!varName}"
fi
args+=("--subst-var" "$varName")
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=()

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
printf "@%s@ -> %q\n" "${varName}" "${!varName}"
fi
args+=("--subst-var" "$varName")
done
local -a args=()
_allFlags

substitute "$input" "$output" "${args[@]}"
}
Expand Down Expand Up @@ -1091,6 +1111,19 @@ fixupPhase() {
substituteAll "$setupHook" "${!outputDev}/nix-support/setup-hook"
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?

if [ -n "${propagatedUserEnvPkgs:-}" ]; then
Expand Down

0 comments on commit 34a3233

Please sign in to comment.