@:(在符号冒号)在Makefile中是什么意思?

下面在Makefile中做了什么?

rule: $(deps) @: 

我似乎无法在make手册中find这个。

这意味着“不要在输出中回显这个命令”。 所以这个规则是说“执行shell命令:不要回显输出。

当然,shell命令是不可操作的,所以这是说“什么也不做,不要说”。

为什么?

这里的诀窍是你有两个不同的语法混淆。 make(1)语法是使用以@开头的动作,而不是回显命令。 所以像这样的规则

 always: @echo this always happens 

不会发射

  echo this always happens this always happens 

现在,规则的动作部分可以是任何 shell命令,包括: 。 Bash帮助解释这个以及任何地方:

 $ help : :: : Null command. No effect; the command does nothing. Exit Status: Always succeeds. 

对于那些为什么你可能会这样做感到好奇的人,如果你想假装完成了某些事情,那么Make就不会输出“Nothing to be done for”你的目标。

一个例子是如果你有一个你永远执行的假目标,并且在这个命令中你有一堆条件。 你想至less有一些事情,以防止这些情况出现虚假,什么都不做。

例如(从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 @: