From bde99096a80e74692795fa2782619c46a476839e Mon Sep 17 00:00:00 2001 From: Matthew Bauer Date: Wed, 31 Oct 2018 15:17:24 -0500 Subject: [PATCH 1/3] Revert "Revert "patch-shebangs: respect cross compilation"" This reverts commit 9c4b11e9a060de2175aef4d36881f97812ab17fe. --- .../setup-hooks/patch-shebangs.sh | 53 +++++++++++++++++-- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/pkgs/build-support/setup-hooks/patch-shebangs.sh b/pkgs/build-support/setup-hooks/patch-shebangs.sh index d26bf735d30..441f230869b 100644 --- a/pkgs/build-support/setup-hooks/patch-shebangs.sh +++ b/pkgs/build-support/setup-hooks/patch-shebangs.sh @@ -5,10 +5,32 @@ # rewritten to /nix/store//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 +} From eb7c50a993833ecdb94cc3affb55ac4c560edf50 Mon Sep 17 00:00:00 2001 From: Matthew Bauer Date: Wed, 31 Oct 2018 15:34:45 -0500 Subject: [PATCH 2/3] patch-shebangs: use --build for auto patch shebangs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In strictDeps=false, autoPatchshebangs should use --build (corresponding to PATH) to lookup commands. This restores the previous behavior of patchshebangs so that we don’t break stuff that isn’t careful in the buildInputs vs. nativeBuildInputs distinction. Unfortunately this won’t work under cross compilation. --- pkgs/build-support/setup-hooks/patch-shebangs.sh | 4 +++- pkgs/stdenv/generic/setup.sh | 8 -------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/pkgs/build-support/setup-hooks/patch-shebangs.sh b/pkgs/build-support/setup-hooks/patch-shebangs.sh index 441f230869b..b35c3c87625 100644 --- a/pkgs/build-support/setup-hooks/patch-shebangs.sh +++ b/pkgs/build-support/setup-hooks/patch-shebangs.sh @@ -102,10 +102,12 @@ patchShebangs() { patchShebangsAuto () { if [ -z "$dontPatchShebangs" -a -e "$prefix" ]; then + if [ -z "${strictDeps-}"]; then + patchShebangs --build "$prefix" # 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 + elif [ "$output" != out ] && [ "$output" = "${!outputDev}" ]; then patchShebangs --build "$prefix" else patchShebangs --host "$prefix" diff --git a/pkgs/stdenv/generic/setup.sh b/pkgs/stdenv/generic/setup.sh index 8af369b1d17..81c1725f1d1 100644 --- a/pkgs/stdenv/generic/setup.sh +++ b/pkgs/stdenv/generic/setup.sh @@ -257,17 +257,9 @@ shopt -s nullglob # Set up the initial path. PATH= -HOST_PATH= for i in $initialPath; do if [ "$i" = / ]; then i=; fi addToSearchPath PATH "$i/bin" - - # For backward compatibility, we add initial path to HOST_PATH so - # it can be used in auto patch-shebangs. Unfortunately this will - # not work with cross compilation. - if [ -z "${strictDeps-}" ]; then - addToSearchPath HOST_PATH "$i/bin" - fi done if (( "${NIX_DEBUG:-0}" >= 1 )); then From 2f2e635dd5431859a01bbbcae0493be90041d495 Mon Sep 17 00:00:00 2001 From: Matthew Bauer Date: Wed, 31 Oct 2018 15:35:34 -0500 Subject: [PATCH 3/3] darwin/stdenv: bash is a build input patch shebangs needs to be in build inputs for it to get into HOST_PATH. --- pkgs/stdenv/darwin/default.nix | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/stdenv/darwin/default.nix b/pkgs/stdenv/darwin/default.nix index 5fb410b64eb..d9b3c7dd29f 100644 --- a/pkgs/stdenv/darwin/default.nix +++ b/pkgs/stdenv/darwin/default.nix @@ -278,8 +278,8 @@ in rec { # enables patchShebangs above. Unfortunately, patchShebangs ignores our $SHELL setting # and instead goes by $PATH, which happens to contain bootstrapTools. So it goes and # patches our shebangs back to point at bootstrapTools. This makes sure bash comes first. - extraNativeBuildInputs = with pkgs; [ xz pkgs.bash ]; - extraBuildInputs = [ pkgs.darwin.CF ]; + extraNativeBuildInputs = with pkgs; [ xz ]; + extraBuildInputs = [ pkgs.darwin.CF pkgs.bash ]; libcxx = pkgs.libcxx; extraPreHook = '' @@ -335,8 +335,8 @@ in rec { }; in with prevStage; stageFun 4 prevStage { shell = "${pkgs.bash}/bin/bash"; - extraNativeBuildInputs = with pkgs; [ xz pkgs.bash ]; - extraBuildInputs = [ pkgs.darwin.CF ]; + extraNativeBuildInputs = with pkgs; [ xz ]; + extraBuildInputs = [ pkgs.darwin.CF pkgs.bash ]; libcxx = pkgs.libcxx; extraPreHook = ''