Makefile依赖文件修改后未触发目标更新问题
故障原因
核心问题出在all目标的依赖写法:
- 直接在依赖列表中写
./data/tables/*.docx属于shell风格通配符,GNU Make读取Makefile时只会做一次展开:如果当前./data/tables/目录下没有匹配的docx文件,这个通配符会被当成字面文件名*.docx处理,Make找不到生成这个字面文件的规则,就会直接跳过所有表格构建逻辑;就算目录下已经有docx文件,这种直接写的裸通配符也不会正确关联到你定义的模式规则做时间戳检查,修改对应py脚本时Make感知不到依赖变化。 - 这种写法还有附加问题:如果新增了
make-table-3.py这类新的表格生成脚本,因为对应的docx还不存在,通配符匹配不到,Make永远不会自动构建新增的表格。
修复方案
不要直接在依赖里写裸通配符,通过Make内置函数从已有的表格生成脚本自动推导所有需要构建的docx目标,让Make能正确枚举所有目标、关联模式规则做依赖检查。
修复后的完整Makefile如下:
# 枚举所有表格生成脚本,自动推导对应输出的docx文件路径 TABLE_SCRIPTS := $(wildcard ./src/make-*.py) TABLE_TARGETS := $(patsubst ./src/make-%.py,./data/tables/%.docx,$(TABLE_SCRIPTS)) all: ./data/for_analysis.csv $(TABLE_TARGETS) ./data/for_analysis.csv : ./src/convert-xls-to-gold-standard.py ./data/ED-TRAUMA-DELTA-STUDY_3_2019_total.xlsx python3 $< --rawDataPath $(word 2,$^) --fieldCodesPath ./data/excel_field_codes.json --processedDataPath ./data/for_analysis.csv --logDir ./logs ./data/tables/%.docx : ./src/make-%.py ./data/for_analysis.csv python3 $< --fieldCodesPath ./data/excel_field_codes.json --processedDataPath ./data/for_analysis.csv --logDir ./logs --tablesDir ./data/tables
修复后验证:修改任意./src/make-*.py文件后执行make,Make会正确检测到依赖更新,自动执行对应脚本重新生成目标docx;新增表格生成脚本时也不需要修改Makefile,会自动纳入构建范围。
内容的提问来源于stack exchange,提问作者mac389
相关产品推荐
相关产品推荐

