私の Makefile は非常にシンプルです:
all:
[ -f MyFile ] && echo "MyFile exists"
もちろん、レシピの行はタブで始まります。MyFile ファイルが実際に存在する場合は、すべて正常です。ただし、このファイルが現在のディレクトリにない場合は、次のようになります。
Makefile:2: ターゲット 'all' のレシピが失敗しました: *** [all] エラー 1
代わりに if ステートメントを使用すると、このエラーを解消できます。
all:
if [ -f MyFile ]; then echo "MyFile exists"; fi
どちらのステートメントも、sh および bash の make 外部では正常に動作します。条件演算子が使用されている場合の make エラーの原因が私にはわかりません。何が起こっているのか、教えてください。
答え1
[ -f MyFile ] && echo "MyFile exists"
MyFile
存在しない場合は0以外のステータスコードで終了しますが、
if [ -f MyFile ]; then echo "MyFile exists"; fi
MyFile
存在しない場合は成功(ゼロ)ステータスコードで終了しますそして echo
書き込みエラーで失敗します。
Makeはステータスコードに基づいてコマンドが失敗したかどうかを判断します。デフォルトでは、コマンドが失敗すると実行を停止します。個々のコマンド行に をプレフィックスとして付けるか-
、 を実行するmake -i
か、特別な.IGNORE
ターゲットを指定して実行することで、これを無効にできます。つまり、
-[ -f MyFile ] && echo "MyFile exists"
MyFile
どちらも Make を続行させますが、存在しない場合はメッセージを出力します。
make: [Makefile:14: test] エラー 1 (無視)
パターン|| true
もこの特定のケースでは機能しますが、 のエラーは無視されますecho
。が false のif condition; then command; fi
場合、 Make は停止しませんcondition
が、command
のエラーが考慮されますが、 はcondition && command || true
すべてのエラーを無視します。