如何使用子文件夹的通用make文件?

时间:2016-01-26 14:25:49

标签: c++ makefile

可以肯定的是,这个问题已经被多次询问过了,但我找不到合适的答案,所以我要问。

我有以下项目结构:

/root
 | obj
 | Makefile
 | src/
 | | dir1/
 | |  | 1.cpp
 | | dir2/
 | |  | 2.cpp
 | |  | dir3/
 | |  |  | 3.cpp
 | |  |  | 4.cpp
 | | main.cpp

我是否可以使用一个通用的makefile来编译任何子文件夹中的所有cpp文件,其中任何深度的src文件夹都会将对象文件生成到obj目录中?

注意这个项目是使用Eclipse CDT开发的,我现在希望能够提供源代码而无需用户安装Eclipse来构建它

2 个答案:

答案 0 :(得分:3)

实现无限制的'递归,您可以使用带扩展模式的通配符:

CPPFILES := $(wildcard src/**/*.cpp)

然后您可以将它们转换为.o文件列表:

OBJFILES := $(patsubst src/%.cpp,obj/%.o,$(CPPFILES))

现在我们有了构建目标:

.PHONY: all
all: $(OBJFILES)

编制规则:

obj/%.o: src/%.cpp
    mkdir -p "$(@D)"
    $(CC) -c $< -o $@

如果带有扩展模式的通配符不起作用,则可以使用:

CPPFILES := $(shell find src -name '*.cpp')

答案 1 :(得分:2)

好吧,我不打算回答这个问题(这个答案本身并不是make),但是:

  1. OP表示他并没有专门针对make,只是最简单的解决方案。

  2. 目前还没有make具体答案。

  3. 所以,这是如何在cmakeSCons中完成的。 请注意我的目的不是贬低make,提倡以下两种方式(但是,我必须说 - 我认为这是两个主流的C ++构建系统今天)等等。

    <强> CMake的

    在CMake basic tutorial中,您可以使用以下内容:

    file(GLOB_RECURSE variable [RELATIVE path] 
    [FOLLOW_SYMLINKS] [globbing expressions]...)
    

    (有关详细信息,请参阅this question。)

    <强>使用SCons

    在Scons basic tutorial中,您可以使用以下内容:

    def getSubdirs(abs_path_dir):  
        lst = [ name for name in os.listdir(abs_path_dir) if os.path.isdir(os.path.join(abs_path_dir, name)) and name[0] != '.' ]    
        lst.sort()
        return lst
    

    (有关详细信息,请参阅this question。)