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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:03:17