【发布时间】:2012-08-06 00:00:05
【问题描述】:
我知道 @ 前缀会抑制 Makefiles 中 shell 命令的输出,而且 - 前缀会忽略 shell 命令中的错误。有没有办法将两者结合起来,即抑制输出并忽略错误的前缀?我不认为@- 或-@ 有效。
【问题讨论】:
-
@-和-@都可以正常工作。这同样适用于+修饰符。
我知道 @ 前缀会抑制 Makefiles 中 shell 命令的输出,而且 - 前缀会忽略 shell 命令中的错误。有没有办法将两者结合起来,即抑制输出并忽略错误的前缀?我不认为@- 或-@ 有效。
【问题讨论】:
@- 和 -@ 都可以正常工作。这同样适用于 + 修饰符。
实际上,@- 和 -@ 都可以工作,但会打印 make: [target] Error 1 (ignored) 警告。
相反,您可以使用
@command || true
或者,因为 : 是 shell 中 true 的简写,
@command ||:
这通常是一件更好的事情,因为它避免了 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 确实允许您将@ 和- 结合起来:
all:
@-exit 1
使用 gmake 3.81 运行会产生以下输出:
gmake: [all] 错误 1(忽略)
如您所见,命令没有回显,错误按预期被忽略。
【讨论】: