Commit a036473a authored by John Ericson's avatar John Ericson
Browse files

{bintools,cc}-wrapper: Fix setup hook to respect the role of the cc-compiler

We now have the information to properly determine the role the
cc-wrapper dependency has, by taking advantage of `offset`. No longer
use the soon-to-be-deprecated crossConfig environment variable, the
temp hack used before this change.
parent 7f3ca3e2
Loading
Loading
Loading
Loading
+30 −12
Original line number Diff line number Diff line
@@ -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
case $targetOffset in
    -1)
        export NIX_BINTOOLS_WRAPPER_@infixSalt@_TARGET_BUILD=1
        role_pre='BUILD_'
        role_post='_FOR_BUILD'
else
        ;;
    0)
        export NIX_BINTOOLS_WRAPPER_@infixSalt@_TARGET_HOST=1
    role_pre=""
        role_pre=''
        role_post=''
fi
        ;;
    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
+34 −18
Original line number Diff line number Diff line
@@ -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
case $targetOffset in
    -1)
        export NIX_CC_WRAPPER_@infixSalt@_TARGET_BUILD=1
        role_pre='BUILD_'
        role_post='_FOR_BUILD'
else
        ;;
    0)
        export NIX_CC_WRAPPER_@infixSalt@_TARGET_HOST=1
        role_pre=''
        role_post=''
fi
        ;;
    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
+11 −0
Original line number Diff line number Diff line
@@ -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