Réponses:
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.
@:
(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.
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
@: