Makefile - 从多个目录构建

Posted

技术标签:

【中文标题】Makefile - 从多个目录构建【英文标题】:Makefile - build from multiple directories 【发布时间】:2021-08-18 00:27:31 【问题描述】:

我是 Makefile 新手。

我有一串多个目录,我想编译其中的所有 .c 文件。 该字符串中的路径数可以更改(它作为来自脚本的参数接收)。 例如: DIRS = path1 path2...

我很乐意在构建一种机制方面获得帮助,该机制可以遍历 DIRS 并编译每个路径中的每个 .c 文件。

我不确定这是否是正确的方法,但到目前为止我得到了这个:


DIRS = path1 path2

define generateRules
SOURCES := $(wildcard $(path)/*.c)

%.o: $(SOURCES)
    echo "path is $(path)";
    $(CC) $(CFLAGS) $INCS $DEFS -c $< -o $BUILD/$@
endef

$(foreach path,$(DIRS),$(info $(generateRules)))

谢谢

【问题讨论】:

【参考方案1】:

让我们从生成源文件列表开始。

DIRS = path1 path2
SOURCES := $(wildcard $(addsuffix /*.c,$(DIRS)))

由此我们可以生成一个目标列表:

TARGETS = $(patsubst %.c,$(BUILD)/%.o,$(notdir $(SOURCES)))

获得所需效果的最简单方法是使用vpath directive 和static pattern rule:

vpath %.c $(DIRS)

$(TARGETS): $(BUILD)/%.o: %.c
    @echo building $@ from $<
    $(CC) $(CFLAGS) $INCS $DEFS -c $< -o $@

如果您想为每个源目录(或每个源文件)生成规则,您可以这样做,但这需要一些更高级的技术。我建议您先使用简单的方法。

【讨论】:

非常感谢@Beta!

以上是关于Makefile - 从多个目录构建的主要内容,如果未能解决你的问题,请参考以下文章

使用 Makefile 在多个文件 C++ 中构建互连的类

如何根据vs工程构建makefile文件

如何创建用于从子目录中的其他 Makefile 编译多个驱动程序的 Makeflow

makefile从0到1

Linux项目自动化构建工具——make/Makefile

Makefile 项目 - 通过“-j”参数使用多个作业时防止构建失败