の生成:ここ私は次の構造を持つプロジェクトのメイクファイルを作成しようとしています別のフォルダ内の依存ファイルに
├──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)
依存ルールはプロジェクト開発者にとって便利なものであり、実際のビルド要件ではありません。裸のソースディストリビューションからバイナリにできるだけ迅速かつ簡単に移動したいだけなら、依存関係ルールを生成しないでください。そのような状況では、とにかくすべてを構築する必要があることを知っています。 –
しかしながら、提起された問題に関しては、あなたが求めていることは私には不明です。他の場所ではなく 'build'ディレクトリに' .d'ファイルを生成する方法は?あなたが記述したすべてのステップが1つの 'make'実行によってトリガされるようにするルールを作成するには?他に何か? –
私は明確にするために質問を更新しました。私がmakefileを書きたいと思っている実際のプロジェクトには、たくさんのファイルがあります。 1つのフォルダを使用している間のmakefileは、本当にきれいで効率的でした。まともなプロジェクトフォルダ構造に移行しながら、依存関係の自動生成を維持しようとしています。 –