Supprimer les messages dans make clean (Makefile silent remove)

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
  • the - 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.