And*_*Lee 40 makefile gnu-make
我知道@前缀会抑制Makefile中shell命令的输出,并且-前缀将忽略shell命令中的错误.有没有办法将两者结合起来,即一个抑制输出的前缀并忽略错误?我不认为@-或-@有效.
and*_*otn 52
其实,@-并且-@都做的工作,但将打印make: [target] Error 1 (ignored)警告.
相反,你可以使用
@command || true
Run Code Online (Sandbox Code Playgroud)
或者,因为:是true贝壳的简写,
@command ||:
Run Code Online (Sandbox Code Playgroud)
这通常是一件好事,因为它避免了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}
Run Code Online (Sandbox Code Playgroud)
生产:
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
Run Code Online (Sandbox Code Playgroud)
@-当成功时,使用会产生无意义的忽略错误警告,同时|| true处理警告和没有投诉的警告.
理论上使用|| true比使用慢@-,但这种开销不太可能成为精心设计和维护的构建系统的瓶颈.绝大多数时间应该用于构建,或者在没有构建任何内容时检查时间戳,而不是运行成千上万的快速命令,这些命令的返回值都会被忽略,这对于具有可测量的性能影响是必要的.
GNU化妆确实让你既结合@和-:
all:
@-exit 1
Run Code Online (Sandbox Code Playgroud)
使用gmake 3.81运行它会产生以下输出:
gmake:[all]错误1(忽略)
如您所见,该命令未被回显,并且错误将按预期被忽略.