En el archivo MAKE-:
mycommand || (echo "mycommand failed $$?"; exit 1)
Cada línea en la acción del archivo MAKE invoca un nuevo shell:el error debe verificarse en la línea de acción donde falló el comando.
Si mycommand falla, la lógica se bifurca a la declaración de eco y luego sale.
Si todo lo que quieres es por el make para cancelarse si la herramienta sale con un estado distinto de cero, make ya lo hará por defecto.
Ejemplo Makefile :
a: b
@echo making example@unixlinux.online
b:
@echo making example@unixlinux.online
@false
@echo already failed
.Esto es lo que pasa con mi make :
$ make
making b
make: *** [Makefile:6: b] Error 1
Asegúrese de eliminar parcial o totalmente los objetivos creados en caso de que falle. Por ejemplo, esto
a: b
@gena $+ > example@unixlinux.online
b:
@genb > example@unixlinux.online
es incorrecto:si en el primer intento, genb falla, probablemente dejará un b incorrecto , que, en el segundo intento, make asumirá que es correcto. Entonces necesitas hacer algo como
a: b
@gena $+ > example@unixlinux.online || { rm example@unixlinux.online; exit 1; }
b:
@genb > example@unixlinux.online
Aquí hay un par de otros enfoques:
shell &.SHELLSTATUS
some_recipe:
@echo $(shell echo 'doing stuff'; exit 123)
@echo 'command exited with $(.SHELLSTATUS)'
@exit $(.SHELLSTATUS)
Salida:
$ make some_recipe
doing stuff
command exited with 123
make: *** [Makefile:4: some_recipe] Error 123
Tiene la advertencia de que el shell la salida del comando no se transmite, por lo que acaba con un volcado a la salida estándar cuando finaliza.
$?
some_recipe:
@echo 'doing stuff'; sh -c 'exit 123';\
EXIT_CODE=$$?;\
echo "command exited with $$EXIT_CODE";\
exit $$EXIT_CODE
O, un poco más fácil de leer:
.ONESHELL:
some_recipe:
@echo 'doing stuff'; sh -c 'exit 123'
@EXIT_CODE=$$?
@echo "command exited with $$EXIT_CODE"
@exit $$EXIT_CODE
Salida:
$ make some_recipe
doing stuff
command exited with 123
make: *** [Makefile:2: some_recipe] Error 123
Es esencialmente una cadena de comandos, ejecutados en el mismo shell.