如何拥有带有子文件夹的通用生成文件

How to have a generic make file with subfolders?

本文关键字:文件夹 文件 何拥有 拥有      更新时间:2023-10-16

当然,这个问题已经被问了很多次了,但我找不到正确的答案,所以我在问。

我有以下项目结构:

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

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

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

要实现"无限"递归,可以使用具有扩展模式的通配符:

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')

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

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

  2. 目前还没有针对make的答案。

所以,这是如何在cmakeSCons中做到这一点。请注意我的目的不是贬低make,提倡以下两个中的任何一个(不过,我必须说 - 我的印象是当今构建系统的两种主流C++)等。

清明

在 CMake 基础教程中,您将使用如下所示的内容:

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

(有关详细信息,请参阅此问题。

康斯

在 Scons 基本教程中,您将使用如下内容:

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

(有关详细信息,请参阅此问题。