Contents

抑制makefile中命令调用的回显

1. 概述

Make在执行之前打印Makefile中存在的每个命令,这可能导致不必要的输出。在本教程中,我们将学习如何抑制Makefile中命令调用的回显。

2. Makefile中命令调用的回显

让我们创建一个小的Makefile来看看make是如何执行它的:

$ cat Makefile
all: foo bar
foo:
    printf "%s\n" "Target foo executing..."
    printf "%s\n" "Hello from foo!"
bar:
    printf "%s\n" "Target bar executing..."
    printf "%s\n" "Hello from bar!"

在这里,我们有两个目标,foobar,它们使用printf 命令打印一些文本:

$ make
printf "%s\n" "Target foo executing..."
Target foo executing...
printf "%s\n" "Hello from foo!"
Hello from foo!
printf "%s\n" "Target bar executing..."
Target bar executing...
printf "%s\n" "Hello from bar!"
Hello from bar!

*正如我们所见,printf 命令的调用和printf命令的输出都被打印出来了。这里,包含*printf “%s\n”的行是命令调用。

3. 抑制命令调用的回声

为了减少混乱,我们只想打印实际的命令输出,而不是执行的命令本身。现在,让我们探讨一下这样做的各种方法。

3.1. 每个命令

**我们可以通过在命令前加上 @ 符号来抑制每个命令的回显。**让我们禁止两个目标的第一个printf调用:

$ cat Makefile
all: foo bar
foo:
    @printf "%s\n" "Target foo executing..."
    printf "%s\n" "Hello from foo!"
bar:
    @printf "%s\n" "Target bar executing..."
    printf "%s\n" "Hello from bar!"

正如我们所见,第一个printf命令的调用*“Target bar executing…”*  不再显示:

$ make
Target foo executing...
printf "%s\n" "Hello from foo!"
Hello from foo!
Target bar executing...
printf "%s\n" "Hello from bar!"
Hello from bar!

3.2. 每个目标

我们可以通过将目标标记为特殊.SILENT 目标的依赖项来抑制对目标的所有命令调用。

让我们沉默foo目标:

$ cat Makefile
.SILENT: foo
all: foo bar
foo:
    printf "%s\n" "Target foo executing..."
...

现在,我们可以看到命令调用仅从bar目标打印:

$ make
Target foo executing...
Hello from foo!
printf "%s\n" "Target bar executing..."
Target bar executing...
printf "%s\n" "Hello from bar!"
Hello from bar!

3.3. 全球范围内

**最后,我们可以传递 -s 标志来 make 每个目标的命令调用静音。**此方法还具有不需要对Makefile进行任何修改的好处:

$ make -s
Target foo executing...
Hello from foo!
Target bar executing...
Hello from bar!

**这种方法非常方便,因为我们可以在Makefile准备好后使用它来减少混乱,并在开发过程中恢复正常执行make。**额外的输出在开发过程中很有帮助,因为它有助于调试。