Commit 61bc03c0 authored by Matthew Bauer's avatar Matthew Bauer
Browse files

Revert "Revert "patch-shebangs: respect cross compilation""

This reverts commit 9c4b11e9.
parent 2ecc1d15
Loading
Loading
Loading
Loading
+50 −3
Original line number Diff line number Diff line
@@ -5,10 +5,32 @@
# rewritten to /nix/store/<hash>/bin/python.  Interpreters that are
# already in the store are left untouched.

fixupOutputHooks+=('if [ -z "$dontPatchShebangs" -a -e "$prefix" ]; then patchShebangs "$prefix"; fi')
fixupOutputHooks+=(patchShebangsAuto)

# Run patch shebangs on a directory.
# patchShebangs [--build | --host] directory

# Flags:
# --build : Lookup commands available at build-time
# --host  : Lookup commands available at runtime

# Example use cases,
# $ patchShebangs --host /nix/store/...-hello-1.0/bin
# $ patchShebangs --build configure

patchShebangs() {
    local pathName

    if [ "$1" = "--host" ]; then
        pathName=HOST_PATH
        shift
    elif [ "$1" = "--build" ]; then
        pathName=PATH
        shift
    fi

    local dir="$1"

    header "patching script interpreter paths in $dir"
    local f
    local oldPath
@@ -27,6 +49,14 @@ patchShebangs() {
        oldInterpreterLine=$(head -1 "$f" | tail -c+3)
        read -r oldPath arg0 args <<< "$oldInterpreterLine"

        if [ -z "$pathName" ]; then
            if [ -n "$strictDeps" ] && [[ "$f" = "$NIX_STORE"* ]]; then
                pathName=HOST_PATH
            else
                pathName=PATH
            fi
        fi

        if $(echo "$oldPath" | grep -q "/bin/env$"); then
            # Check for unsupported 'env' functionality:
            # - options: something starting with a '-'
@@ -35,14 +65,17 @@ patchShebangs() {
                echo "$f: unsupported interpreter directive \"$oldInterpreterLine\" (set dontPatchShebangs=1 and handle shebang patching yourself)"
                exit 1
            fi
            newPath="$(command -v "$arg0" || true)"

            newPath="$(PATH="${!pathName}" command -v "$arg0" || true)"
        else
            if [ "$oldPath" = "" ]; then
                # If no interpreter is specified linux will use /bin/sh. Set
                # oldpath="/bin/sh" so that we get /nix/store/.../sh.
                oldPath="/bin/sh"
            fi
            newPath="$(command -v "$(basename "$oldPath")" || true)"

            newPath="$(PATH="${!pathName}" command -v "$(basename "$oldPath")" || true)"

            args="$arg0 $args"
        fi

@@ -65,3 +98,17 @@ patchShebangs() {

    stopNest
}

patchShebangsAuto () {
    if [ -z "$dontPatchShebangs" -a -e "$prefix" ]; then

        # Dev output will end up being run on the build platform. An
        # example case of this is sdl2-config. Otherwise, we can just
        # use the runtime path (--host).
        if [ "$output" != out ] && [ "$output" = "${!outputDev}" ]; then
            patchShebangs --build "$prefix"
        else
            patchShebangs --host "$prefix"
        fi
    fi
}