2

このWebページからmakeマニュアルのセクション4.14「前提条件の自動生成」と「高度な自動依存関係」を読んでいます。

メイクマニュアルのセクションは理解できたと思いますが、リンクしたWebページで頭を抱えることができないことが1つあります。

あなたがそれについて考えるならば、この再呼び出しは本当に不必要です。ターゲットのいくつかの前提条件が変更されたことがわかっているので、このビルドで更新された前提条件リストは実際には必要ありません。ターゲットを再構築することはすでにわかっています。最新のリストがあっても、その決定に影響はありません。

したがって、実行する代わりに:

  %.P : %.c
          $(MAKEDEPEND)
          @sed 's/\($*\)\.o[ :]*/\1.o $@ : /g' < $*.d > $@; \
             rm -f $*.d; [ -s $@ ] || rm -f $@

  include $(SRCS:.c=.P)

彼らはします:

  %.o : %.c
          @$(MAKEDEPEND)
          $(COMPILE.c) -o $@ $<

  -include $(SRCS:.c=.P)

しかし、ターゲットの前提条件が変更されたことがわかっている場合は、そのターゲットの依存関係リストを更新する必要はありませんか?そして、それはmakeの最初の呼び出しで行われたこととまったく同じではありませんか?私の理解では、include-statementに含まれるファイルは次のようになります。

list.o list.P : list.cc list.h debug.h

私はここに来ていないのですか?

4

1 に答える 1

3

ポイントは、存在しないオブジェクトや古いオブジェクトには依存リストが必要ないということです。とにかく再建です。

.Pおよびファイルの依存関係は、.c前提条件が同一であるため常に同一であるため、それらを個別に保持する必要はなく、オブジェクトがビルドされるたびに依存関係ファイルをビルドするだけです。

ターゲットの前提条件が変更されると、オブジェクトが再構築され、依存関係リストが副作用として更新されます。いずれにせよ、この実行でオブジェクトを再構築するため、この make 実行ではリストは必要ありません。次の場合にのみ必要です。

の最初の呼び出しはmake、依存関係リストを必要とせず、純粋にオブジェクトごとに動作します。オブジェクトを生成する副作用として、依存関係リストが生成され、次のmake実行でそれらが検出されます。

依存ファイルは次のようになります。

list.o : list.cc list.h debug.h

上記の理由により、そこにある依存ファイルについて言及する必要はまったくありません。

于 2013-02-13T13:20:42.387 に答える