如何在Makefile中处理运行时生成的文件并支持一次并行构建?
解决方案
核心问题分析
当前需要两次执行Makefile的原因是**navigation.nav的生成规则未明确依赖所有tags/*.tag文件**,第一次执行时.tag文件尚未生成,Make判定navigation.nav无需更新;第二次执行时.tag已存在,才触发导航文件的生成逻辑。同时要确保并行构建时,所有.tag文件生成完成后再执行导航文件的生成。
具体实现步骤
定义文件依赖变量
先梳理所有源文件与目标文件的对应关系:# 匹配所有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确保tags目录存在
提前创建输出目录,避免生成.tag文件时出错:tags: mkdir -p tags绑定rst到html和tag的生成规则
每个.rst文件编译时会同时输出.html和.tag,将两者设为同一规则的目标,确保生成动作的原子性:# 依赖tags目录与对应rst源文件 %.html tags/%.tag: %.rst tags # 替换为你的实际编译脚本命令,示例: ./your-compile-script.sh $< $(basename $<).html tags/$(basename $<).tag定义导航文件生成规则
让navigation.nav明确依赖所有.tag文件,确保Make等待所有.tag生成完成后再执行导航文件的生成:$(NAV_FILE): $(TAG_OUTPUTS) # 替换为你的导航文件生成命令,示例: ./generate-navigation.sh $^ > $@设置默认构建目标
将所有最终输出文件设为默认目标,确保执行make时一次性完成全部构建:.PHONY: all all: $(HTML_OUTPUTS) $(NAV_FILE)可选:添加清理规则
.PHONY: clean clean: rm -f $(HTML_OUTPUTS) $(NAV_FILE) rm -rf tags
并行构建支持
上述配置天然支持-j24并行构建:
- 所有
.rst文件的编译过程完全独立,Make会自动分配多核心并行处理这些任务 navigation.nav的生成规则会等待所有.tag文件生成完毕后才启动,不会出现依赖未就绪的问题
验证命令
执行以下命令即可一次性完成所有构建:
make -j24
内容的提问来源于stack exchange,提问作者gilhad
相关产品推荐
相关产品推荐

