makefile には次のような規則がいくつかあります。
out.txt: foo.sh input.txt
./foo.sh -i input.txt > out.txt
foo.sh
失敗すると、out.txt
サイズ0のファイルが生成されます。走れば作るout.txt
今回もファイルが正常に作成されたと誤って判断し、ルールを再実行しません。
この状況を処理する正しい方法は何ですか?
ベストアンサー1
ルールが失敗した場合は、以下を定義してターゲットファイルの削除を要求できます。特別な目標名前付き.DELETE_ON_ERROR
。何もする必要はなく、依存関係は必要ないので、makefileに追加するだけです。
.DELETE_ON_ERROR:
これにより、次のようになります。
$ cat Makefile
.DELETE_ON_ERROR:
foo:
false > foo
$ make
false > foo
make: *** [foo] Error 1
make: *** Deleting file `foo'
zsh: exit 2 make
$ stat foo
stat: cannot stat `foo': No such file or directory
~からレシピのエラー:
通常、レシピ行が失敗したときにターゲットファイルがまったく変更されると、ファイルが破損して使用できないか、少なくとも完全に更新されません。ただし、ファイルのタイムスタンプは現在最新の状態であることを示すため、次回
make
ファイルを実行するときにファイルを更新しようとしません。この状況は、信号によってシェルが終了する場合と同じです。邪魔する。したがって、ファイルの変更を開始した後にレシピが失敗した場合、通常は正しい方法はターゲットファイルを削除することです。これはターゲットとして存在する場合にmake
行われます。.DELETE_ON_ERROR
これはほとんど常にやりたいことですが、make
歴史的な慣行ではないため、互換性のために明示的に要求する必要があります。