【发布时间】:2014-06-03 00:03:27
【问题描述】:
是否可以默认从Makefile 中抑制命令回显?
我知道在--silent 模式下运行make 可以做到这一点,在每个命令前加上@。
我正在寻找一个命令或节,我可以将其包含在内部 Makefile,省去了使用@ 乱扔所有内容或让用户手动使所有内容静音的麻烦。
【问题讨论】:
是否可以默认从Makefile 中抑制命令回显?
我知道在--silent 模式下运行make 可以做到这一点,在每个命令前加上@。
我正在寻找一个命令或节,我可以将其包含在内部 Makefile,省去了使用@ 乱扔所有内容或让用户手动使所有内容静音的麻烦。
【问题讨论】:
如果你定义了目标.SILENT:,那么make 不会回显任何东西。通常最好保护定义,这样您就可以轻松地将其关闭:
ifndef VERBOSE
.SILENT:
endif
现在默认情况下,make 不会打印任何内容,但如果你运行make VERBOSE=1,它会打印。
请注意,尽管手册中声明 .SILENT 已过时 - 如果保护得当,它通常比 @ 更好(更有用和更灵活)。
.SILENT 目标不应该是你的Makefile 上的第一个目标,否则make 将默认使用它。
【讨论】:
ifndef 更简单的方法就是写$(VERBOSE).SILENT:。现在,如果VERBOSE 为空,您将获得.SILENT 目标,但如果您将VERBOSE 设置为任何非空值,它将被禁用(定义一个完全不同的目标,这意味着什么都不做)。如果这对您很重要,这也可以移植到其他版本的 make 中。
VERBOSE 设置为任何非空值时,它将尝试执行目标。对某些用户来说可能很明显,但我花了几分钟想知道为什么我在执行 VERBOSE=1 make 时收到错误 VERBOSE=1 make 认为它会执行我通常的默认目标。
您可以在MAKEFLAGS 变量的Makefile 开头添加--silent:
MAKEFLAGS += --silent
all:
echo foobar
.PHONY: all
你将拥有:
$ make
foobar
【讨论】:
根据GNU Make's manual,可以使用特殊目标.SILENT。
请注意,手册是这样说的:
.SILENT 基本上已经过时,因为“@”更灵活。
但它似乎按预期工作。以下代码使all 目标静音:
.SILENT:
hoge:
echo hoge
以下示例仅使 hoge 目标静音:
.SILENT: hoge
hoge:
echo hoge
fuga:
echo fuga
【讨论】: