diff options
author | John Ericson <John.Ericson@Obsidian.Systems> | 2019-11-25 00:23:07 +0000 |
---|---|---|
committer | John Ericson <John.Ericson@Obsidian.Systems> | 2019-11-25 00:23:07 +0000 |
commit | 6bc456c91c6a556e905852d9a13034ed1932ea3d (patch) | |
tree | 69df19159e5e7df77ae939041f8f6e941c5ef056 /pkgs/stdenv/generic/setup.sh | |
parent | ea9a2c5ec21bf088bbdef036238fa67cdc85b073 (diff) | |
parent | 4273a6adcc9327b9dc0e09e9fe205b4861c15679 (diff) |
Merge remote-tracking branch 'upstream/master' into ghcjs-cross-without-cc
Diffstat (limited to 'pkgs/stdenv/generic/setup.sh')
-rw-r--r-- | pkgs/stdenv/generic/setup.sh | 133 |
1 files changed, 50 insertions, 83 deletions
diff --git a/pkgs/stdenv/generic/setup.sh b/pkgs/stdenv/generic/setup.sh index 311292169ecd..5b8fdde57961 100644 --- a/pkgs/stdenv/generic/setup.sh +++ b/pkgs/stdenv/generic/setup.sh @@ -17,9 +17,6 @@ fi # code). The hooks for <hookName> are the shell function or variable # <hookName>, and the values of the shell array ‘<hookName>Hooks’. runHook() { - local oldOpts="$(shopt -po nounset)" - set -u # May be called from elsewhere, so do `set -u`. - local hookName="$1" shift local hooksSlice="${hookName%Hook}Hooks[@]" @@ -29,10 +26,8 @@ runHook() { # undefined. for hook in "_callImplicitHook 0 $hookName" ${!hooksSlice+"${!hooksSlice}"}; do _eval "$hook" "$@" - set -u # To balance `_eval` done - eval "${oldOpts}" return 0 } @@ -40,9 +35,6 @@ runHook() { # Run all hooks with the specified name, until one succeeds (returns a # zero exit code). If none succeed, return a non-zero exit code. runOneHook() { - local oldOpts="$(shopt -po nounset)" - set -u # May be called from elsewhere, so do `set -u`. - local hookName="$1" shift local hooksSlice="${hookName%Hook}Hooks[@]" @@ -54,10 +46,8 @@ runOneHook() { ret=0 break fi - set -u # To balance `_eval` done - eval "${oldOpts}" return "$ret" } @@ -68,24 +58,17 @@ runOneHook() { # environment variables) and from shell scripts (as functions). If you # want to allow multiple hooks, use runHook instead. _callImplicitHook() { - set -u local def="$1" local hookName="$2" - case "$(type -t "$hookName")" in - (function|alias|builtin) - set +u - "$hookName";; - (file) - set +u - source "$hookName";; - (keyword) :;; - (*) if [ -z "${!hookName:-}" ]; then - return "$def"; - else - set +u - eval "${!hookName}" - fi;; - esac + if declare -F "$hookName" > /dev/null; then + "$hookName" + elif type -p "$hookName" > /dev/null; then + source "$hookName" + elif [ -n "${!hookName:-}" ]; then + eval "${!hookName}" + else + return "$def" + fi # `_eval` expects hook to need nounset disable and leave it # disabled anyways, so Ok to to delegate. The alternative of a # return trap is no good because it would affect nested returns. @@ -96,14 +79,11 @@ _callImplicitHook() { # hooks exits the hook, not the caller. Also will only pass args if # command can take them _eval() { - if [ "$(type -t "$1")" = function ]; then - set +u + if declare -F "$1" > /dev/null 2>&1; then "$@" # including args else - set +u eval "$1" fi - # `run*Hook` reenables `set -u` } @@ -191,12 +171,12 @@ addToSearchPath() { # so it is defined here but tried after the hook. _addRpathPrefix() { if [ "${NIX_NO_SELF_RPATH:-0}" != 1 ]; then - export NIX_LDFLAGS="-rpath $1/lib $NIX_LDFLAGS" + export NIX_LDFLAGS="-rpath $1/lib ${NIX_LDFLAGS-}" if [ -n "${NIX_LIB64_IN_SELF_RPATH:-}" ]; then - export NIX_LDFLAGS="-rpath $1/lib64 $NIX_LDFLAGS" + export NIX_LDFLAGS="-rpath $1/lib64 ${NIX_LDFLAGS-}" fi if [ -n "${NIX_LIB32_IN_SELF_RPATH:-}" ]; then - export NIX_LDFLAGS="-rpath $1/lib32 $NIX_LDFLAGS" + export NIX_LDFLAGS="-rpath $1/lib32 ${NIX_LDFLAGS-}" fi fi } @@ -212,18 +192,6 @@ isELF() { if [ "$magic" = $'\177ELF' ]; then return 0; else return 1; fi } -# Return success if the specified file is an ELF object -# and its e_type is ET_EXEC (executable file) -isELFExec() { - grep -ao -P '^\177ELF.{11}\x00\x02' "$1" >/dev/null -} - -# Return success if the specified file is an ELF object -# and its e_type is ET_DYN (shared object file) -isELFDyn() { - grep -ao -P '^\177ELF.{11}\x00\x03' "$1" >/dev/null -} - # Return success if the specified file is a script (i.e. starts with # "#!"). isScript() { @@ -280,6 +248,8 @@ for i in $initialPath; do fi done +unset i + if (( "${NIX_DEBUG:-0}" >= 1 )); then echo "initial path: $PATH" fi @@ -309,11 +279,11 @@ declare -a pkgsBuildBuild pkgsBuildHost pkgsBuildTarget declare -a pkgsHostHost pkgsHostTarget declare -a pkgsTargetTarget -declare -ra pkgBuildAccumVars=(pkgsBuildBuild pkgsBuildHost pkgsBuildTarget) -declare -ra pkgHostAccumVars=(pkgsHostHost pkgsHostTarget) -declare -ra pkgTargetAccumVars=(pkgsTargetTarget) +declare -a pkgBuildAccumVars=(pkgsBuildBuild pkgsBuildHost pkgsBuildTarget) +declare -a pkgHostAccumVars=(pkgsHostHost pkgsHostTarget) +declare -a pkgTargetAccumVars=(pkgsTargetTarget) -declare -ra pkgAccumVarVars=(pkgBuildAccumVars pkgHostAccumVars pkgTargetAccumVars) +declare -a pkgAccumVarVars=(pkgBuildAccumVars pkgHostAccumVars pkgTargetAccumVars) # Hooks @@ -322,11 +292,11 @@ declare -a envBuildBuildHooks envBuildHostHooks envBuildTargetHooks declare -a envHostHostHooks envHostTargetHooks declare -a envTargetTargetHooks -declare -ra pkgBuildHookVars=(envBuildBuildHook envBuildHostHook envBuildTargetHook) -declare -ra pkgHostHookVars=(envHostHostHook envHostTargetHook) -declare -ra pkgTargetHookVars=(envTargetTargetHook) +declare -a pkgBuildHookVars=(envBuildBuildHook envBuildHostHook envBuildTargetHook) +declare -a pkgHostHookVars=(envHostHostHook envHostTargetHook) +declare -a pkgTargetHookVars=(envTargetTargetHook) -declare -ra pkgHookVarVars=(pkgBuildHookVars pkgHostHookVars pkgTargetHookVars) +declare -a pkgHookVarVars=(pkgBuildHookVars pkgHostHookVars pkgTargetHookVars) # Add env hooks for all sorts of deps with the specified host offset. addEnvHooks() { @@ -342,26 +312,26 @@ addEnvHooks() { # Propagated dep files -declare -ra propagatedBuildDepFiles=( +declare -a propagatedBuildDepFiles=( propagated-build-build-deps propagated-native-build-inputs # Legacy name for back-compat propagated-build-target-deps ) -declare -ra propagatedHostDepFiles=( +declare -a propagatedHostDepFiles=( propagated-host-host-deps propagated-build-inputs # Legacy name for back-compat ) -declare -ra propagatedTargetDepFiles=( +declare -a propagatedTargetDepFiles=( propagated-target-target-deps ) -declare -ra propagatedDepFilesVars=( +declare -a propagatedDepFilesVars=( propagatedBuildDepFiles propagatedHostDepFiles propagatedTargetDepFiles ) # Platform offsets: build = -1, host = 0, target = 1 -declare -ra allPlatOffsets=(-1 0 1) +declare -a allPlatOffsets=(-1 0 1) # Mutually-recursively find all build inputs. See the dependency section of the @@ -401,6 +371,7 @@ findInputs() { # The current package's host and target offset together # provide a <=-preserving homomorphism from the relative # offsets to current offset + local -i mapOffsetResult function mapOffset() { local -ri inputOffset="$1" if (( "$inputOffset" <= 0 )); then @@ -408,7 +379,7 @@ findInputs() { else local -ri outputOffset="$inputOffset - 1 + $targetOffset" fi - echo "$outputOffset" + mapOffsetResult="$outputOffset" } # Host offset relative to that of the package whose immediate @@ -420,8 +391,8 @@ findInputs() { # Host offset relative to the package currently being # built---as absolute an offset as will be used. - local -i hostOffsetNext - hostOffsetNext="$(mapOffset relHostOffset)" + mapOffset relHostOffset + local -i hostOffsetNext="$mapOffsetResult" # Ensure we're in bounds relative to the package currently # being built. @@ -439,8 +410,8 @@ findInputs() { # Target offset relative to the package currently being # built. - local -i targetOffsetNext - targetOffsetNext="$(mapOffset relTargetOffset)" + mapOffset relTargetOffset + local -i targetOffsetNext="$mapOffsetResult" # Once again, ensure we're in bounds relative to the # package currently being built. @@ -449,7 +420,8 @@ findInputs() { [[ -f "$pkg/nix-support/$file" ]] || continue local pkgNext - for pkgNext in $(< "$pkg/nix-support/$file"); do + read -r -d '' pkgNext < "$pkg/nix-support/$file" || true + for pkgNext in $pkgNext; do findInputs "$pkgNext" "$hostOffsetNext" "$targetOffsetNext" done done @@ -500,10 +472,7 @@ activatePackage() { (( "$hostOffset" <= "$targetOffset" )) || exit -1 if [ -f "$pkg" ]; then - local oldOpts="$(shopt -po nounset)" - set +u source "$pkg" - eval "$oldOpts" fi # Only dependencies whose host platform is guaranteed to match the @@ -522,10 +491,7 @@ activatePackage() { fi if [[ -f "$pkg/nix-support/setup-hook" ]]; then - local oldOpts="$(shopt -po nounset)" - set +u source "$pkg/nix-support/setup-hook" - eval "$oldOpts" fi } @@ -605,6 +571,13 @@ _addToEnv() { _addToEnv +# Unset setup-specific declared variables +unset allPlatOffsets +unset pkgBuildAccumVars pkgHostAccumVars pkgTargetAccumVars pkgAccumVarVars +unset pkgBuildHookVars pkgHostHookVars pkgTargetHookVars pkgHookVarVars +unset propagatedDepFilesVars + + _addRpathPrefix "$out" @@ -814,14 +787,17 @@ dumpVars() { # Utility function: echo the base name of the given path, with the # prefix `HASH-' removed, if present. stripHash() { - local strippedName + local strippedName casematchOpt=0 # On separate line for `set -e` - strippedName="$(basename "$1")" - if echo "$strippedName" | grep -q '^[a-z0-9]\{32\}-'; then - echo "$strippedName" | cut -c34- + strippedName="$(basename -- "$1")" + shopt -q nocasematch && casematchOpt=1 + shopt -u nocasematch + if [[ "$strippedName" =~ ^[a-z0-9]{32}- ]]; then + echo "${strippedName:33}" else echo "$strippedName" fi + if (( casematchOpt )); then shopt -s nocasematch; fi } @@ -1273,17 +1249,11 @@ showPhaseHeader() { genericBuild() { if [ -f "${buildCommandPath:-}" ]; then - local oldOpts="$(shopt -po nounset)" - set +u source "$buildCommandPath" - eval "$oldOpts" return fi if [ -n "${buildCommand:-}" ]; then - local oldOpts="$(shopt -po nounset)" - set +u eval "$buildCommand" - eval "$oldOpts" return fi @@ -1313,10 +1283,7 @@ genericBuild() { # Evaluate the variable named $curPhase if it exists, otherwise the # function named $curPhase. - local oldOpts="$(shopt -po nounset)" - set +u eval "${!curPhase:-$curPhase}" - eval "$oldOpts" if [ "$curPhase" = unpackPhase ]; then cd "${sourceRoot:-.}" |