Di makefile-:
mycommand || (echo "mycommand failed $$?"; exit 1)
Setiap baris dalam tindakan makefile memanggil shell baru - kesalahan harus diperiksa di baris tindakan di mana perintah gagal.
Jika mycommand gagal, cabang logika ke pernyataan gema lalu keluar.
Jika semua yang Anda inginkan adalah untuk make
untuk dibatalkan jika alat keluar dengan status bukan nol, make
sudah akan melakukannya secara default.
Contoh Makefile
:
a: b
@echo making [email protected]
b:
@echo making [email protected]
@false
@echo already failed
.Inilah yang terjadi dengan make
saya :
$ make
making b
make: *** [Makefile:6: b] Error 1
Pastikan target yang dibuat sebagian atau seluruhnya dihapus jika Anda gagal. Misalnya, ini
a: b
@gena $+ > [email protected]
b:
@genb > [email protected]
salah:jika pada percobaan pertama, genb
gagal, mungkin akan meninggalkan b
yang salah , yang, pada percobaan kedua, make
akan menganggap benar. Jadi, Anda perlu melakukan sesuatu seperti
a: b
@gena $+ > [email protected] || { rm [email protected]; exit 1; }
b:
@genb > [email protected]
Berikut beberapa pendekatan lainnya:
shell
&.SHELLSTATUS
some_recipe:
@echo $(shell echo 'doing stuff'; exit 123)
@echo 'command exited with $(.SHELLSTATUS)'
@exit $(.SHELLSTATUS)
Keluaran:
$ make some_recipe
doing stuff
command exited with 123
make: *** [Makefile:4: some_recipe] Error 123
Itu memang memiliki peringatan bahwa shell
output perintah tidak dialirkan, jadi Anda hanya berakhir dengan dump ke stdout setelah selesai.
$?
some_recipe:
@echo 'doing stuff'; sh -c 'exit 123';\
EXIT_CODE=$$?;\
echo "command exited with $$EXIT_CODE";\
exit $$EXIT_CODE
Atau, sedikit lebih mudah dibaca:
.ONESHELL:
some_recipe:
@echo 'doing stuff'; sh -c 'exit 123'
@EXIT_CODE=$$?
@echo "command exited with $$EXIT_CODE"
@exit $$EXIT_CODE
Keluaran:
$ make some_recipe
doing stuff
command exited with 123
make: *** [Makefile:2: some_recipe] Error 123
Ini pada dasarnya adalah satu rangkaian perintah, dieksekusi di shell yang sama.