You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何并行运行子目录下的所有Makefile文件?

并行运行子目录Makefile的解决方法

你尝试运行子目录下的所有Makefile,但现有两种写法都无法实现并行执行:

无法并行的写法1

SUBDIRS := $(wildcard */.)

all: $(SUBDIRS)
$(SUBDIRS):
        $(MAKE) -C $@

.PHONY: all $(SUBDIRS)

无法并行的写法2

all:
    cd library  && $(MAKE) all && cd ..
    cd programs && $(MAKE) all && cd ..
    cd tests    && $(MAKE) all && cd ..

解决方法1:基于依赖规则的并行推荐方案

第一种写法本身结构规范,只是默认未开启并行。要实现并行,只需调用make时加上-j参数指定并行任务数,比如:

make -j4

这里的4代表同时运行4个并行任务,可根据CPU核心数调整。

如果不想每次命令行都加参数,也可以在Makefile里直接设置全局并行参数:

SUBDIRS := $(wildcard */.)
MAKEFLAGS += -j4  # 直接指定并行数

all: $(SUBDIRS)
$(SUBDIRS):
        $(MAKE) -C $@

.PHONY: all $(SUBDIRS)

这种方法的优势:

  • make会自动管理并行任务,若子目录间有依赖,只需在Makefile里声明(比如programs: library)即可正确处理执行顺序
  • 能准确捕获子目录make的错误,一旦某个子任务失败会及时终止
  • 可通过-l参数限制CPU使用率,避免资源耗尽

解决方法2:后台进程+等待方案

针对第二种写法,要改成并行,需把每个子目录的make命令放到后台执行,最后用wait等待所有任务完成:

all:
    cd library && $(MAKE) all &
    cd programs && $(MAKE) all &
    cd tests && $(MAKE) all &
    wait

这种方法的缺点:

  • 子任务的错误不会直接反馈给主make,可能某个子目录编译失败,主进程仍会继续等待直到全部结束
  • 多个子任务的输出会混在一起,难以排查问题
  • 无法自动处理子目录间的依赖关系

内容的提问来源于stack exchange,提问作者Li Sa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 08:50:08