2016-03-24 2 views
1

の生成:ここ私は次の構造を持つプロジェクトのメイクファイルを作成しようとしています別のフォルダ内の依存ファイルに

├──bin/ 
├──build/ 
│ ├──foo.d 
│ └──bar.d 
├──include/ 
│ └──foo.h 
│ 
├──lib/ 
├──src/ 
│ ├──foo.cc 
│ └──bar.cc 
│ 
├──Makefile 

はメイクファイルです:

# Define the compiler and the linker. 
CXX = g++ 
CC = g++ 
# Folders 
srcdir = src 
builddir = build 
out  = bin 

# Define preprocessor, compiler, and linker flags. 
CPPFLAGS = -I include -std=c++11 
LDFLAGS = -g -Llib 

# Phony targets 
.PHONY: all clean test 

# Targets 
all : $(out)/bar 
$(out)/bar : $(addprefix $(builddir)/,bar.o foo.o) 

# Standard clean 
clean : 
    rm -f $(builddir)/*.o $(builddir)/*.d 

# Generate dependencies in *.d files 
$(builddir)/%.d: $(srcdir)/%.cc 
    @set -e; rm -f [email protected]; \ 
    $(CPP) -MM $(CPPFLAGS) $< > [email protected]$$$$; \ 
    sed 's,\($*\)\.o[ :]*,$(builddir)/\1.o [email protected] : ,g' < [email protected]$$$$ > [email protected]; \ 
    rm -f [email protected]$$$$; 

deps = $(patsubst $(srcdir)/%.cc,$(builddir)/%.d,$(wildcard $(srcdir)/*.cc)) 
include $(deps) 

依存関係ファイルには、次が含まれています。

ソースfoo.d

build/foo.o build/foo.d : src/foo.cc include/foo.h 

bar.dは

build/bar.o build/bar.d : src/bar.cc include/foo.h 

その後、ビン/バープログラムをコンパイル非常に同じフォルダにオブジェクトファイルをコンパイルし、ビルド/ディレクトリに.dファイルを生成するために、どのような方法があります(FOOに依存しますか)?どんな助けもありがたい。

EDIT:

問題は、私は(すべてのファイルが同じフォルダにある場合、それは動作します)魔法のプログラムFOOをコンパイルする

all : $(out)/foo 

$(out)/foo : $(addprefix $(builddir)/,foo.o bar.o) 

$(builddir)/%.o : $(srcdir)/%.cc 
    $(CXX) -c $< -o [email protected] -MP -MMD -MF $(@:.o=.d) 

を期待していたということでした。

all : $(out)/foo 

$(out)/foo : $(builddir)/foo.o $(builddir)/bar.o 
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) $^ -o [email protected] 

$(builddir)/%.o : $(srcdir)/%.cc 
    $(CXX) -c $< -o [email protected] -MP -MMD -MF $(@:.o=.d) 
+0

依存ルールはプロジェクト開発者にとって便利なものであり、実際のビルド要件ではありません。裸のソースディストリビューションからバイナリにできるだけ迅速かつ簡単に移動したいだけなら、依存関係ルールを生成しないでください。そのような状況では、とにかくすべてを構築する必要があることを知っています。 –

+0

しかしながら、提起された問題に関しては、あなたが求めていることは私には不明です。他の場所ではなく 'build'ディレクトリに' .d'ファイルを生成する方法は?あなたが記述したすべてのステップが1つの 'make'実行によってトリガされるようにするルールを作成するには?他に何か? –

+0

私は明確にするために質問を更新しました。私がmakefileを書きたいと思っている実際のプロジェクトには、たくさんのファイルがあります。 1つのフォルダを使用している間のmakefileは、本当にきれいで効率的でした。まともなプロジェクトフォルダ構造に移行しながら、依存関係の自動生成を維持しようとしています。 –

答えて

2

ドロップsedナンセンスのすべて:

は、代わりに私がレシピを指定する必要がありました。 gccが一度にすべてのものを生成することができます。

$(builddir)/%.o : $(srcdir)/%.cc 
    $(CPP) -c $< -o [email protected] -MP -MMD -MF $(@:.o=.d) 

1にbuild/foo.dbuild/foo.oのための自動生成された依存関係を持つことになりますbuild/foo.obuild/foo.dを構築行くこと。

+0

なんらかの理由でこれが私に与えます 'foo.o:ファイルが認識されません:ファイル形式が認識されません collect2:エラー:ldが1を返しました終了ステータス' –

+0

@SebastianNはどんなコンテキストですか? – Barry

+0

私は自分の問題が依存関係世代に関係していると誤解しました。レシピを定義することになったのは初心者ミスでした。上記のエラーは、私のレシピで '$(CXX)'の代わりに '$(CPP)'を使用したためです。 私の教授が提案したsedベースのものよりもずっとクリーンなバージョンの依存関係生成を提供していただき、ありがとうございます。 –

関連する問題