2

(これはGNU makeに似ています:ターゲットを実行しますが、ファイルから依存関係を取得しますが、わずかに異なります)。

ターゲットを強制的にビルドしようとすると、makeはこのターゲットが古くなっていると自動的に判断し、それに依存するすべてのターゲットを強制的に実行します。

私の場合、ターゲットは再帰的なmake呼び出しであり、多くの作業を実行し、「何もする必要がない」と返される可能性があります。

 .PHONY: intermediate.dat
 intermediate.dat:
      $(MAKE) expensive_chain_which_finally_creates_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は変更されていない可能性がありますが、「makeall」は40秒間実行されます(再帰的なmakeは「何もしません」を返しました)。ただし、再帰的なmakeがintermediate.datを更新した場合、ターゲットは古くなっている必要があります

これを行う方法は本当にありませんか?

よろしくdivB

4

2 に答える 2

3

偽物そのものではなく、偽物のターゲットにintermediate.dat 依存するようにします。

 .PHONY : always-remake

 intermediate.dat : always-remake

IIRC、最後に問題を解決したとき、.PHONYが意図したとおりに機能せず、次を使用しました。

 always-remake :
     @true

代わりは。ただし、理由が思い出せないので、まずは.PHONYを試してみてください。

intermediate.dat自分自身を偽物にすることの問題make は、偽物のファイルの存在/日付を決してチェックしないことです。これはあなたが望む振る舞いです。再構築ルールをトリガーする必要があるだけです。これは、古い前提条件によって実行されます。偽の前提条件は常に古くなっているので、それは仕事をします。

于 2012-06-20T13:53:35.917 に答える
1

もう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.datintermediate.datmakeintermediate.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がターゲットを処理する方法が原因で、ターゲットに依存するタスクが常に実行されることです。これにより、次のことを行う必要がない場合でも、実行で常に時間のかかる操作が実行される可能性があります。.PHONYmake

偽のターゲットは、実際のターゲットファイルの前提条件であってはなりません。そうである場合、makeがそのファイルを更新するたびにそのレシピが実行されます。偽のターゲットが実際のターゲットの前提条件にならない限り、偽のターゲットレシピは、偽のターゲットが指定された目標である場合にのみ実行されます(目標を指定するための引数を参照)。

于 2016-05-16T23:32:08.080 に答える