Makefileから呼び出すとdiffが失敗するのはなぜですか?

Makefileから呼び出すとdiffが失敗するのはなぜですか?

私が解決したいパッチの問題の縮小版です。それぞれサイズが1バイトの2つのファイルです。

  • ファイルa(含む'a'
  • ファイルb(含む'b')と

'b'の値をに変更するパッチを作成して適用することが目標です'a'。 Makefileの内容は次のとおりです。

patch:
        diff -u b a > b2a.patch
        patch -o b.corrected b < b2a.patch
        diff a b.corrected

clean:
        rm -f b2a.patch b.corrected

上記を考慮すると、make次の出力で失敗します。

$ make
diff -u b a > b2a.patch
make: *** [patch] Error 1

しかし、bashシェルでMakefileのコマンドを1つずつ実行してみると、まったく問題はありません。

答え1

Make は、終了コード 0 が成功を示し、他の値が失敗を示すと仮定します。これは、ほとんどすべてのコマンドラインツールで使用される標準ルールです。

残念ながら、diffその一つではありません。 GNU差異情報ページを確認し、シングルUnix仕様「diff」項目,0は差が見つからなかったことを意味し,1は差が見つかったことを意味し,≧2は誤りがあることを意味する。

コメントで行ったように、コマンドの前にハイフンを付けて終了ステータスを完全に無視するようにMakeに指示できます。ただし、これにより実際のエラーは無視されます。おそらくあなたが望むものではないかもしれません。代わりに、次のことができます。

patch:
        diff -u b a > b2a.patch; [ $$? -eq 1 ]
        patch -o b.corrected b < b2a.patch
        diff a b.corrected; [ $$? -eq 1 ]

; [ $$? -eq 1 ]2つのdiff行の末尾に私が追加したビットを確認してください。; test $$? -eq 1もちろんそれも使えます。シェル$?変数は、$$?通常のMakefileエスケープルールが原因で発生します。これはおそらく、あなたが望む終了ステータス0(違いなし)も拒否することに注意してください。

ところで:実際にこれをしなければならないようです。

patch: b.corrected
        diff …
b.corrected: b2a.patch
        patch …
b2a.patch: a b
        diff …

aとbを変更してファイルを正しく再生成できます。

関連情報