如何在Makefile依赖项中实现整数运算以生成通用规则?
在GNU Make中实现.x 对.y的依赖关系
不需要借助外部脚本,直接用GNU Make的内置函数和shell扩展就能实现需求,以下是两种可行方案:
1. 通用模式规则(简洁直接)
利用GNU Make的自动变量$*(代表目标文件名去掉后缀后的部分),结合$(shell)执行整数运算,直接写出依赖规则:
%.x : $(shell echo $$(( $(basename $*) - 1 ))).y # 此处添加你的目标文件生成命令,例如: # process $< -o $@
原理说明
- 当Make处理目标
2.x时,$*会被替换为2 $(shell echo $$(( 2 - 1 )))执行shell整数运算,得到1- 最终依赖自动解析为
1.y,完全符合手动编写的规则逻辑
2. 提前生成所有规则(性能优化)
如果你的目标文件数量较多,多次调用shell可能影响性能,可以用foreach和eval提前生成所有依赖规则,只执行一次shell批量处理:
# 先获取所有 .x 格式的目标文件 X_TARGETS := $(wildcard *.x) # 定义生成单条依赖规则的模板 define MAKE_DEP_RULE $(1) : $(shell echo $$(( $(basename $(1)) - 1 ))).y endef # 遍历所有目标文件,批量生成规则 $(foreach target,$(X_TARGETS),$(eval $(call MAKE_DEP_RULE,$(target))))
针对你的财务场景适配
你的实际需求是<year>_opening.journal依赖<year-1>.journal,只需稍作调整规则即可:
%_opening.journal : $(shell year=$(basename $*); echo $$(( $$year - 1 ))).journal # 此处添加生成期初报表的命令,例如: # generate-opening-report $< $@
原理说明
- 当处理目标
2023_opening.journal时,$*会被替换为2023 - shell命令提取年份并减1,得到
2022,最终依赖为2022.journal
内容的提问来源于stack exchange,提问作者PieterV
相关产品推荐
相关产品推荐

