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


155

Makefile中的以下内容是什么?

rule: $(deps)
    @:

我似乎在制作手册中找不到这个。

Answers:


206

这意味着“不要在输出上回显此命令”。因此,该规则说的是“执行shell命令:并且不回显输出。

当然,shell命令:是禁止操作的,因此它的意思是“什么也不做,不要告诉”。

为什么?

这里的技巧是,您将两种不同的语法混为一谈。在使(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.

21
不要取笑我的打字,你也有一天会变老。
查理·马丁

4
这是一个很好的解释,但是您是否偶然知道为什么要在makefile中执行此操作?
Charles Keepax 2012年

8
不是最雾的。
查理·马丁

2
它可以调用很多外部程序的makefile文件是有用的,并且要使用echo很多使它看起来不错,像这一个
dwcoder

1
@ charles-keepax,如果您是专门针对@:(不仅仅是@)询问,那么除了@guestolio的答案之外,它也可能是开发中的剩余部分。就像在Python中编写仅包含的函数一样pass。它对于存入复制/粘贴的代码块很有用,但是它们通常不应存在很长时间。当以这种方式存根时,文件仍将编译,通过
linting

40

对于那些对为什么执行此操作感到好奇的人,如果您想假装已完成某件事,这很有用,这样Make不会输出目标“无所事事”。

一个示例是,如果您有一个始终执行的伪目标,并且其中的命令中有一堆条件。您希望至少有一些东西,以防这些情况不正确。

例如(来自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
    @:
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.