2016-06-17 3 views
0

私は基本ディレクトリsrcと、2つのサブディレクトリsrc/fooとsrc/testsを持っています。 src/testsには、src/tests/tests.cppをビルドするMakefileがあります。これをsrc/foo/Makefile内の1つのターゲットが別のターゲットのターゲットに依存するように、Makefileを構造化するにはどうすればよいですか?

%.o : %.cpp 
    ${GCC} -c ${CXXFLAGS} $< -o [email protected] 

でコンパイルしているsrc/foo/*。oに依存させたいと思います。私のMakefileを他のものに組み込むことで構造を整えるよい方法はありますか? 、あなたはGNU makeを使用していると仮定すると、

# Obviously this is impossible right now since OBJECT_FILES is not defined in this Makefile. 
tests: tests.o ${OBJECT_FILES} 
    ${GCC} ${CXXFLAGS} tests.o ${OBJECT_FILES} -o tests 

tests.o: tests.cpp 
    ... 
+1

私はMakefileを捨て、より良いビルドシステムを使用します。個人的に私はCMakeを好むが、周囲には他の人がいる。 – Jens

+0

はい、 'make'はネイティブの再帰性またはプロジェクト全体のスコープのターゲット依存性を行いません。 'cmake'に加えて、' scons'または古い 'cons'もチェックします。 'scons'はネイティブに再帰的です。プロジェクト全体を見て、どこからでも依存関係を持つことができます。ほとんどの場合、現在試しているような依存関係を指定する必要はありませんが、それはそれを単独で発見することができます。 – Dummy00001

答えて

0

:つまり

は、SRC/fooが/ Makefileは次のようになります。

OBJECT_FILES += bar.o baz.o ... 

main: main.o ${OBJECT_FILES} 
    ${GCC} ${CXXFLAGS} main.o ${OBJECT_FILES} -o main 

%.o : %.cpp 
    ${GCC} -c ${CXXFLAGS} $< -o [email protected] 

と私はSRC /テスト/ Makefileのようなものをしたいですあなたは偽のターゲットを使うことができます。

.PHONY: foo_objets 

foo_objects: 
    $(MAKE) -C ../../src/foo 

testの依存関係としてfoo_objectsを定義します。

+0

.PHONYターゲットは、ビルドに失敗するよりも優れているが、理想的ではない依存関係チェックを排除します。また、 "make"と入力して再帰的なmakeを実行しないでください。それ以外の場合は並行制御を失うので、常に '$(MAKE)'を使用してください。 –

1

1つのプロジェクトに2つの自己完結型メイクファイルを組み合わせることは難しく、実際にはお勧めしません。理由については、Recursive Make Considered Harmfulをお読みください。これはmakeを再帰的に呼び出す場合にのみ適用され、プロジェクトの異なる部分が相互依存関係にある場合にのみ適用されます。

再帰オプションを忘れた場合、他のオプションはそれほど大きくないという問題があります。最も明白なのはtestsディレクトリのsrcメークファイルincludeです。ただし、srcメークファイルは、現在のディレクトリについて暗黙の前提を作っているため、testsディレクトリにあるときは真ではありません。

プロジェクトのルートに1つのメイクファイルを作成することをお勧めします。このファイルは、srctestsの両方を作成します。これにより、依存関係の指定が簡単になります。

あなたのプロジェクトのニーズは、彼らが得ることができる標準的なものです。コンパイルのパターンルールでさえ、makeに組み込まれているパターンルールの単純化されたバージョンです(つまり、makeファイルからパターンルールを削除することができます)。そのような場合、車輪を再発明しようとするのは私にとっては不要です。

標準ビルド生成ツールの1つを使用することをお勧めします。 automakeは普遍的に利用可能であり、コンパイルマシン上に特別なツールを必要としないので、私のお気に入りです。その学習曲線は、特に単純なプロジェクトでは、他のものよりもやや上がりますが、学習中に得られるツールは、それを使用しないプロジェクトにも役立ちます。

また、上記の理由から、自動ツールを復讐して嫌う人もいます。それぞれ自分自身に。

関連する問題