私のMakefileはとても簡単です。
all:
[ -f MyFile ] && echo "MyFile exists"
もちろん、レシピラインはタブ文字で始まります。 MyFileファイルが存在する場合、すべてが正常です。ただし、ファイルが現在のディレクトリにない場合は、次の結果が表示されます。
Makefile:2:ターゲット「all」のレシピが失敗しました。 make: *** [all] エラー 1
ifステートメントを使用してこのエラーを削除できます。
all:
if [ -f MyFile ]; then echo "MyFile exists"; fi
どちらのステートメントも make 外の sh と bash でうまく動作します。条件演算子を使用すると、makeエラーの原因が何であるかわかりません。アイデアはどうなりましたか?
答え1
[ -f MyFile ] && echo "MyFile exists"
MyFile
存在しない場合は、ゼロ以外のステータスコードで終了します。
if [ -f MyFile ]; then echo "MyFile exists"; fi
MyFile
ない限り、成功(0)ステータスコードで終了します。そして echo
書き込みエラーのため失敗しました。
Makeはステータスコードを使用してコマンドが失敗したことを確認し、コマンドが失敗した場合はデフォルトで実行を停止します。個々のコマンドラインにプレフィックスを追加してこの機能を無効にしたり、-
特殊make -i
ターゲットを実行または指定して.IGNORE
全体を無効にしたりできます。だから
-[ -f MyFile ] && echo "MyFile exists"
Makeが続行することを許可しますが、MyFile
存在しない場合はメッセージを印刷します。
make: [Makefile:14: test] エラー 1 (無視)
|| true
模様この特定の場合でも機能しますが無視されますecho
。 falseの場合、if condition; then command; fi
Makeは停止しませんが、エラーを考慮し、すべてのエラーは無視されます。condition
command
condition && command || true