Skip to content

Commit a6133b7

Browse files
writers.makeScriptWriter: fix on Darwin\MacOS (#93757)
* writers.makeScriptWriter: fix on Darwin\MacOS On Darwin a script cannot be used as an interpreter in a shebang line, which causes scripts produced with makeScriptWriter (and its derivatives) to fail at run time if the used interpreter was wrapped with makeWrapper (as in the case of python3.withPackages). This commit fixes the problem by detecting if the interpreter is a script and prepending its shebang to the final interpreter line. For example if used interpreter is; ``` /nix/store/ynwv137n2650qy39swcflxbcygk5jwv1-python3-3.8.3-env/bin/python ``` which is a script with following shebang: ``` #! /nix/store/knd85yc7iwli8344ghav3zli8d9gril0-bash-4.4-p23/bin/bash -e ``` then the shebang line in the produced script will be ``` #! /nix/store/knd85yc7iwli8344ghav3zli8d9gril0-bash-4.4-p23/bin/bash -e /nix/store/ynwv137n2650qy39swcflxbcygk5jwv1-python3-3.8.3-env/bin/python ``` This works on Darwin since there does not seem to be a limit to the length of the shabang line and the shebang lines support multiple arguments to the interpreters (as opposed to linux where the kernel imposes a strict limit on shebang lengh and everything following the interpreter is passed to it as a single string). fixes; #93609 related to: #65351 #11133 (and probably a bunch of others) NOTE: scripts produced on platforms other than Darwin will remain unmodified by this PR. However it might worth considering extending this fix to BSD systems in general. I didn't do it since I have no way of testing it on systems other than MacOS and linux. * writers.makeScriptWriter: fix typo in comment * writers.makeScriptWriter: fail build if interpreter of interpreter is a script
1 parent a2ba53f commit a6133b7

1 file changed

Lines changed: 24 additions & 1 deletion

File tree

pkgs/build-support/writers/default.nix

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,30 @@ rec {
2222
inherit interpreter;
2323
contentPath = content;
2424
}) ''
25-
echo "#! $interpreter" > $out
25+
# On darwin a script cannot be used as an interpreter in a shebang but
26+
# there doesn't seem to be a limit to the size of shebang and multiple
27+
# arguments to the interpreter are allowed.
28+
if [[ -n "${toString pkgs.stdenvNoCC.isDarwin}" ]] && isScript $interpreter
29+
then
30+
wrapperInterpreterLine=$(head -1 "$interpreter" | tail -c+3)
31+
# Get first word from the line (note: xargs echo remove leading spaces)
32+
wrapperInterpreter=$(echo "$wrapperInterpreterLine" | xargs echo | cut -d " " -f1)
33+
34+
if isScript $wrapperInterpreter
35+
then
36+
echo "error: passed interpreter ($interpreter) is a script which has another script ($wrapperInterpreter) as an interpreter, which is not supported."
37+
exit 1
38+
fi
39+
40+
# This should work as long as wrapperInterpreter is a shell, which is
41+
# the case for programs wrapped with makeWrapper, like
42+
# python3.withPackages etc.
43+
interpreterLine="$wrapperInterpreterLine $interpreter"
44+
else
45+
interpreterLine=$interpreter
46+
fi
47+
48+
echo "#! $interpreterLine" > $out
2649
cat "$contentPath" >> $out
2750
${optionalString (check != "") ''
2851
${check} $out

0 commit comments

Comments
 (0)