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 example@unixlinux.online
b:
@echo making example@unixlinux.online
@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 $+ > example@unixlinux.online
b:
@genb > example@unixlinux.online
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 $+ > example@unixlinux.online || { rm example@unixlinux.online; exit 1; }
b:
@genb > example@unixlinux.online
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.