出力リダイレクトによってサイズがゼロのファイルが生成されるため、Makeはルールを成功と誤って見なします。

出力リダイレクトによってサイズがゼロのファイルが生成されるため、Makeはルールを成功と誤って見なします。

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歴史的な慣行ではないため、互換性のために明示的に要求する必要があります。

おすすめ記事