V makefile-:
mycommand || (echo "mycommand failed $$?"; exit 1)
Každý řádek v akci makefile vyvolá nový shell - chyba musí být zkontrolována v akčním řádku, kde příkaz selhal.
Pokud příkaz mycommand selže, logika se rozvětví na příkaz echo a skončí.
Pokud vše, co chcete, je pro make
bude přerušeno, pokud nástroj skončí s nenulovým stavem, make
již to udělá ve výchozím nastavení.
Příklad Makefile
:
a: b
@echo making [email protected]
b:
@echo making [email protected]
@false
@echo already failed
.To je to, co se stane s mým make
:
$ make
making b
make: *** [Makefile:6: b] Error 1
Ujistěte se, že částečně nebo zcela vytvořené cíle jsou odstraněny v případě, že selžete. Například toto
a: b
@gena $+ > [email protected]
b:
@genb > [email protected]
je nesprávné:pokud na první pokus, genb
selže, pravděpodobně zanechá nesprávné b
, což na druhý pokus make
bude předpokládat, že je správné. Takže musíte udělat něco jako
a: b
@gena $+ > [email protected] || { rm [email protected]; exit 1; }
b:
@genb > [email protected]
Zde je několik dalších přístupů:
shell
&.SHELLSTATUS
some_recipe:
@echo $(shell echo 'doing stuff'; exit 123)
@echo 'command exited with $(.SHELLSTATUS)'
@exit $(.SHELLSTATUS)
Výstup:
$ make some_recipe
doing stuff
command exited with 123
make: *** [Makefile:4: some_recipe] Error 123
Má to výhradu, že shell
výstup příkazu není streamován, takže po dokončení skončíte s výpisem do stdout.
$?
some_recipe:
@echo 'doing stuff'; sh -c 'exit 123';\
EXIT_CODE=$$?;\
echo "command exited with $$EXIT_CODE";\
exit $$EXIT_CODE
Nebo o něco jednodušší čtení:
.ONESHELL:
some_recipe:
@echo 'doing stuff'; sh -c 'exit 123'
@EXIT_CODE=$$?
@echo "command exited with $$EXIT_CODE"
@exit $$EXIT_CODE
Výstup:
$ make some_recipe
doing stuff
command exited with 123
make: *** [Makefile:2: some_recipe] Error 123
Je to v podstatě jeden řetězec příkazů, prováděný ve stejném shellu.