关于gnu make:抑制并忽略Makefile的输出?

Suppress and ignore output for Makefile?

我知道@前缀会抑制Makefiles中shell命令的输出,并且-前缀会忽略shell命令中的错误。 有没有一种方法可以将两者结合起来,也就是可以抑制输出并忽略错误的前缀? 我认为@--@无效。


实际上,@--@都可以工作,但是会显示make: [target] Error 1 (ignored)警告。

相反,您可以使用

1
@command || true

或者,由于:是Shell中true的简写,

1
@command ||:

这通常是更好的做法,因为它避免了Make的混淆警告,即在看不见的命令中忽略了错误。

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

  • 部分构建已损坏,无论如何您都想继续,在这种情况下,您需要学习一些知识。该构建已损坏,需要修复,而不是无法维护。
  • 即使命令确实执行了您想要的操作,该命令仍会返回非零的退出代码,在这种情况下,您实际上并不希望Make发出警告。
  • 对于第二种情况,请考虑对命令生成的日志文件中的警告进行grepping的示例。 grep如果找不到匹配项,则将返回错误,这不是您想要的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    .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}

    产生:

    1
    2
    3
    4
    5
    6
    7
    8
    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确实允许您组合@-

    1
    2
    all:
            @-exit 1

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

    gmake: [all] Error 1 (ignored)

    如您所见,未回显该命令,并且按预期方式忽略了该错误。