2016-11-24 29 views
1

私は、かなり大きくなるように成長したいプロジェクトに取り掛かりつつあります。私はあまりメンテナンスすることなくプロジェクトと共に成長するmakefileを作りたいと思っています。ここに私が今持っているディレクトリ構造があります。非再帰的マルチレベルメークファイル

. 
+--src 
| +--part1 
| | +--part1.c 
| | +--part1.h 
| +--part2 
| | +--part2.c 
| | +--part2.h 
. . 
. . 
. . 
| +--partN 
| | +--partN.c 
| | +--partN.h 
+--test 
| +--part1_tests 
| | +--part1_testX.c 
| | +--part1_testY.c 
. . 
. . 
. . 
+--obj 
| +--part1.o 
| +--part2.o 
. . 
. . 
. . 
| +--partN.o 
+--a.out 

私はこのスケールのプロジェクトを持っていませんし、このようなプロジェクトのためにメイクファイルを作る必要はありませんでした。このために私はどのようにmakefileを設計するのですか?ありがとう!

+0

あなたは依存関係の自動処理を使用しますか?もしそうなら、依存ファイル(例えば 'part5.d')をどこに行きたいのですか? – Beta

+0

私はそれらを一度も使用していません。私は彼らがどのように働くのか分かりません。彼らは必要ですか? – Sandles

+0

いいえ、彼らは、Makeが自動的に巧妙なことをするための高度な技です。それらがなければ、あなたは手でそれらを世話しなければならないか、それらなしでする必要があります。 – Beta

答えて

0

これを行うにはさまざまな方法がありますが、私は、メイクファイルをプロジェクトと共に成長させないことから始めます。代わりに私は規則的な構造を使用して、1つのディレクトリ内の1つのコードファイル、たくさんのファイルを持つ大きなプロジェクト、というプロジェクトを処理するルールを定義します。

# we nead the header directory 
INCDIRS  = src 

# collect every cpp file 
CXXSRCS = $(shell find src/ -type f -name '*.cpp' 2>/dev/null) 

# now generate the object file names 
OBJSTMP = $(CXXSRCS:%.cpp=obj/%.o) 

# compiled the source file 
obj/%.o: src/%.cpp 
     $(CXX) ${CXXFLAGS} $(foreach bin,${INCDIRS},-I${bin}) -o "[email protected]" "$<" 

は今、あなたのmainpart1.cppであると言うことができます::

例えば

は(テストしていないいくつかの誤植を持っていると私はあなたがプロジェクトディレクトリから作る始めると仮定かもしれません)あなたの構造を少し再生することができます

.PHONY: clean all 

all: install 

compile: ${OBJS} 

package: compile ${executable} 
    #now we can move the object files to were they should be 
    mv -f obj/part*/* obj/ 

install: package 
ifneq (,$(wildcard src/part1/part1.cpp)) 

# I just dont like a.out... 
executable=${APPLICATION_NAME} 

# now lets build the exe: 
${executable}: ${OBJS} 
    $(LD) $(LDFLAGS) -o [email protected] $^ 
endif 

は今、最後は少し化粧品です

あなたのプロジェクトがどれほど大きくても、このメイクファイルはいくつかのステップを実行します。あなたの考えを伝えるだけです。私はtest_filesを無視しました。しかし、先に考えてみると、通常の情報源と同じようにテストソースを収集することができます。

だから、私のポイントは、あなたのメイクファイルのみがその複雑で、あなたのプロジェクトのサイズと一緒に成長していない理由は絶対にありません。

詳細については、...のmakefileのためのたくさんの情報があり、ここにStackOverflowのドキュメントで見て助け

希望、

甲斐