2016-10-17 11 views
1

(GNU makeを使用して)、(依存関係の前または実行レシピ)日のうち他のターゲット場合はダミーターゲット(最初の)を実行

私は、デフォルトのターゲットは「コンパイル」コードの責任であることをMakefileを持っています。私はrun_testテストを実行するが、必要に応じて再コンパイルするターゲットを持っています。

私は、テストの実行場合前にコンパイル・ステップが実行されますが、コンパイル手順が実行されている場合にのみ、そうされていないログファイルをクリアしたいです。私はログをクリアするためにreset_logターゲットを定義しました。私が欲しいの動作は次のとおりです。すべての最新の

  1. make all - 日までないとき何も実行しませんが、
  2. make allをクリアされないログ - ログがクリアされ、その後、適切なコンパイルのルールが実行さ
  3. make run_testとき最新のものは何もコンパイルされず、ログはクリアされず、テストが実行されます。
  4. make run_testが最新の場合 - ログがクリアされた後、適切なコンパイルルールが実行され、テストが実行されます。

にはどうすればコンパイルが発生しなければならないときにのみ実行するようにreset_logターゲット(または同等のコマンド)を取得しますが、任意の依存関係のレシピが実行される前に?この例reset_logfinal.outターゲットはreset_logfinal.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 

答えて

1

が第二の一時ログファイルを使用し

log := file.log 
out := final.out 1.out 2.out 

.PHONY: run_test clean 

$(log): $(out) 
    mv [email protected] [email protected] 

run_test: $(log) 
    @echo "======= Run Test Here =======" 

clean: 
    $(RM) $(out) $(log) 

%.out: %.in 
    cp -v $< [email protected] | tee -a $(log).tmp 
+0

ブリリアント、ありがとう@ user657267。これが失敗する唯一のケースは、file.logが手動で削除され、他のすべての依存関係が最新である場合です。私は以下のログ移動コマンドを使用してそれを修正しました: 'mv $ @。tmp $ @ || (echo "WARNING:$ @。tmp not found。ダミー$ @を作成してmakeを実行できるようにする"> $ @) ' –

関連する問題