在Makefile中,@:(at symbol colon)是什么意思?

232

在 Makefile 中,下面的这段代码是什么意思?

rule: $(deps)
    @:

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

2个回答

310

这意味着“不要在输出中打印此命令”。因此,该规则是要求执行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.

谢谢,有没有更详细的描述?我不确定“out-ut”是什么意思。 - cdwilson
67
不要嘲笑我的打字,你总有一天也会变老的。 - Charlie Martin
谢谢,这真的很有帮助!在看了你的答案之前,我一直以为@:是某种有趣的造词(我没有意识到它是两个东西的组合...) - cdwilson
10
这是一个很好的解释它做了什么,但你是否知道为什么要在Makefile中这样做? - Charles Keepax
4
这段话的意思是,当你在Makefile中调用许多外部程序并希望使用大量echo使其看起来更好时,它会非常有用。 举个例子,像这个Makefile - dwcoder
11
如果您特别是针对@:询问,那么除了@guestolio的答案之外,它也可能是开发中剩余的存根。这就像在Python中编写仅包含“pass”的函数一样。它可以用于存根代码块以进行复制/粘贴,但通常不应长时间存在。使用这种方式进行存根时,文件仍将编译通过,通过lint检查等。 - boweeb

56

对于那些好奇为什么要这样做的人,如果你想要假装已经完成了某个任务,这是非常有用的。这样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
    @:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接