lol

stdenv: Support concatenating setup hooks from multiple parts.

+61 -28
+61 -28
pkgs/stdenv/generic/setup.sh
··· 641 641 # Textual substitution functions. 642 642 643 643 644 - substitute() { 645 - local input="$1" 646 - local output="$2" 647 - shift 2 648 - 649 - if [ ! -f "$input" ]; then 650 - echo "substitute(): ERROR: file '$input' does not exist" >&2 651 - return 1 652 - fi 653 - 654 - local content 655 - # read returns non-0 on EOF, so we want read to fail 656 - if IFS='' read -r -N 0 content < "$input"; then 657 - echo "substitute(): ERROR: File \"$input\" has null bytes, won't process" >&2 658 - return 1 659 - fi 644 + substituteStream() { 645 + local var=$1 646 + shift 660 647 661 648 while (( "$#" )); do 662 649 case "$1" in ··· 671 658 shift 2 672 659 # check if the used nix attribute name is a valid bash name 673 660 if ! [[ "$varName" =~ ^[a-zA-Z_][a-zA-Z0-9_]*$ ]]; then 674 - echo "substitute(): ERROR: substitution variables must be valid Bash names, \"$varName\" isn't." >&2 661 + echo "substituteStream(): ERROR: substitution variables must be valid Bash names, \"$varName\" isn't." >&2 675 662 return 1 676 663 fi 677 664 pattern="@$varName@" ··· 685 672 ;; 686 673 687 674 *) 688 - echo "substitute(): ERROR: Invalid command line argument: $1" >&2 675 + echo "substituteStream(): ERROR: Invalid command line argument: $1" >&2 689 676 return 1 690 677 ;; 691 678 esac 692 679 693 - content="${content//"$pattern"/$replacement}" 680 + eval "$var"'=${'"$var"'//"$pattern"/"$replacement"}' 694 681 done 695 682 696 - if [ -e "$output" ]; then chmod +w "$output"; fi 697 - printf "%s" "$content" > "$output" 683 + printf "%s" "${!var}" 698 684 } 699 685 686 + consumeEntire() { 687 + # read returns non-0 on EOF, so we want read to fail 688 + if IFS='' read -r -N 0 $1; then 689 + echo "consumeEntire(): ERROR: Input null bytes, won't process" >&2 690 + return 1 691 + fi 692 + } 693 + 694 + substitute() { 695 + local input="$1" 696 + local output="$2" 697 + shift 2 698 + 699 + if [ ! -f "$input" ]; then 700 + echo "substitute(): ERROR: file '$input' does not exist" >&2 701 + return 1 702 + fi 703 + 704 + local content 705 + consumeEntire content < "$input" 706 + 707 + if [ -e "$output" ]; then chmod +w "$output"; fi 708 + substituteStream content "$@" > "$output" 709 + } 700 710 701 711 substituteInPlace() { 702 712 local fileName="$1" ··· 704 714 substitute "$fileName" "$fileName" "$@" 705 715 } 706 716 717 + _allFlags() { 718 + for varName in $(awk 'BEGIN { for (v in ENVIRON) if (v ~ /^[a-z][a-zA-Z0-9_]*$/) print v }'); do 719 + if (( "${NIX_DEBUG:-0}" >= 1 )); then 720 + printf "@%s@ -> %q\n" "${varName}" "${!varName}" 721 + fi 722 + args+=("--subst-var" "$varName") 723 + done 724 + } 725 + 726 + substituteAllStream() { 727 + local -a args=() 728 + _allFlags 729 + 730 + substituteStream "$1" "${args[@]}" 731 + } 707 732 708 733 # Substitute all environment variables that start with a lowercase character and 709 734 # are valid Bash names. 710 735 substituteAll() { 711 736 local input="$1" 712 737 local output="$2" 738 + 713 739 local -a args=() 714 - 715 - for varName in $(awk 'BEGIN { for (v in ENVIRON) if (v ~ /^[a-z][a-zA-Z0-9_]*$/) print v }'); do 716 - if (( "${NIX_DEBUG:-0}" >= 1 )); then 717 - printf "@%s@ -> %q\n" "${varName}" "${!varName}" 718 - fi 719 - args+=("--subst-var" "$varName") 720 - done 740 + _allFlags 721 741 722 742 substitute "$input" "$output" "${args[@]}" 723 743 } ··· 1089 1109 if [ -n "${setupHook:-}" ]; then 1090 1110 mkdir -p "${!outputDev}/nix-support" 1091 1111 substituteAll "$setupHook" "${!outputDev}/nix-support/setup-hook" 1112 + fi 1113 + 1114 + # TODO(@Ericson2314): Remove after https://github.com/NixOS/nixpkgs/pull/31414 1115 + if [ -n "${setupHooks:-}" ]; then 1116 + mkdir -p "${!outputDev}/nix-support" 1117 + local hook 1118 + for hook in $setupHooks; do 1119 + local content 1120 + consumeEntire content < "$hook" 1121 + substituteAllStream content >> "${!outputDev}/nix-support/setup-hook" 1122 + unset -v content 1123 + done 1124 + unset -v hook 1092 1125 fi 1093 1126 1094 1127 # Propagate user-env packages into the output with binaries, TODO?