(GNU makeを使用して)、(依存関係の前または実行レシピ)日のうち他のターゲット場合はダミーターゲット(最初の)を実行
私は、デフォルトのターゲットは「コンパイル」コードの責任であることをMakefile
を持っています。私はrun_test
テストを実行するが、必要に応じて再コンパイルするターゲットを持っています。
私は、テストの実行場合前にコンパイル・ステップが実行されますが、コンパイル手順が実行されている場合にのみ、そうされていないログファイルをクリアしたいです。私はログをクリアするためにreset_log
ターゲットを定義しました。私が欲しいの動作は次のとおりです。すべての最新の
make all
- 日までないとき何も実行しませんが、make all
をクリアされないログ - ログがクリアされ、その後、適切なコンパイルのルールが実行さmake run_test
とき最新のものは何もコンパイルされず、ログはクリアされず、テストが実行されます。make run_test
が最新の場合 - ログがクリアされた後、適切なコンパイルルールが実行され、テストが実行されます。
にはどうすればコンパイルが発生しなければならないときにのみ実行するようにreset_log
ターゲット(または同等のコマンド)を取得しますが、任意の依存関係のレシピが実行される前に?この例が(reset_log
とfinal.out
ターゲットはreset_log
がfinal.out
の依存性があるので、再実行するたびに取得し、依存しません自体に)動作しませんが、実証:
LOG_FILE = file.log
all: compile
compile: final.out
reset_log:
-rm -f $(LOG_FILE)
final.out: final.in reset_log 1.out 2.out
cp -v final.in final.out | tee -a $(LOG_FILE)
1.out: 1.in
cp -v 1.in 1.out | tee -a $(LOG_FILE)
2.out: 2.in
cp -v 2.in 2.out | tee -a $(LOG_FILE)
run_test: compile
@echo "======= Run Test Here ======="
clean:
-rm *.out $(LOG_FILE)
.PHONY: local_target reset_log run_test clean
注:ここではMakefile
簡略化されています私はreset_log
を実行したいと思っています。
可能な解決策の1つは、依存性レシピが実行される前に、対象が古くなった対象のレシピを実行する方法を持つことです。
アップデートは2016年10月18日user657267のソリューション(と私はコメントで提案マイナー改善)に基づいて
、ここに最終的な解決策、つまり、上記の例の再コードです私は必要なもの:
LOG = file.log
all: compile
compile: $(LOG)
$(LOG): final.out
mv [email protected] [email protected] || (echo "WARNING: $< not found. Creating dummy [email protected] to allow make to run" > [email protected])
final.out: 1.out 2.out
%.out: %.in
cp -v $< [email protected] | tee -a $(LOG).tmp
run_test: compile
@echo "======= Run Test Here ======="
clean:
-rm *.out $(LOG)
.PHONY: run_test clean compile
ブリリアント、ありがとう@ user657267。これが失敗する唯一のケースは、file.logが手動で削除され、他のすべての依存関係が最新である場合です。私は以下のログ移動コマンドを使用してそれを修正しました: 'mv $ @。tmp $ @ || (echo "WARNING:$ @。tmp not found。ダミー$ @を作成してmakeを実行できるようにする"> $ @) ' –