-
-
Notifications
You must be signed in to change notification settings - Fork 31.9k
make sharedinstall
does not return failure if install commands fail
#100220
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
make sharedinstall
no longer returns failure if install commands failmake sharedinstall
does not retrn failure if install commands fail
make sharedinstall
does not retrn failure if install commands failmake sharedinstall
does not return failure if install commands fail
Use `set -e` before compound shell commands in order to ensure that make targets fail correctly when at least one of the subcommands fail. This is necessary since make considers a target failed only if one of the shell invocations returns with unsuccessful exit status. If a shell script does not exit explicitly, the shell uses the exit status of the *last* executed command. This means that when multiple commands are executed (e.g. through a `for` loop), the exit statuses of prior command invocations are ignored. This can be either resolved by adding an explicit `|| exit 1` to every command that is expected to succeed, or by running the whole script with `set -e`. The latter was used here as it the rules seem to be written with the assumption that individual commands were supposed to cause the make rules to fail.
Use `set -e` before compound shell commands in order to ensure that make targets fail correctly when at least one of the subcommands fail. This is necessary since make considers a target failed only if one of the shell invocations returns with unsuccessful exit status. If a shell script does not exit explicitly, the shell uses the exit status of the *last* executed command. This means that when multiple commands are executed (e.g. through a `for` loop), the exit statuses of prior command invocations are ignored. This can be either resolved by adding an explicit `|| exit 1` to every command that is expected to succeed, or by running the whole script with `set -e`. The latter was used here as it the rules seem to be written with the assumption that individual commands were supposed to cause the make rules to fail.
Set `SHELL = /bin/sh -e` to ensure that complex recipes fail on the first error rather than incorrectly reporting success. Co-authored-by: Zachary Ware <zach@python.org>
GH-100328 merged, thanks for the report and patch! I think we'll pass on backporting this; there haven't been reported problems in this vein before (though the recipes haven't changed much, so the underlying issue does exist in older branches), and there could be some lesser-used recipes that shouldn't use |
Yeah, I suppose the risk is relatively small, as it affects only a few less frequently used rules. |
Set `SHELL = /bin/sh -e` to ensure that complex recipes fail on the first error rather than incorrectly reporting success. Co-authored-by: Zachary Ware <zach@python.org>
Bug report
If
make sharedinstall
fails to install some Python extensions, the make target wrongly succeeds. For example, I'm seeing:Nevertheless,
make install
returns successfully in this case. This causes major problems for automated builds since they end up with broken Python installs when the make target should have failed.I need to investigate why it's failing but that's a separate issue.
Complete build log (1.2M): dev-lang:python-3.12.0_alpha3:20221207-142002.log
The problem seems to be that the
sharedinstall
targets runs a single shell command and make doesn't check the exit status until its very end.I suspect the same problem may apply to other install rules.
Your environment
Linked PRs
The text was updated successfully, but these errors were encountered: