J'essaie de demander à GNU Make 3.81 de ne pas s'arrêter si une commande échoue (donc je préfixe la commande avec -
) mais je veux également vérifier l'état de sortie sur la commande suivante et imprimer un message plus informatif. Cependant mon Makefile ci-dessous échoue:
$ 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!
Pourquoi le Makefile ci-dessus fait-il écho au "succès!" au lieu de "l'échec!" ?
mise à jour:
En suivant et en développant la réponse acceptée, voici comment elle doit être écrite:
failure:
@-/bin/false && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
success:
@-/bin/true && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
.ONESHELL:
directive..SHELLFLAGS = -ec
il faut utiliser. Mais dans ce cas, vous ne pouvez plus utiliser le-
préfixe (pour la commande personnelle du reçu) car la marque écrira que l'erreur est ignorée mais échouera tout le bloc. C'est donc|| :
la solution pour ignorer la commande. Mais ce n'est pas multiplateforme (Windows n'a pas|| :
ou|| true
)Réponses:
Chaque commande de mise à jour dans une règle Makefile est exécutée dans un shell séparé. Alors $? ne contient pas l'état de sortie de la commande précédente ayant échoué, il contient la valeur par défaut de $? dans une nouvelle coque. C'est pourquoi votre [$? -eq 0] le test réussit toujours.
la source
Vous n'avez pas besoin du test de
$?
puisque&&
fonctionne si$?
est nul et||
se poursuit en cas de valeur de retour non nulle.Et vous n'avez pas besoin du moins car la valeur de retour à faire est prise lors du dernier appel de programme de la ligne. Donc ça marche bien
échec:
Succès:
L'inverse se produit: si vous voulez faire votre propre message et que vous souhaitez quand même interrompre le processus de création avec une valeur non nulle, vous devez écrire quelque chose comme ceci:
échec:
la source
Depuis la documentation de GNU make :
Pour utiliser
make
l'état de sortie de dans un cas comme celui-ci, exécutez àmake
partir d'un script:Et que votre Makefile contienne:
la source