Estoy tratando de indicarle a GNU Make 3.81 que no se detenga si falla un comando (así que prefiero el comando con -
), pero también quiero verificar el estado de salida en el siguiente comando e imprimir un mensaje más informativo. Sin embargo, mi Makefile a continuación falla:
$ cat Makefile
all:
-/bin/false
([ $$? -eq 0 ] && echo "success!") || echo "failure!"
$
$ make
/bin/false
make: [all] Error 1 (ignored)
([ $? -eq 0 ] && echo "success!") || echo "failure!"
success!
¿Por qué el Makefile anterior hace eco de "éxito"! en lugar de "fracaso" ?
actualizar:
A continuación y ampliando la respuesta aceptada, a continuación se explica cómo debe escribirse:
failure:
@-/bin/false && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
success:
@-/bin/true && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
.ONESHELL:
directiva..SHELLFLAGS = -ec
debe utilizar. Pero en este caso no puede usar el-
prefijo más (para el comando personal del recibo) porque la marca escribirá que el error se ignora pero aún fallará todo el bloque. Entonces,|| :
es una la solución para ignorar el comando. Pero no es multiplataforma (Windows no tiene|| :
o|| true
)Respuestas:
Cada comando de actualización en una regla de Makefile se ejecuta en un shell separado. Entonces $? no contiene el estado de salida del comando fallido anterior, contiene el valor predeterminado para $? en una nueva concha. Es por eso que tu [$? -eq 0] la prueba siempre tiene éxito.
fuente
No necesita la prueba de
$?
ya que&&
funciona si$?
es cero y||
se procede en caso de un valor de retorno distinto de cero.Y no necesita el signo menos, ya que el valor de retorno para realizar se toma de la última llamada al programa de la línea. Entonces esto funciona bien
fracaso:
éxito:
Sucede lo contrario: si quieres hacer tu propio mensaje y quieres interrumpir el proceso de creación de todos modos con un valor distinto de cero, debes escribir algo como esto:
fracaso:
fuente
Desde la documentación de GNU make :
Para utilizar
make
el estado de salida de un caso como este, ejecutemake
desde un script:Y haga que su Makefile contenga:
fuente