2016-11-24 84 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 

我從來沒有這個規模的項目,並且從來不需要爲這樣的項目製作一個make文件。我將如何爲此設計一個makefile?謝謝!

+0

你想使用自動依賴處理?如果是這樣,你想要依賴文件(例如'part5.d')去哪裏? – Beta

+0

我從來沒有使用過這些。我不知道他們是如何工作的。他們有必要嗎? – Sandles

+0

不,它們是讓Make自動做一些聰明的事情的高級技巧。沒有他們,你可能不得不親自照顧他們,或者沒有他們。 – Beta

回答

0

有不同的方式來做到這一點,但我會開始不讓makefile與項目一起成長。相反,我會使用常規結構來定義規則,以便在一個目錄中處理具有一個代碼文件的項目,並將這些規則處理爲帶有文件的大型項目。

例如讓玩家一點點你的結構(未測試可能有一些錯別字,我假設你開始從項目目錄做):

# 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

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 

現在的最後一件事是一個小化妝品:

.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 

無論項目多大,這個makefile都會執行一些步驟。它只是爲了給你一個想法。我忽略了test_files。但是,在未來的考慮中,您可以像使用常規來源一樣收集測試來源。

所以我的觀點是,絕對沒有理由你的makefile有項目的大小增長,只能用其複雜

欲瞭解更多信息,請查看文檔在這裏計算器,存在的makefile大量信息......

希望幫助,