Im Makefile-:
mycommand || (echo "mycommand failed $$?"; exit 1)
Jede Zeile in der Makefile-Aktion ruft eine neue Shell auf - der Fehler muss in der Aktionszeile überprüft werden, in der der Befehl fehlgeschlagen ist.
Wenn mycommand fehlschlägt, verzweigt die Logik zur echo-Anweisung und wird dann beendet.
Wenn Sie nur nach make
wollen abzubrechen, wenn das Tool mit einem Status ungleich Null beendet wird, make
wird dies bereits standardmäßig tun.
Beispiel Makefile
:
a: b
@echo making [email protected]
b:
@echo making [email protected]
@false
@echo already failed
.Das passiert mit meinem make
:
$ make
making b
make: *** [Makefile:6: b] Error 1
Stellen Sie sicher, dass teilweise oder vollständig erstellte Ziele entfernt werden, falls Sie scheitern. Zum Beispiel diese
a: b
@gena $+ > [email protected]
b:
@genb > [email protected]
ist falsch:beim ersten Versuch genb
fehlschlägt, wird wahrscheinlich ein falscher b
hinterlassen , was beim zweiten Versuch make
ist wird davon ausgehen, dass es richtig ist. Sie müssen also so etwas tun wie
a: b
@gena $+ > [email protected] || { rm [email protected]; exit 1; }
b:
@genb > [email protected]
Hier sind ein paar andere Ansätze:
shell
&.SHELLSTATUS
some_recipe:
@echo $(shell echo 'doing stuff'; exit 123)
@echo 'command exited with $(.SHELLSTATUS)'
@exit $(.SHELLSTATUS)
Ausgabe:
$ make some_recipe
doing stuff
command exited with 123
make: *** [Makefile:4: some_recipe] Error 123
Es hat den Vorbehalt, dass der shell
Die Befehlsausgabe wird nicht gestreamt, daher erhalten Sie am Ende nur einen Speicherauszug nach stdout.
$?
some_recipe:
@echo 'doing stuff'; sh -c 'exit 123';\
EXIT_CODE=$$?;\
echo "command exited with $$EXIT_CODE";\
exit $$EXIT_CODE
Oder etwas einfacher zu lesen:
.ONESHELL:
some_recipe:
@echo 'doing stuff'; sh -c 'exit 123'
@EXIT_CODE=$$?
@echo "command exited with $$EXIT_CODE"
@exit $$EXIT_CODE
Ausgabe:
$ make some_recipe
doing stuff
command exited with 123
make: *** [Makefile:2: some_recipe] Error 123
Es ist im Wesentlichen eine Reihe von Befehlen, die in derselben Shell ausgeführt werden.