我知道@
前缀会抑制Makefile中shell命令的输出,并且-
前缀将忽略shell命令中的错误。有没有办法将两者结合起来,即一个抑制输出的前缀并忽略错误?我认为@-
或-@
不起作用。
答案 0 :(得分:48)
实际上,@-
和-@
都有效,但会打印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
比使用@-
慢,但这种开销不太可能成为精心设计和维护的构建系统的瓶颈。绝大多数时间应该用于构建,或者在没有构建任何内容时检查时间戳,而不是运行成千上万的快速命令,这些命令的返回值都会被忽略,这对于产生可测量的性能影响是必要的。
答案 1 :(得分:8)
GNU make允许您将@
和-
:
all:
@-exit 1
使用gmake 3.81运行此命令会产生以下输出:
gmake:[all]错误1(忽略)
如您所见,该命令未被回显,错误将按预期被忽略。