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

Posted

技术标签:

【中文标题】@: (在符号冒号处)在 Makefile 中是啥意思?【英文标题】:What does @: (at symbol colon) mean in a Makefile?@: (在符号冒号处)在 Makefile 中是什么意思? 【发布时间】:2012-01-26 12:04:43 【问题描述】:

以下在 Makefile 中做了什么?

rule: $(deps)
    @:

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

【问题讨论】:

【参考方案1】:

意思是“不要在输出中回显这个命令”。所以这条规则是说“执行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”是什么。 别拿我打字开玩笑,总有一天你也会老的。 这是对它的作用的一个很好的解释,但是你有没有机会知道为什么要在 makefile 中这样做? 它在调用大量外部程序的 makefile 中很有用,并且在你想大量使用 echo 让它看起来不错的地方,比如 this one @charles-keepax 如果您特别询问@:(不仅仅是@),那么除了@guestolio 的回答之外,它也可能是开发的剩余存根。这就像在 Python 中编写一个只包含 pass 的函数。它对于复制/粘贴代码块的存根很有用,但它们通常不应该存在很长时间。当以这种方式存根时,文件仍将编译、传递 linting 等。【参考方案2】:

对于那些好奇你为什么要这样做的人,如果你想假装某事已经完成,这很有用,这样 Make 就不会输出“Nothing to be done for”你的目标。

一个例子是,如果您有一个始终执行的虚假目标,并且其中的命令中有一堆条件。你希望至少有一些东西,以防这些条件出现错误并且什么都不做。

例如(来自 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
    @:

【讨论】:

以上是关于@: (在符号冒号处)在 Makefile 中是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

$@ 在Linux Makefile中是啥意思

这个符号在 PHP 中是啥意思 <?=

^(插入符号)在Java中是啥意思[重复]

这个符号在 C++ 中是啥意思? [复制]

=> 符号在 Haskell 中是啥意思?

这个符号 `:>` 在 Coq 中是啥意思?