Je me demande comment éviter l'écho dans un Makefile:
clean:
rm -fr *.o
cette règle imprimera:
$>make clean
rm -fr *.o
$>
Comment puis-je éviter cela?
En fait, je cherchais autre chose, en ajoutant cette ligne au Makefile:
.SILENT:clean
tout en exécutant chaque étape de la cible "propre" en silence.
Jusqu'à ce que quelqu'un pointe un inconvénient à cela, je l'utilise comme ma solution préférée!
Pour commencer: la commande réelle doit être sur la ligne suivante (ou du moins c'est le cas avec GNU Make, cela pourrait être différent avec d'autres Make's - je n'en suis pas sûr))
clean:
rm -rf *.o
(notez, vous avez besoin d'un TAB avant rm -rf *.o
comme dans toutes les règles)
Le rendre silencieux peut être fait en préfixant un @
:
donc votre makefile devient
clean:
@rm -rf *.o
S'il n'y a pas de *.o
fichiers à supprimer, vous pourriez toujours vous retrouver avec un message d'erreur. Pour les supprimer, ajoutez ce qui suit
clean:
-@rm -rf *.o 2>/dev/null || true
2>/dev/null
envoie tout message d'erreur à/dev/null - vous ne verrez donc aucune erreur-
devant la commande s'assure que make
ignore un code retour différent de zéroJe réponds à ce sujet ancien, car il revient haut dans la recherche et les réponses prêtent à confusion. Pour faire exactement ce que l'utilisateur veut, il suffit de:
clean:
@rm -f *.o
Le @ signifie que make ne fera pas écho à cette commande. Le -f
l'argument de rm
indique à rm
d'ignorer toutes les erreurs, comme s'il n'y avait pas de *.o
fichiers, et pour toujours réussir.
J'ai supprimé le -r de l'exemple OP, car cela signifie récursif et nous ne sommes ici que rm
ing .o
fichiers, rien à redire.
Pas besoin de 2>&1 >/dev/null
car avec le -f
aucune erreur ne sera imprimée.
.SILENT: clean
fonctionne à la place du @
, mais il n'est pas au même endroit dans le Makefile que la commande qu'il affecte, donc quelqu'un qui gère le projet plus tard pourrait être confus. C'est pourquoi @ est préféré. C'est une meilleure localité de référence.
Si vous mettez un @ devant la commande, il ne se répercute pas sur le Shell. Essayez de changer rm en @rm. (Référence)
Dans le manuel: .SILENT
est essentiellement obsolète puisque @
est plus flexible.
Le pire est que make imprime beaucoup trop d'informations. Les messages d'avertissement/d'erreur/privés sont enfouis dans la sortie. D'autre part -s
(.SILENT
) supprime n'importe quoi. Surtout les messages "rien à faire" et "à jour" peuvent être pénibles. Il n'y a aucune option pour les supprimer. Vous devez les filtrer activement ou utiliser quelque chose comme colormake . Voici une solution pour grep :
make | egrep -hiv 'nothing to be done|up to date'
Mais la sortie aura des numéros de ligne. La solution Perl est donc meilleure, car elle supprime les numéros de ligne et vide immédiatement la sortie standard:
make | Perl -ne '$|=1; print unless /nothing to be done|up to date/i'
Faire est un outil imparfait. "Qu'est-ce qui ne va pas avec GNU make?" explique cela mieux que moi.