如何通过Makefile为各文件夹自动生成新版本XML文件?
用Makefile自动生成递增版本XML文件的解决方案
现有目录结构
upperfolder │ └───1 │ │ output_v1.xml │ │ output_v2.xml │ └───2 │ │ output_v1.xml │ └───3
期望目录结构
upperfolder │ └───1 │ │ output_v1.xml │ │ output_v2.xml │ │ output_v3.xml │ └───2 │ │ output_v1.xml │ │ output_v2.xml │ └───3 │ │ output_v1.xml
想要用Makefile实现上述目录更新,当前已有基础框架,但需要解决两个核心问题:
- 适配非纯数字命名的子文件夹,不用依赖文件夹名的特殊规则
- 自动获取每个子文件夹下
output_v*.xml的最新版本号,递增后生成新版本路径,传给writer.py脚本(该脚本需要两个参数:旧版本XML路径、新版本XML路径)
当前的Makefile代码:
./upperfolder/%: --- 需获取文件夹%的最新版本号,递增后计算新版本文件名 --- --- 将其传入Python脚本参数中 --- python3 writer.py <previous_version_path_script> $@_v?.xml all: ./upperfolder/1/output ./upperfolder/2/output ./upperfolder/3/output ./upperfolder/4/output
解决方案与实现代码
核心思路
不用纠结文件夹名,直接在目标文件夹内匹配版本文件,提取版本号并取最大值;然后计算新版本号,拼接路径后调用脚本。
完整Makefile代码
# 定义函数:传入文件夹路径,返回该文件夹下output_v*.xml的最新版本号 define get_latest_version $(shell ls $(1)/output_v*.xml 2>/dev/null | awk -F '_v|.xml' '{print $$2}' | sort -n | tail -1) endef # 通用目标规则:匹配upperfolder下任意子文件夹 ./upperfolder/%: # 获取当前文件夹的最新版本号,无版本文件则设为0 latest_version=$(call get_latest_version,$@); \ if [ -z "$$latest_version" ]; then latest_version=0; fi; \ # 计算新版本号 new_version=$$((latest_version + 1)); \ # 拼接旧版本路径(如果是第一个版本,旧路径为空,可根据脚本需求调整) old_path=""; \ if [ $$latest_version -gt 0 ]; then old_path="$@/output_v$$latest_version.xml"; fi; \ new_path="$@/output_v$$new_version.xml"; \ # 调用Python脚本 python3 writer.py $$old_path $$new_path # 指定需要处理的子文件夹 all: ./upperfolder/1 ./upperfolder/2 ./upperfolder/3 ./upperfolder/4
关键细节说明
- 版本号提取:
get_latest_version函数通过ls匹配版本文件,用awk分割字符串提取版本号,再排序取最大值;2>/dev/null用来屏蔽无匹配文件时的错误提示 - 空文件夹处理:如果子文件夹下没有任何
output_v*.xml,默认最新版本号为0,新版本号为1,生成第一个版本文件 - 适配任意文件夹名:目标规则
./upperfolder/%中的%可以匹配任意命名的子文件夹,不管是数字还是字符串命名都能正常工作 - 旧路径调整:如果你的
writer.py要求第一个版本必须传入某个模板文件,可以把old_path的默认值改成模板路径,比如old_path="template.xml"
内容的提问来源于stack exchange,提问作者Matthieu Rioual
相关产品推荐
相关产品推荐

