linux - log - ¿Cómo obtener el estado de salida de un comando de shell utilizado en GNU Makefile?
log de comandos ejecutados linux (3)
Tengo una regla de makefile mientras ejecuto una herramienta de Linux. Necesito verificar el estado de salida del comando de la herramienta, y si ese comando falla, la marca tiene que ser abortada.
Intenté comprobarlo con $, $$? PS etc en el makefile. Pero me dan un error de sintaxis cuando se ejecuta makefile.
¿Cuál es la forma correcta de hacer esto?
Aquí está la regla relevante en Makefile
mycommand / if [ $$? -ne 0 ] / then / echo "mycommand failed" / false / fi
Aquí hay un par de otros enfoques:
shell
y .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 la salida del comando de shell
no se transmite, por lo que simplemente terminas con un volcado a la salida estándar cuando termina.
$?
some_recipe:
@echo ''doing stuff''; 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 de shell, separados por punto y coma. Escapar de las nuevas líneas que desee es molesto y es fácil olvidar los punto y coma, pero opté por este enfoque solo por la advertencia mencionada anteriormente.
En el makefile-:
mycommand || (echo "mycommand failed $$?"; exit 1)
Cada línea en la acción de makefile invoca un nuevo shell: el error se debe verificar en la línea de acción donde el comando falló.
Si mycommand falla, la lógica se ramifica a la instrucción echo y luego sale.
Si todo lo que desea es que la make
sea abortada si la herramienta sale con un estado distinto de cero, la make
ya lo hará de forma predeterminada.
Ejemplo de Makefile
:
a: b
@echo making $@
b:
@echo making $@
@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 los objetivos creados parcial o totalmente en caso de que falle. Por ejemplo, este
a: b
@gena $+ > $@
b:
@genb > $@
es incorrecto: si en el primer intento, genb
falla, probablemente dejará una b
incorrecta que, en el segundo intento, supondrá que es correcta. Así que necesitas hacer algo como
a: b
@gena $+ > $@ || { rm $@; exit 1; }
b:
@genb > $@