@: (在符号冒号处)在 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 中是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章