diff --git a/pkgs/build-support/bintools-wrapper/setup-hook.sh b/pkgs/build-support/bintools-wrapper/setup-hook.sh index 43f79ec59200..c508963ac33e 100644 --- a/pkgs/build-support/bintools-wrapper/setup-hook.sh +++ b/pkgs/build-support/bintools-wrapper/setup-hook.sh @@ -2,12 +2,17 @@ # # See comments in cc-wrapper's setup hook. This works exactly the same way. +set -u + +# Skip setup hook if we're not a build-time dep +(( "$hostOffset" < 0 )) || return 0 + bintoolsWrapper_addLDVars () { - case $depOffset in + case $depHostOffset in -1) local role='BUILD_' ;; 0) local role='' ;; 1) local role='TARGET_' ;; - *) echo "bintools-wrapper: Error: Cannot be used with $depOffset-offset deps, " >2; + *) echo "bintools-wrapper: Error: Cannot be used with $depHostOffset-offset deps" >2; return 1 ;; esac @@ -20,17 +25,29 @@ bintoolsWrapper_addLDVars () { fi } -if [ -n "${crossConfig:-}" ]; then - export NIX_BINTOOLS_WRAPPER_@infixSalt@_TARGET_BUILD=1 - role_pre='BUILD_' - role_post='_FOR_BUILD' -else - export NIX_BINTOOLS_WRAPPER_@infixSalt@_TARGET_HOST=1 - role_pre="" - role_post='' -fi +case $targetOffset in + -1) + export NIX_BINTOOLS_WRAPPER_@infixSalt@_TARGET_BUILD=1 + role_pre='BUILD_' + role_post='_FOR_BUILD' + ;; + 0) + export NIX_BINTOOLS_WRAPPER_@infixSalt@_TARGET_HOST=1 + role_pre='' + role_post='' + ;; + 1) + export NIX_BINTOOLS_WRAPPER_@infixSalt@_TARGET_TARGET=1 + role_pre='TARGET_' + role_post='_FOR_TARGET' + ;; + *) + echo "cc-wrapper: used as improper sort of dependency" >2; + return 1 + ;; +esac -envHooks+=(bintoolsWrapper_addLDVars) +addEnvHooks "$targetOffset" bintoolsWrapper_addLDVars # shellcheck disable=SC2157 if [ -n "@bintools_bin@" ]; then @@ -65,3 +82,4 @@ done # No local scope in sourced file unset -v role_pre role_post cmd upper_case +set +u diff --git a/pkgs/build-support/cc-wrapper/setup-hook.sh b/pkgs/build-support/cc-wrapper/setup-hook.sh index a922193ad2e7..17877dc262c5 100644 --- a/pkgs/build-support/cc-wrapper/setup-hook.sh +++ b/pkgs/build-support/cc-wrapper/setup-hook.sh @@ -54,19 +54,23 @@ # For more details, read the individual files where the mechanisms used to # accomplish this will be individually documented. +set -u + +# Skip setup hook if we're not a build-time dep +(( "$hostOffset" < 0 )) || return 0 # It's fine that any other cc-wrapper will redefine this. Bash functions close # over no state, and there's no @-substitutions within, so any redefined # function is guaranteed to be exactly the same. ccWrapper_addCVars () { - # The `depOffset` describes how the platforms of the dependencies are slid - # relative to the depending package. It is brought into scope of the - # environment hook defined as the role of the dependency being applied. - case $depOffset in + # The `depHostOffset` describes how the host platform of the dependencies + # are slid relative to the depending package. It is brought into scope of + # the environment hook defined as the role of the dependency being applied. + case $depHostOffset in -1) local role='BUILD_' ;; 0) local role='' ;; 1) local role='TARGET_' ;; - *) echo "cc-wrapper: Error: Cannot be used with $depOffset-offset deps, " >2; + *) echo "cc-wrapper: Error: Cannot be used with $depHostOffset-offset deps" >2; return 1 ;; esac @@ -87,20 +91,31 @@ ccWrapper_addCVars () { # # We also need to worry about what role is being added on *this* invocation of # setup-hook, which `role` tracks. -if [ -n "${crossConfig:-}" ]; then - export NIX_CC_WRAPPER_@infixSalt@_TARGET_BUILD=1 - role_pre='BUILD_' - role_post='_FOR_BUILD' -else - export NIX_CC_WRAPPER_@infixSalt@_TARGET_HOST=1 - role_pre='' - role_post='' -fi +case $targetOffset in + -1) + export NIX_CC_WRAPPER_@infixSalt@_TARGET_BUILD=1 + role_pre='BUILD_' + role_post='_FOR_BUILD' + ;; + 0) + export NIX_CC_WRAPPER_@infixSalt@_TARGET_HOST=1 + role_pre='' + role_post='' + ;; + 1) + export NIX_CC_WRAPPER_@infixSalt@_TARGET_TARGET=1 + role_pre='TARGET_' + role_post='_FOR_TARGET' + ;; + *) + echo "cc-wrapper: used as improper sort of dependency" >2; + return 1 + ;; +esac -# Eventually the exact sort of env-hook we create will depend on the role. This -# is because based on what relative platform we are targeting, we use different -# dependencies. -envHooks+=(ccWrapper_addCVars) +# We use the `targetOffset` to choose the right env hook to accumulate the right +# sort of deps (those with that offset). +addEnvHooks "$targetOffset" ccWrapper_addCVars # Note 1: these come *after* $out in the PATH (see setup.sh). # Note 2: phase separation makes this look useless to shellcheck. @@ -131,3 +146,4 @@ export CXX${role_post}=@named_cxx@ # No local scope in sourced file unset -v role_pre role_post +set +u diff --git a/pkgs/stdenv/generic/setup.sh b/pkgs/stdenv/generic/setup.sh index b2b15c74d4e8..1850d322cc69 100644 --- a/pkgs/stdenv/generic/setup.sh +++ b/pkgs/stdenv/generic/setup.sh @@ -326,6 +326,17 @@ declare -ra pkgTargetHookVars=(envTargetTargetHook) declare -ra pkgHookVarVars=(pkgBuildHookVars pkgHostHookVars pkgTargetHookVars) +# Add env hooks for all sorts of deps with the specified host offset. +addEnvHooks() { + local depHostOffset="$1" + shift + local pkgHookVarsSlice="${pkgHookVarVars[$depHostOffset + 1]}[@]" + local pkgHookVar + for pkgHookVar in "${!pkgHookVarsSlice}"; do + eval "${pkgHookVar}s"'+=("$@")' + done +} + # Propagated dep files