Que font les éléments suivants dans un Makefile?
rule: $(deps)
@:
Je n'arrive pas à trouver cela dans le manuel make.
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.
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
@: