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

如何在Makefile中处理运行时生成的文件并支持一次并行构建?

解决方案

核心问题分析

当前需要两次执行Makefile的原因是**navigation.nav的生成规则未明确依赖所有tags/*.tag文件**,第一次执行时.tag文件尚未生成,Make判定navigation.nav无需更新;第二次执行时.tag已存在,才触发导航文件的生成逻辑。同时要确保并行构建时,所有.tag文件生成完成后再执行导航文件的生成。

具体实现步骤

  1. 定义文件依赖变量
    先梳理所有源文件与目标文件的对应关系:

    # 匹配所有rst源文件
    RST_SRCS := $(wildcard *.rst)
    # 对应生成的html文件
    HTML_OUTPUTS := $(RST_SRCS:.rst=.html)
    # 对应生成的tag文件(统一放在tags目录)
    TAG_OUTPUTS := $(addprefix tags/,$(RST_SRCS:.rst=.tag))
    # 最终生成的导航文件
    NAV_FILE := navigation.nav
    
  2. 确保tags目录存在
    提前创建输出目录,避免生成.tag文件时出错:

    tags:
        mkdir -p tags
    
  3. 绑定rst到html和tag的生成规则
    每个.rst文件编译时会同时输出.html和.tag,将两者设为同一规则的目标,确保生成动作的原子性:

    # 依赖tags目录与对应rst源文件
    %.html tags/%.tag: %.rst tags
        # 替换为你的实际编译脚本命令,示例:
        ./your-compile-script.sh $< $(basename $<).html tags/$(basename $<).tag
    
  4. 定义导航文件生成规则
    让navigation.nav明确依赖所有.tag文件,确保Make等待所有.tag生成完成后再执行导航文件的生成:

    $(NAV_FILE): $(TAG_OUTPUTS)
        # 替换为你的导航文件生成命令,示例:
        ./generate-navigation.sh $^ > $@
    
  5. 设置默认构建目标
    将所有最终输出文件设为默认目标,确保执行make时一次性完成全部构建:

    .PHONY: all
    all: $(HTML_OUTPUTS) $(NAV_FILE)
    
  6. 可选:添加清理规则

    .PHONY: clean
    clean:
        rm -f $(HTML_OUTPUTS) $(NAV_FILE)
        rm -rf tags
    

并行构建支持

上述配置天然支持-j24并行构建:

  • 所有.rst文件的编译过程完全独立,Make会自动分配多核心并行处理这些任务
  • navigation.nav的生成规则会等待所有.tag文件生成完毕后才启动,不会出现依赖未就绪的问题

验证命令

执行以下命令即可一次性完成所有构建:

make -j24

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:05:22