抑制并忽略Makefile的输出?

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的混乱警告,即在一个不可见的命令中忽略了一个错误.

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

  1. 部分构建被打破了,无论如何你想继续,在这种情况下你有一些学习要做.构建被打破,需要修复,而不是以不可维护的方式进行绑定.
  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}
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比使用慢@-,但这种开销不太可能成为精心设计和维护的构建系统的瓶颈.绝大多数时间应该用于构建,或者在没有构建任何内容时检查时间戳,而不是运行成千上万的快速命令,这些命令的返回值都会被忽略,这对于具有可测量的性能影响是必要的.


Eri*_*ski 9

GNU化妆确实让你既结合@-:

all:
        @-exit 1
Run Code Online (Sandbox Code Playgroud)

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

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

如您所见,该命令未被回显,并且错误将按预期被忽略.