Skip to content

Commit

Permalink
patch-shebangs: respect cross compilation
Browse files Browse the repository at this point in the history
This hopefully makes patchShebangs respect cross compilation. It
introduces the concept of the HOST_PATH. Nothing is ever executed on
it but instead used as a way to get the proper path using ‘command
-v’. Needs more testing.

/cc @Ericson2314 @dtzWill

Fixes NixOS#33956
Fixes NixOS#21138

(Modified backport of f069423. See
previous commit to understand the differences between this and the
original.)
  • Loading branch information
matthewbauer authored and Ericson2314 committed Sep 11, 2018
1 parent c72c865 commit e9b6300
Showing 1 changed file with 50 additions and 3 deletions.
53 changes: 50 additions & 3 deletions pkgs/build-support/setup-hooks/patch-shebangs.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -27,6 +49,14 @@ patchShebangs() {
oldInterpreterLine=$(head -1 "$f" | tail -c+3)
read -r oldPath arg0 args <<< "$oldInterpreterLine"

if [ -z "$pathName" ]; then
if [[ "$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 '-'
Expand All @@ -35,14 +65,17 @@ patchShebangs() {
echo "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

Expand All @@ -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
}

0 comments on commit e9b6300

Please sign in to comment.