| { lib |
| , makeBinaryWrapper |
| , writeShellApplication |
| , bash |
| , stdenv |
| , |
| }: |
| { defaultShellUtils }: |
| let |
| defaultShellPath = lib.makeBinPath defaultShellUtils; |
| |
| bashWithDefaultShellUtilsSh = writeShellApplication { |
| name = "bash"; |
| runtimeInputs = defaultShellUtils; |
| # Empty PATH in Nixpkgs Bash is translated to /no-such-path |
| # On other distros empty PATH search fallback is looking in standard |
| # locations like /bin,/usr/bin |
| # For Bazel many rules rely on such search finding some common utils, |
| # so we provide them in case rules or arguments didn't specify a precise PATH |
| text = '' |
| if [[ "$PATH" == "/no-such-path" ]]; then |
| export PATH=${defaultShellPath} |
| fi |
| exec ${bash}/bin/bash "$@" |
| ''; |
| }; |
| |
| in |
| { |
| inherit defaultShellUtils defaultShellPath; |
| # Script-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 |
| ''; |
| }; |
| } |