web-dev-qa-db-ja.com

Makefileの出力を抑制して無視しますか?

@プレフィックスは、Makefilesのシェルコマンドからの出力を抑制し、-プレフィックスは、シェルコマンドからのエラーを無視します。 2つを組み合わせる方法はありますか?つまり、出力を抑制してエラーを無視するプレフィックスですか? @-または-@動作します。

39
Andrew Lee

実際、_@-_と_-@_は両方とも機能しますが、make: [target] Error 1 (ignored)警告を出力します。

代わりに、使用できます

_@command || true
_

または、_:_はシェルのtrueの省略形であるため、

_@command ||:
_

これは、目に見えないコマンドでエラーが無視されたというMakeのわかりにくい警告を回避するためです。

コマンドの戻り値を無視したい最も一般的な2つのケースを考えてみましょう。

  1. ビルドの一部が破損しているので、続行します。その場合は、 やることが少しあります 。ビルドが壊れているため、メンテナンスできない方法で修正する必要があります。
  2. コマンドは、希望どおりに実行したにもかかわらず、ゼロ以外の終了コードを返します。この場合、Makeが警告を発行することは望ましくありません。

2番目のケースでは、コマンドによって生成されたログファイルの警告を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_を使用することは_@-_を使用するよりも遅くなりますが、このオーバーヘッドは、適切に設計され維持されたビルドシステムのボトルネックになることはほとんどありません。時間の大部分は、パフォーマンスに測定可能な影響を与えるために必要な戻り値がすべて無視される何千ものクイックコマンドを実行するのではなく、ビルド、またはビルドするものがない場合のタイムスタンプのチェックに費やす必要があります。

52
andrewdotn

GNU makeでは、両方の@および-

all:
        @-exit 1

これをgmake 3.81で実行すると、次の出力が生成されます。

gmake:[all]エラー1(無視されます)

ご覧のとおり、コマンドはエコーされず、エラーは期待どおりに無視されます。

9
Eric Melski