web-dev-qa-db-fra.com

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

Que font les éléments suivants dans un Makefile?

rule: $(deps)
    @:

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

135
cdwilson

Cela signifie "ne répète pas cette commande sur la sortie". Donc, cette règle dit "exécuter la commande shell : et ne reproduit pas le résultat.

Bien sûr, la commande shell : _ est un non-op, alors ceci dit "ne faites rien, et ne dites pas."

Pourquoi?

Le truc 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

Maintenant, la partie action d’une règle peut être toute commande Shell, y compris :. L'aide de Bash explique ceci aussi bien que n'importe où:

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.
177
Charlie Martin

Pour ceux qui sont curieux de savoir pourquoi vous pourriez faire cela, il est utile de prétendre que quelque chose a été fait, pour que Make ne génère pas "Rien à faire pour" votre cible.

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

Par exemple (à partir des scripts de 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
    @:
32
Guestolio