【问题标题】:Suppress and ignore output for Makefile?抑制和忽略 Makefile 的输出?
【发布时间】:2012-08-06 00:00:05
【问题描述】:

我知道 @ 前缀会抑制 Makefiles 中 shell 命令的输出,而且 - 前缀会忽略 shell 命令中的错误。有没有办法将两者结合起来,即抑制输出并忽略错误的前缀?我不认为@--@ 有效。

【问题讨论】:

  • @--@ 都可以正常工作。这同样适用于 + 修饰符。

标签: makefile gnu-make


【解决方案1】:

实际上,@--@ 都可以工作,但会打印 make: [target] Error 1 (ignored) 警告。

相反,您可以使用

@command || true

或者,因为 : 是 shell 中 true 的简写,

@command ||:

这通常是一件更好的事情,因为它避免了 Make 的令人困惑的警告,即在不可见的命令中忽略了错误。

考虑两种最常见的情况,您可能希望忽略命令的返回值:

  1. 部分构建已损坏,您仍想继续,在这种情况下you’ve got some learning to do。构建已损坏,需要修复,而不是以无法维护的方式包扎。
  2. 一个命令返回一个非零的退出代码,即使它完全符合您的要求,在这种情况下,您并不真的希望 Make 发出警告。

对于第二种情况,请考虑在命令生成的日志文件中对警告进行 grepping 的示例。 grep 如果找不到匹配项,将返回错误,这不是您想要的:

.PHONY: all one two three

all: at-warning at-success or-success or-warning

at-%: %.log
    @echo Making $@
    @-grep ^Warning $<

or-%: %.log
    @echo Making $@
    @grep ^Warning $< ||:

success.log:
    echo 'Success!' > $@

warning.log:
    echo 'Warning: foo' > $@

clean::
    rm -f {success,warning.log}

产生:

echo 'Warning: foo' > warning.log
Making at-warning
Warning: foo
Making at-success
make: [at-success] Error 1 (ignored)
Making or-success
Making or-warning
Warning: foo

使用@- 会在成功时产生无意义的忽略错误警告,而|| true 会同时处理警告和没有警告的情况。

理论上使用|| true 比使用@- 慢,但这种开销不太可能成为精心设计和维护的构建系统的瓶颈。绝大多数时间应该花在构建,或者在没有要构建的东西时检查时间戳,而不是运行数以千计的快速命令,这些命令的返回值都被忽略,这对于产生可衡量的性能影响是必要的。

【讨论】:

  • 此策略将强制 GNU make 使用 shell 调用命令,这将增加构建过程的开销。在某些可能很重要的平台(例如 Windows)上。
【解决方案2】:

GNU make 确实允许您将@- 结合起来:

all:
        @-exit 1

使用 gmake 3.81 运行会产生以下输出:

gmake: [all] 错误 1(忽略)

如您所见,命令没有回显,错误按预期被忽略。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 2013-04-25
    • 2013-02-18
    • 2022-10-18
    • 1970-01-01
    • 2016-03-07
    相关资源
    最近更新 更多