我在linux Makefile中读过:
$(filter-out _all sub-make $(CURDIR)/Makefile, $(MAKECMDGOALS)) _all: sub-make
$(Q)@:
“$(Q)@:”是什么意思?
我正在尝试谷歌,但谷歌总是蹩脚,如果搜索使用一些奇怪的角色。所以最后我找不到任何关于它的手册。
答案 0 :(得分:4)
查看代码后。 Q在那些行之后的某处定义。由于makefile具有特殊的变量概念(可扩展),因此可以在任何地方实现。 Q用于是否显示消息(Q可能是安静的)。
ifeq ($(KBUILD_VERBOSE),1)
quiet =
Q =
else
quiet=quiet_
Q = @
endif
对于上一个@:
,这意味着do-nothing-output-nothing
。
所以结论$(Q)@:
只是do-nothing-output-nothing
。
答案 1 :(得分:0)
要加强和扩展nafsaka发现的内容: 有时,Makefile是这样写的:
target: rm -rf $(DIRECTORY) $(Q)$(MAKE) all
例如,Q将被定义为@或什么都不会:
V ?= 0 ifeq ($(V), 0) Q = @ else Q = endif
如果目标动作前面有@,则make在运行时不会显示。这是有关该主题的GNU make文档:Recipe Echoing
在这种情况下,您需要在运行make之前定义V = 1才能看到正在运行的命令(这很常见)。
另一个问题:在您的Makefile中查找“ include file.mk”语句,在我的案例中这就是V和Q的定义位置。这是有关GNU make的文档,包括:Including Other Makefiles
答案 2 :(得分:0)
5.2配方回显
通常,make将在执行配方之前打印配方的每一行。之所以称呼为回声,是因为它看起来像是您自己在键入行。
当一行以“ @”开头时,该行的回显将被抑制。在将行传递到外壳程序之前,将丢弃“ @”。通常,您会将此命令用于唯一的效果是打印某些内容的命令,例如echo命令以指示生成文件的进度:
@echo About to make distribution files
在给make标记“ -n”或“ --just-print”时,它仅回显大多数配方,而不执行它们。请参阅选项摘要。在这种情况下,甚至会打印以“ @”开头的配方行。此标志对于无需实际进行操作就能找出哪些食谱认为必要是有用的。
要制作的“ -s”或“ --silent”标志可防止所有回声,就好像所有食谱均以“ @”开头。 makefile中针对特殊目标.SILENT的无先决条件的规则具有相同的效果(请参阅特殊内置目标名称)。