2

私はmakeファイルとVPATH変数で遊んでいます。基本的に、私はいくつかの異なる場所(VPATHで指定)からソースファイルを取得し、必要な.oファイルのリストを使用して現在のディレクトリにコンパイルします。

これまでのところ、依存関係情報を「.depend」というファイルに生成し、それを含めています。Gnumakeは、これまでに定義されたルールを使用して、含まれているファイルが存在しない場合は作成しようとします。これで問題ありません。基本的に、私のmakefileは次のようになります。

VPATH=A/source:B/source:C/source

objects=first.o second.o third.o

executable: $(objects)

.depend: $(objects:.o=.c)
    $(CC) -MM $^ > $@

include .depend

さて、本当の質問ですが、.dependファイルの生成をなんらかの方法で抑制できますか?私は現在、クリアケース環境で作業しています->遅いので、依存関係情報を更新するときに、もう少し制御できるようにしたいと思います。

makeを実行する前に.dependファイルにアクセスするスクリプトで物事をラップすることができるので(したがって、どのソースファイルよりも新しいものにする)、多かれ少なかれ学術的な演習ですが、どういうわけか私ができるかどうかを知ることは興味深いです'pure'makeを使用して抑制します。

VPATH解決を行うために変数に依存しているため、ソースファイルへの依存関係を削除できません(つまり、単にを使用します.depend:) 。$^

ディレクティブが更新された結果として依存関係のみを更新する方法があれば#include、もちろんそれはさらに良いでしょう..しかし、私はそのために息を止めていません.. :)

4

1 に答える 1

2

.dependを毎回リメイクしたくない場合は、ルールを設定する必要はありません。依存関係ファイルを本当に作り直す必要があるときはいつでも、オブジェクトファイルも作り直す必要があることに注意してください(これは私の洞察ではなく、Advanced Auto-Dependency Generationからのものであり、把握するのに時間がかかりました)。したがって、PHONYターゲットを使用して、リンクルールに.dependを作成します。

DEPEND_FILE = .depend
# put this command in the executable rule
    $(MAKE) DEPENDENCIES

.PHONY: DEPENDENCIES
DEPENDENCIES: $(objects:.o=.c)
    $(CC) -MM $^ > $(DEPEND_FILE)

-include $(DEPEND_FILE)

オブジェクトごとに1つずつ、個別の依存ファイルを作成することで、処理をより効率的にすることができます。これにより、1つ変更したときに、すべてのオブジェクトの依存関係を再計算する必要がなくなります。

# put this command in the %.o rule
    $(CC) -MM $< > $*.d

-include *.d

(編集:ばかげた間違いを修正しただけです。)

于 2010-03-16T12:27:52.633 に答える