Nel makefile-:
mycommand || (echo "mycommand failed $$?"; exit 1)
Ogni riga nell'azione makefile richiama una nuova shell:l'errore deve essere verificato nella riga dell'azione in cui il comando non è riuscito.
Se mycommand fallisce, la logica passa all'istruzione echo quindi esce.
Se tutto quello che vuoi è per il make
essere interrotto se lo strumento esce con uno stato diverso da zero, make
lo farà già per impostazione predefinita.
Esempio Makefile
:
a: b
@echo making [email protected]
b:
@echo making [email protected]
@false
@echo already failed
.Questo è quello che succede con il mio make
:
$ make
making b
make: *** [Makefile:6: b] Error 1
Assicurati che gli obiettivi parzialmente o interamente creati vengano rimossi in caso di fallimento. Ad esempio, questo
a: b
@gena $+ > [email protected]
b:
@genb > [email protected]
non è corretto:se al primo tentativo, genb
fallisce, probabilmente lascerà un b
errato , che, al secondo tentativo, make
presumerà che sia corretto. Quindi devi fare qualcosa come
a: b
@gena $+ > [email protected] || { rm [email protected]; exit 1; }
b:
@genb > [email protected]
Ecco un paio di altri approcci:
shell
&.SHELLSTATUS
some_recipe:
@echo $(shell echo 'doing stuff'; exit 123)
@echo 'command exited with $(.SHELLSTATUS)'
@exit $(.SHELLSTATUS)
Uscita:
$ make some_recipe
doing stuff
command exited with 123
make: *** [Makefile:4: some_recipe] Error 123
Ha l'avvertenza che shell
l'output del comando non viene trasmesso in streaming, quindi ti ritroverai con un dump su stdout quando finisce.
$?
some_recipe:
@echo 'doing stuff'; sh -c 'exit 123';\
EXIT_CODE=$$?;\
echo "command exited with $$EXIT_CODE";\
exit $$EXIT_CODE
Oppure, un po' più facile da leggere:
.ONESHELL:
some_recipe:
@echo 'doing stuff'; sh -c 'exit 123'
@EXIT_CODE=$$?
@echo "command exited with $$EXIT_CODE"
@exit $$EXIT_CODE
Uscita:
$ make some_recipe
doing stuff
command exited with 123
make: *** [Makefile:2: some_recipe] Error 123
È essenzialmente una stringa di comandi, eseguita nella stessa shell.