web-dev-qa-db-ja.com

C / C ++でプロジェクトのメイクファイルの依存関係を生成する

依存関係が壊れたメイクファイルがあるプロジェクトがあります。手動または手書きのPerlスクリプトを使用して各ソースファイルを調べる以外に、メイクファイルで使用できるプロジェクトの依存関係のリストを生成する最もよく知られた方法はありますか?

36
Nathan Fellman

GNU make のドキュメントは優れたソリューションを提供します。

もちろんです。 _g++ -MM <your file>_は、GMake互換の依存関係リストを生成します。私はこのようなものを使用します:

_# Add .d to Make's recognized suffixes.
SUFFIXES += .d

#We don't need to clean up when we're making these targets
NODEPS:=clean tags svn
#Find all the C++ files in the src/ directory
SOURCES:=$(Shell find src/ -name "*.cpp")
#These are the dependency files, which make will clean up after it creates them
DEPFILES:=$(patsubst %.cpp,%.d,$(SOURCES))

#Don't create dependencies when we're cleaning, for instance
ifeq (0, $(words $(findstring $(MAKECMDGOALS), $(NODEPS))))
    #Chances are, these files don't exist.  GMake will create them and
    #clean up automatically afterwards
    -include $(DEPFILES)
endif

#This is the rule for creating the dependency files
src/%.d: src/%.cpp
    $(CXX) $(CXXFLAGS) -MM -MT '$(patsubst src/%.cpp,obj/%.o,$<)' $< -MF $@

#This rule does the compilation
obj/%.o: src/%.cpp src/%.d src/%.h
    @$(MKDIR) $(dir $@)
    $(CXX) $(CXXFLAGS) -o $@ -c $<
_

注:$(CXX)/gccコマンドは ハードタブが前にある である必要があります

これにより、変更された各ファイルの依存関係が自動的に生成され、適用されているルールに従ってコンパイルされます。これにより、新しいファイルを_src/_ディレクトリにダンプして、依存関係などを自動的にコンパイルすることができます。

52
Stefan Mai

この部分は特に を読んだので、最新バージョンのgcc/g ++を使用している限り、はるかに簡単な解決策があると思います。 -MMDCFLAGSに追加し、すべてのオブジェクトファイルを表す変数OBJSを定義して、次のようにします。

-include $(OBJS:%.o=%.d)

そうすれば、効率的でシンプルな自動依存関係構築システムが得られます。

19

GNU Cプリプロセッサcppには、-MMのオプションがあり、組み込みパターンに基づいて、適切な依存関係のセットを生成します。

6
Barry Kelly

これをメイクファイルに追加するだけで、うまく機能します。

-include Makefile.deps

Makefile.deps:
    $(CC) $(CFLAGS) -MM *.[ch] > Makefile.deps
4
fferri

Digital Mars C/C++コンパイラには makedep ツールが付属しています。

0
Walter Bright