web-dev-qa-db-fra.com

Supprimer les messages dans make clean (Makefile silent remove)

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?

44
claf

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!

25
claf

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
  • les - devant la commande s'assure que make ignore un code retour différent de zéro
73
plof

Je 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 rming .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.

14
phorgan1

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)

8
SCFrench

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.

4
Andreas Spindler