Skip to content

Commit

Permalink
bazel_6: fix: make patched bash a native binary
Browse files Browse the repository at this point in the history
https://hydra.nixos.org/build/240805256/nixlog/1
https://hydra.nixos.org/build/240805170/nixlog/2
Failure is a bit obscured but long story short, a script within
bazel gets custom nixpkgs shebang which in turn makes shell run
in POSIX-compatible mode. Bazel expects bash in non-POSIX mode
and osx-specific script starts to fail due to `set -e` and subshell
interaction differences in those modes (sub-shells and functions
suddently start inheriting `set -e` and fail to produce desired
output). More debug info is available in #267670

Shell scripts aren't guaranteed to work as interpreters in shebang.
In particular thin shell wrappers aren't shebang-ready on MacOS.
It may work sometimes depending on what exactly would try to execute
a script with such shebang, but generally it's not guaranteed to work.
See #124556

Bash wrapper was introduced in #266847 and so far seems like the
issue only affects darwin builds: hydra failure is in osx-specific
script, also shebang issue is usually darwin-specific.

Let's wrap it as a native binary to make it shebang-compatible.

The wrapper is only currently added to `bazel_6` so no need for
changes in other versions.

ZHF: #265948
(cherry picked from commit 7377bba)
  • Loading branch information
boltzmannrain authored and bjornfor committed Dec 7, 2023
1 parent a562ee5 commit 8222982
Showing 1 changed file with 13 additions and 1 deletion.
14 changes: 13 additions & 1 deletion pkgs/development/tools/build-managers/bazel/bazel_6/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
, substituteAll
, writeTextFile
, writeShellApplication
, makeBinaryWrapper
}:

let
Expand Down Expand Up @@ -129,7 +130,7 @@ let

defaultShellPath = lib.makeBinPath defaultShellUtils;

bashWithDefaultShellUtils = writeShellApplication {
bashWithDefaultShellUtilsSh = writeShellApplication {
name = "bash";
runtimeInputs = defaultShellUtils;
text = ''
Expand All @@ -140,6 +141,17 @@ let
'';
};

# Sript-based interpreters in shebangs aren't guaranteed to work,
# especially on MacOS. So let's produce a binary
bashWithDefaultShellUtils = stdenv.mkDerivation {
name = "bash";
src = bashWithDefaultShellUtilsSh;
nativeBuildInputs = [ makeBinaryWrapper ];
buildPhase = ''
makeWrapper ${bashWithDefaultShellUtilsSh}/bin/bash $out/bin/bash
'';
};

platforms = lib.platforms.linux ++ lib.platforms.darwin;

system = if stdenv.hostPlatform.isDarwin then "darwin" else "linux";
Expand Down

0 comments on commit 8222982

Please sign in to comment.