script salida log limpiar historial guardar guarda fecha ejecutados donde consola comandos comando archivo linux shell makefile gnu-make

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 > $@