下面的代码在Makefile中做什么?
rule: $(deps)
@:
我在制作手册里找不到这个。
下面的代码在Makefile中做什么?
rule: $(deps)
@:
我在制作手册里找不到这个。
它的意思是“不要在输出中回显此命令”。所以这条规则说的是“执行shell命令:并且不回显输出。
当然shell命令:是一个no-op,所以这是在说“什么都不做,也不要告诉”。
Why?
这里的技巧是,您得到了两种不同语法的模糊组合。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”,那么这是很有用的。
举个例子,如果你有一个虚假的目标,你总是执行它,在它的命令中有一堆条件。你至少要有一些东西以防这些条件为假,什么都没做。
例如(来自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
@: