下面的代码在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
    @:

它的意思是“不要在输出中回显此命令”。所以这条规则说的是“执行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.