在 Makefile 中,下面的这段代码是什么意思?
rule: $(deps)
@:
我似乎在 make 手册中找不到这个。
这意味着“不要在输出中打印此命令”。因此,该规则是要求执行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"您的目标。
一个例子是,如果您有一个假目标,您总是执行它,在其中有一堆条件命令。您希望至少有一些东西,以防这些条件不成立而什么都没有完成。
例如(来自Linux的scripts / 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
@:
@:
是某种有趣的造词(我没有意识到它是两个东西的组合...) - cdwilson@:
询问,那么除了@guestolio的答案之外,它也可能是开发中剩余的存根。这就像在Python中编写仅包含“pass”的函数一样。它可以用于存根代码块以进行复制/粘贴,但通常不应长时间存在。使用这种方式进行存根时,文件仍将编译通过,通过lint检查等。 - boweeb