51

@接頭辞が Makefile のシェル コマンドからの出力を抑制すること、および-接頭辞がシェル コマンドからのエラーを無視することも知っています。この 2 つを組み合わせる方法、つまり、出力を抑制してエラーを無視するプレフィックスはありますか? 私は考え@-たり、-@働いたりしません。

4

2 に答える 2

68

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

代わりに、

@command || true

または、in shellの:省略形なので、true

@command ||:

これは、目に見えないコマンドでエラーが無視されたというMakeの紛らわしい警告を回避するため、多くの場合、より良い方法です。

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

  1. ビルドの一部が壊れていて、とにかく続行したい場合は、ある程度の学習が必要です。ビルドは壊れており、メンテナンス不可能な方法でバンデードするのではなく、修正する必要があります。
  2. コマンドは、必要な処理を正確に実行したにもかかわらず、ゼロ以外の終了コードを返します。この場合、Makeが警告を発行することは実際には望ましくありません。

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

于 2012-08-08T19:49:53.907 に答える
9

@GNU make では、 と の両方を組み合わせることができます-

all:
        @-exit 1

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

gmake: [all] エラー 1 (無視)

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

于 2012-08-08T20:33:06.807 に答える