非递归多级makefile

时间:2016-11-24 18:33:52

标签: makefile gnu-make

我开始研究一个我想要发展得相当大的项目。我想创建一个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?谢谢!

1 个答案:

答案 0 :(得分:0)

有不同的方法可以做到这一点,但我首先不要让makefile随项目一起增长。相反,我会使用常规结构来定义规则来处理一个目录中带有一个代码文件的项目,以及带有文件thousend的大型项目。

例如,让我们对你的结构稍微玩一下(未经过测试可能会有一些错别字,我假设你从项目目录开始制作):

 # 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 "$@" "$<"

现在可以说main位于part1.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 $@ $^
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必须随着项目的大小而增长,只有复杂性

有关更多信息,请查看stackoverflow中的文档,有很多关于makefile的信息...

希望有所帮助,