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

能否无需新增规则即可在Makefile中扩展更多文档与页面?

Makefile规则优化解答

当前的Makefile无法直接新增更多文档或页面,原因如下:

  • PDF的生成规则是通用模式规则%.pdf,这部分没问题——新增doc_2.pdf这类目标时,会自动触发wget下载对应的文件。
  • 但PNG的生成规则都是硬编码的单独规则,比如doc_0-page_0.png、doc_1-page_1.png等,没有通用的匹配逻辑。如果新增doc_2-page_0.png或doc_3-page_2.png这类目标,Makefile找不到对应的构建规则,必须手动添加新规则。

要实现「无需添加更多规则即可新增文档及页面」,需要把PNG的生成规则改成通用模式规则,替换掉所有硬编码的PNG规则。示例修改如下:

# 通用PDF下载规则
%.pdf:
	wget http://example.com/$@

# 通用PNG生成规则,匹配doc_X-page_Y.png格式的目标
%-page_%.png:
	# 从目标文件名中提取PDF名称和页码
	PDF_FILE=$(shell echo "$@" | sed 's/-page_[0-9]*\.png/.pdf/')
	PAGE_NUM=$(shell echo "$@" | sed 's/.*-page_\([0-9]*\)\.png/\1/')
	# 先确保PDF已下载
	$(MAKE) $(PDF_FILE)
	# 转换对应页码为PNG
	convert "$(PDF_FILE)[$(PAGE_NUM)]" "$@"

或者更简洁的写法(利用Makefile的函数处理文件名):

%.pdf:
	wget http://example.com/$@

# 拆分目标文件名,提取文档名和页码
DOC_NAME = $(firstword $(subst -page_, ,$@))
PAGE_NUM = $(lastword $(subst ., ,$(subst -page_, ,$@)))

%-page_%.png: $(DOC_NAME).pdf
	convert "$^[$(PAGE_NUM)]" $@

修改后,不管新增doc_2-page_3.png还是doc_10-page_5.png这类目标,Makefile都会自动匹配规则,先下载对应的PDF,再转换指定页码为PNG,无需手动添加任何新规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:27:16