Je sais que le @
le préfixe supprime la sortie d'une commande Shell dans Makefiles, et aussi que le -
le préfixe ignorera les erreurs d'une commande Shell. Existe-t-il un moyen de combiner les deux, c'est-à-dire un préfixe qui supprime la sortie et ignore les erreurs? Je ne pense pas @-
ou -@
travaux.
En fait, @-
Et -@
Fonctionnent tous les deux, mais afficheront un avertissement make: [target] Error 1 (ignored)
.
Au lieu de cela, vous pouvez utiliser
@command || true
ou, puisque :
est un raccourci pour true
dans Shell,
@command ||:
C'est souvent une meilleure chose à faire, car cela évite l'avertissement confus de Make qu'une erreur a été ignorée dans une commande invisible.
Considérez les deux cas les plus courants où vous voudrez peut-être ignorer la valeur de retour d'une commande:
Pour le deuxième cas, considérons l'exemple de la récupération des avertissements dans le fichier journal produit par une commande. grep
renverra une erreur s'il ne trouve pas de correspondance, ce qui n'est pas ce que vous voulez:
.PHONY: all one two three
all: at-warning at-success or-success or-warning
at-%: %.log
@echo Making $@
@-grep ^Warning $<
or-%: %.log
@echo Making $@
@grep ^Warning $< ||:
success.log:
echo 'Success!' > $@
warning.log:
echo 'Warning: foo' > $@
clean::
rm -f {success,warning.log}
produit:
echo 'Warning: foo' > warning.log
Making at-warning
Warning: foo
Making at-success
make: [at-success] Error 1 (ignored)
Making or-success
Making or-warning
Warning: foo
L'utilisation de @-
Génère un avertissement d'erreur ignoré non sensé en cas de succès, tandis que || true
Gère à la fois les avertissements et l'absence d'avertissements sans se plaindre.
Théoriquement, l'utilisation de || true
Est plus lente que l'utilisation de @-
, Mais cette surcharge ne risque pas d'être un goulot d'étranglement dans les systèmes de construction bien conçus et maintenus. La grande majorité du temps devrait être consacrée à la construction ou à la vérification d'horodatages lorsqu'il n'y a rien à créer, et non à l'exécution des milliers de commandes rapides dont les valeurs de retour sont ignorées, ce qui serait nécessaire pour que cela ait un impact mesurable sur les performances.
GNU make vous permet de combiner les deux @
et -
:
all:
@-exit 1
L'exécution de ceci avec gmake 3.81 produit cette sortie:
gmake: [tous] Erreur 1 (ignoré)
Comme vous pouvez le voir, la commande n'est pas répercutée et l'erreur est ignorée comme prévu.