2016-11-24 45 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大量信息......

希望帮助,