もう1つのトリックは、注文のみの前提条件に加えて、への再帰呼び出しを使用することmake
です。intermediate.dat
これは、ファイルを作成する必要があるときに追加のロジックを実装する場合、またはターゲットを通常のexists && newer than
チェックから切り離す場合に役立ちますmake
。
例えば:
ファイルに、後続のタスクが依存する日付に依存する資料が含まれていて、12時間後に期限切れになるとします。これらのいずれかが当てはまる場合にのみ、ファイルを再作成します。
- ファイルが12時間以上経過している
- ファイルが存在しません
make targetとレシピを実装するために.PHONY
check-intermediate.dat
、タイムチェックを実行し、ファイルの有効期限が切れている場合は条件付きでファイルを削除してから、そのファイルに対して再実行するターゲットを作成make
します。
ターゲットは、順序のみの前提条件構文(eg )をcheck-intermediate.dat
介して定義されるため、常にターゲットの前に実行されることに注意してください(eg )。時間チェックは安価であり、常にファイルを実行および管理する必要がありますが、通常の前提条件ターゲットのように元のチェックがすでに存在する場合は、元のチェックを無効にしないでください。intermediate.dat: | check-intermediate.dat
intermediate.dat
make
intermediate.dat
.PHONY
.PHONY: check-intermediate.dat
check-intermediate.dat:
if [ -e intermediate.dat ]; then find intermediate.dat -mmin +720 -exec bash -c 'rm -f "{}"; $(MAKE) intermediate.dat' \; ; fi
intermediate.dat: | check-intermediate.dat
echo run-expensive-tasks-here-to-create-intermediate.dat
step1.dat: intermediate.dat
sleep 10
step2.dat: step1.dat
sleep 15
step3.dat: step2.dat
sleep 10
all: step3.dat
sleep 5
これで、ターゲットに依存するものはすべて、最初にチェックを実行し、有効期限が切れている場合はファイルを削除し、残りの依存ターゲットを実行する前にintermediate.dat
再実行します。make intermediate.dat
ファイルがすでに存在する場合intermediate.dat
はチェックを実行し、チェックに合格すると、時間のかかるレクリエーションタスクを実行せずに続行します。
.PHONY
ターゲットに依存する場合の問題は、 GNU Makeがターゲットを処理する方法が原因で、ターゲットに依存するタスクが常に実行されることです。これにより、次のことを行う必要がない場合でも、実行で常に時間のかかる操作が実行される可能性があります。.PHONY
make
偽のターゲットは、実際のターゲットファイルの前提条件であってはなりません。そうである場合、makeがそのファイルを更新するたびにそのレシピが実行されます。偽のターゲットが実際のターゲットの前提条件にならない限り、偽のターゲットレシピは、偽のターゲットが指定された目標である場合にのみ実行されます(目標を指定するための引数を参照)。