抑制并忽略Makefile的输出?

时间:2012-08-08 19:38:58

标签: makefile gnu-make

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

2 个答案:

答案 0 :(得分:48)

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

相反,您可以使用

@command || true

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

@command ||:

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

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

  1. 部分构建已损坏,您仍希望继续,在这种情况下you’ve got some learning to do。构建被打破,需要修复,而不是以不可维护的方式进行绑定。
  2. 一个命令返回一个非零的退出代码,即使它完全符合您的要求,在这种情况下,您并不希望Make发出警告。
  3. 对于第二种情况,请考虑在命令生成的日志文件中对警告进行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(忽略)

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