web-dev-qa-db-fra.com

Supprimer et ignorer la sortie pour Makefile?

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.

39
Andrew Lee

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:

  1. Une partie de la construction est cassée et vous voulez quand même continuer, auquel cas vous avez appris à faire . La construction est cassée et doit être réparée, et non pas bandaided d'une manière incontrôlable.
  2. Une commande renvoie un code de sortie non nul même si elle a fait exactement ce que vous vouliez, auquel cas vous ne voulez pas vraiment que Make émette un avertissement.

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.

52
andrewdotn

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.

9
Eric Melski