私が解決したいパッチの問題の縮小版です。それぞれサイズが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を変更してファイルを正しく再生成できます。