私はGNU makeを使って簡単な2段階のプロジェクトMakefileを構築しようとしています。
フォローしたいロジックは
gcc -M
まず(を通じて)依存関係を構築します。- 2番目のステップビルド用に生成された.depファイルをMakefileに含めました。
私のプロジェクトの関連部分は次のとおりです。
MAKEDEP:=$(CXX) $(CXXFLAGS) -M
ALL_SRCS:=$(ALL_OBJS:.o:.cc)
CXX_DEPS:=$(patsubst %.o,.%.dep,$(ALL_OBJS))
-include $(CXX_DEPS)
%.o: %.cc .%.dep
$(CXX) $(CXXFLAGS) -c -o $@ $<
.%.dep: %.cc
$(MAKEDEP) -o $@ $<
clean:
$(RM) -vf $(ALL_OBJS) $(ALL_LIBS) $(ALL_APPS)
dep: $(CXX_DEPS)
1つの例外を除いて、すべてがうまく機能します。を実行すると、依存関係make clean
が再構築されます!clean: dep
単純な線ではなく線があるのと同じですclean:
。
$ make clean
g++ -Wall -std=c++11 -M -o .file1.dep file1.cc
g++ -Wall -std=c++11 -M -o .file2.dep file2.cc
g++ -Wall -std=c++11 -M -o .file3.dep file3.cc
rm -vf file1.o file2.o file3.o app
$
背景は何ですか?クリーンアップする前に依存関係を再構築する必要があるのはなぜですか?私はそのような依存をしませんでした。
答え1
makeにこれらのファイルを含めるように要求したので、makeはルールに従ってビルドします。
それでは、プロジェクトがこの問題をどのように解決したかを覚えておきましょう。
まず、とにかくターゲットファイルを構築する必要があるので、最初は追加の依存関係を気にしないことに注意してください。
.cc
その後、依存関係を追加(または削除)する場合は、すでに依存している項目(既存の項目またはそのいずれか)を変更する必要があります.h
。
要約すると、現在の状態の完全な依存関係のリストは必要なく、以前の状態の依存関係で十分です。したがって、.dep
sをsと同時に構築することができます.o
(ただ1つのパスしか必要ないため、より高速ですCC
)。
【次のポイントはよくわかりません】
これで依存関係をブートストラップする必要があります。 aが生成される.dep
たびにダミー(空)ファイルを生成するルールを作成します.cc
(非常に高速です)。
これで、これらのダミー.dep
ファイルを作成してクリーンアップする必要があります。再帰的なmakeを避ける場合、エラーを解決するためにクリーンアップは必要ありません(ディスクスペースを節約するためにクリーンアップするだけです)。
最後のステップは、1つのレベルの再帰を追加することです(再帰的なmakeは(通常)有害と見なされることを覚えておいてください)http://lcgapp.cern.ch/project/architecture/recursive_make.pdf)
実行できないルールを処理するために別のmakefileを呼び出すきれいなルールのための単純なmakefileを作成します。
おそらく最後のステップだけが必要でしょう。しかし、答えの始めはmakefileを改善する方法を示しているので削除しません。