Que signifie @: (au symbole deux-points) dans un Makefile?

155

Que fait ce qui suit dans un Makefile?

rule: $(deps)
    @:

Je n'arrive pas à trouver cela dans le manuel de fabrication.

cdwilson
la source

Réponses:

206

Cela signifie "ne pas faire écho à cette commande sur la sortie." Donc, cette règle dit "exécutez la commande shell :et ne renvoyez pas la sortie.

Bien sûr, la commande shell :est un no-op, donc cela dit "ne rien faire et ne pas dire".

Pourquoi?

L'astuce ici est que vous avez une combinaison obscure de deux syntaxes différentes. La syntaxe make (1) est l'utilisation d'une action commençant par @, qui consiste simplement à ne pas faire écho à la commande. Donc une règle comme

always:
       @echo this always happens

n'émettra pas

   echo this always happens
   this always happens

Désormais, la partie action d'une règle peut être n'importe quelle commande shell, y compris :. L'aide Bash explique cela aussi bien que n'importe où:

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.
Charlie Martin
la source
21
Ne vous moquez pas de ma frappe, vous serez vieux aussi un jour.
Charlie Martin
4
C'est une excellente explication de ce que cela fait, mais savez-vous par hasard pourquoi vous le feriez dans un fichier makefile?
Charles Keepax
8
Pas le plus brumeux.
Charlie Martin
2
Cela peut être utile dans les makefiles qui appellent beaucoup de programmes externes, et où vous voulez beaucoup utiliser l'écho pour le rendre joli, comme celui-ci
dwcoder
1
@ charles-keepax si vous demandez spécifiquement en référence @:(pas seulement @), en plus de la réponse de @ guestolio, il pourrait également s'agir d'un stub résiduel du développement. C'est comme écrire une fonction en Python qui ne contient que pass. Cela peut être utile pour remplacer des blocs de code à copier / coller, mais ils ne devraient généralement pas exister longtemps. Lors du remplacement de cette façon, le fichier serait toujours compilé, passer le peluchage, etc.
boweeb
40

Pour ceux qui sont curieux de savoir pourquoi vous pourriez faire cela, il est utile si vous voulez faire semblant que quelque chose a été fait, afin que Make ne renvoie pas "Rien à faire pour" votre cible.

Un exemple est si vous avez une cible bidon que vous exécutez toujours, et que vous avez un tas de conditions dans la commande. Vous voulez avoir au moins quelque chose au cas où ces conditions seraient fausses et que rien ne serait fait.

Par exemple (à partir des scripts Linux / Makefile.clean):

__clean: $(subdir-ymn)
ifneq ($(strip $(__clean-files)),)
    +$(call cmd,clean)
endif
ifneq ($(strip $(__clean-dirs)),)
    +$(call cmd,cleandir)
endif
ifneq ($(strip $(clean-rule)),)
    +$(clean-rule)
endif
    @:
Guestolio
la source