能否无需新增规则即可在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
相关产品推荐
相关产品推荐

