GNU默认情况下使用静音

sle*_*ica 20 makefile gnu-make

是否有可能在默认情况下禁止命令回显Makefile

我知道make--silent模式下运行会这样做,因为它会为每个命令添加前缀@.

我正在寻找一个我可以包含 Makefile中的命令或节,省去了乱扔垃圾@或让用户手动静音的麻烦.

Chr*_*odd 31

如果你定义目标.SILENT:,那么make将不会回显任何东西.通常最好保护定义,因此您可以轻松将其关闭:

ifndef VERBOSE
.SILENT:
endif
Run Code Online (Sandbox Code Playgroud)

现在默认情况下,make将不会打印任何内容,但如果您运行make VERBOSE=1,它将打印.

请注意,尽管手册中的声明声称.SILENT已经过时 - 如果保护得当,它通常要比(更有用和更灵活)更好@.

.SILENT目标不应该是第一个对你Makefile,否则make将默认使用它.

  • 比使用`ifndef`更简单的方法就是编写`$(VERBOSE).SILENT:`.现在,如果`VERBOSE`为空,则得到`.SILENT`目标,但是如果你将`VERBOSE`设置为任何非空值,它将被禁用(定义一个完全不同的目标,这意味着什么都没有).如果对您而言,这也可以移植到其他版本的make. (17认同)
  • 应该注意的是,请确保不要将其放在 Makefile 的顶部。否则,当您将“VERBOSE”设置为任何非空值时,它将尝试执行目标。对于某些用户来说可能是显而易见的,但我花了几分钟想知道为什么在执行“VERBOSE=1 make”时出现错误“make: Nothing to be do for '1.SILENT'.”,认为它会执行我通常的默认目标。 (3认同)
  • 澄清一下:如本答案所述,将由“ifndef”保护的“.SILENT”放在“Makefile”顶部没有任何问题。根据 https://gnu.org/software/make/manual/html_node/How-Make-Works.html,以“.”开头的目标不会成为默认目标。然而,@MadScientist 建议使用 `$(VERBOSE).SILENT` 不应该是第一个。我个人不会将它用于这种微妙的警告,因为我认为它不太清楚。 (2认同)

jml*_*jml 23

您可以--silentMAKEFLAGS开头添加变量Makefile:

MAKEFLAGS += --silent

all:
    echo foobar

.PHONY: all
Run Code Online (Sandbox Code Playgroud)

你将拥有:

$ make
foobar
Run Code Online (Sandbox Code Playgroud)

  • 这个答案引导人们使用更清晰易读的方式。谢谢 (4认同)
  • 我正在使用 GNU make 4.3,并且 .SILENT 似乎不再起作用。然而,这个技巧(添加 --silent 标志)仍然有效。 (3认同)
  • 请注意,此方法不适用于旧版本的 GNU make,因为在旧版本的 makefile 中修改 MAKEFLAGS 不受支持。它的可移植性也较差:`.SILENT` 目标是由 POSIX 指定的,但 `--silent` 不是(尽管 `-s` 是),并且它不是由 POSIX 指定的,如果您修改 makefile 中的 `MAKEFLAGS` 会发生什么。 (2认同)

ymo*_*nad 7

根据GNU Make的手册,您可以使用特殊目标.SILENT

注意手册说的那个

.SILENT基本上是过时的,因为'@'更灵活.

但似乎按预期工作.以下代码使所有目标静默.

.SILENT:

hoge:
    echo hoge
Run Code Online (Sandbox Code Playgroud)

以下示例仅对all目标进行静默

.SILENT: hoge

hoge:
    echo hoge

fuga:
    echo fuga
Run Code Online (Sandbox Code Playgroud)