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 [email protected]
b:
@echo making [email protected]
@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 $+ > [email protected]
b:
@genb > [email protected]
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 $+ > [email protected] || { rm [email protected]; exit 1; }
b:
@genb > [email protected]
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.