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

在GitLab CI/CD流水线中并行化递归Makefile构建LaTeX文档

并行构建LaTeX文档的Makefile配置问题解答

核心结论

仅在Makefile 1的$(MAKE) -C $@处添加-jN参数不够,需要分两处配置才能实现真正的并行构建。

具体原因与解决方案

1. 顶层调用需传递并行参数

在GitLab CI/CD Runner执行顶层Makefile时,必须给顶层的make命令加上-jN参数(比如make -j4)。如果只在递归调用的$(MAKE)里加,顶层make仍会串行处理子目录的递归请求,无法触发并行。

2. 递归Makefile需传递并行参数

在Makefile 1的递归调用中,要把顶层的并行参数传递下去,而非硬编码-jN。正确写法为:

$(MAKE) -C $@ $(MAKEFLAGS)

$(MAKEFLAGS)会自动继承顶层make的所有参数(包括-jN),让所有中间层和底层的make进程都能并行执行任务。

3. 底层Makefile 2的注意事项

确保Makefile 2中的LaTeX构建任务独立无依赖——不同文档的编译任务不能有交叉依赖(比如共享临时文件),否则并行时会出现文件冲突。LaTeX单文档编译本身无法并行,但多文档之间的并行是安全的,只要每个文档的编译流程在自身目录内完成。

4. 之前尝试无效的可能原因

  • 仅在递归调用里加了-jN,但顶层make命令未添加,导致顶层串行处理子目录
  • 递归调用中硬编码了-jN,但底层Makefile存在隐藏的跨目录依赖,make自动降级为串行执行
  • GitLab Runner的资源限制(如CPU核数不足),即使添加-jN也无法真正实现并行

验证方法

在GitLab CI/CD的执行脚本里,将顶层命令修改为:

make -j$(nproc)

同时把Makefile 1的递归调用改为$(MAKE) -C $@ $(MAKEFLAGS),之后观察CI日志是否有多个LaTeX编译进程同时启动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 12:34:57