Je me demande comment je peux éviter un écho dans un Makefile:
clean: rm -fr *.o
cette règle va imprimer:
$>make clean rm -fr *.o $>
Comment puis-je éviter cela?
Pour commencer: la commande doit être sur la ligne suivante (ou du moins, c’est le cas avec GNU Make, cela peut être différent avec d’autres Make – je n’en suis pas sûr)
clean: rm -rf *.o
(notez que vous avez besoin d’une rm -rf *.o
avant rm -rf *.o
comme dans chaque règle)
Faire le silence peut être fait en préfixant un @
:
donc votre makefile devient
clean: @rm -rf *.o
S’il n’y a pas de fichiers *.o
à supprimer, vous pourriez vous retrouver avec un message d’erreur. Pour les supprimer, ajoutez les éléments suivants
clean: -@rm -rf *.o 2>/dev/null || true
2>/dev/null
transmet tout message d’erreur à / dev / null – vous ne verrez donc aucune erreur -
en face de la commande s’assure que make
ignore un code retour différent de zéro En fait, je cherchais autre chose, en ajoutant cette ligne au Makefile:
.SILENT:clean
alors exécutez chaque étape de la cible “propre” en silence.
Jusqu’à ce que quelqu’un pointe un inconvénient à cela, je l’utilise comme solution préférée!
Je réponds à ce sujet ancien car il est très recherché et les réponses prêtent à confusion. Pour faire exactement ce que veut l’utilisateur, il suffit de:
clean: @rm -f *.o
Le @ signifie que cela ne fera pas écho à cette commande. L’argument -f
de rm
indique à rm
d’ignorer les erreurs, comme s’il n’y avait pas de fichiers *.o
, et de renvoyer toujours le succès.
J’ai supprimé le -r de l’exemple des OP, car cela signifie récursif et nous ne faisons ici que .o
fichiers .o
, rien à récurer.
Il n’y a pas besoin de 2>&1 >/dev/null
car avec -f
il n’y aura pas d’erreurs imprimées.
.SILENT: clean
fonctionne à la place du @
, mais ce n’est pas au même endroit dans le Makefile que la commande qu’il affecte, de sorte que quelqu’un qui gère le projet plus tard peut ê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 )
A partir du manuel: .SILENT
est essentiellement obsolète puisque @
est plus flexible.
Pire encore, les impressions sont trop nombreuses. Les messages d’avertissement / erreur / privés sont enfouis dans la sortie. D’autre part -s
( .SILENT
) supprime tout. En particulier, les messages “rien à faire” et “à jour” peuvent être pénibles. Il n’y a pas d’option pour les supprimer. Vous devez les filtrer activement ou utiliser quelque chose comme la couleur . 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 immédiatement les numéros de ligne et videra stdout:
make | perl -ne '$|=1; print unless /nothing to be done|up to date/i'
Faire un outil défectueux. “Qu’est-ce qui ne va pas avec GNU make?” explique cela mieux que moi.