如何编写可处理文件对的Makefile单规则以优化工作流
解决方案
可以通过提取唯一文件前缀、使用多目标规则来实现无冗余的单规则处理,同时完整覆盖QC和分析两步流程:
RAW_DIR = data/raw QC_DIR = data/qc RESULT_DIR = data/results # 提取所有唯一的文件前缀(自动识别成对的_1/_2文件) PREFIXES = $(sort $(patsubst %_1,%,$(patsubst %_2,%,$(basename $(notdir $(wildcard $(RAW_DIR)/*.txt)))))) # 定义所有QC文件对和最终结果文件 QC_PAIRS = $(foreach pref,$(PREFIXES),$(QC_DIR)/$(pref)_1.qc.txt $(QC_DIR)/$(pref)_2.qc.txt) RESULT_FILES = $(foreach pref,$(PREFIXES),$(RESULT_DIR)/$(pref)_result.txt) # 默认目标:生成所有最终结果 all: $(RESULT_FILES) # 单规则生成一对QC文件(同时输出两个文件,消除冗余目标) $(QC_DIR)/%_1.qc.txt $(QC_DIR)/%_2.qc.txt: $(RAW_DIR)/%_1.txt $(RAW_DIR)/%_2.txt mkdir -p $(QC_DIR) bash run_qc.sh -in1 $< -in2 $(word 2,$^) -out1 $(QC_DIR)/$*_1.qc.txt -out2 $(QC_DIR)/$*_2.qc.txt # 分析步骤:基于对应QC文件对生成结果 $(RESULT_DIR)/%_result.txt: $(QC_DIR)/%_1.qc.txt $(QC_DIR)/%_2.qc.txt mkdir -p $(RESULT_DIR) bash run_analysis.sh $^ > $@ # 清理生成的文件 clean: rm -rf $(QC_DIR) $(RESULT_DIR)
关键细节说明
- 自动识别文件对:通过
PREFIXES变量从原始文件名中提取去掉_1/_2和后缀的唯一前缀,自动遍历所有成对文件,无需手动添加新文件对的规则。 - 多目标规则:单个规则同时生成
%_1.qc.txt和%_2.qc.txt,Makefile会将这两个文件关联为同一规则的输出,避免了原方案中空规则的冗余,同时确保只要任一QC文件过期,就会重新运行QC步骤。 - 流程联动:结果文件直接依赖对应前缀的QC文件对,实现从原始数据→QC→最终结果的完整自动化流程。
- 可维护性:新增文件对时只需放入
RAW_DIR,Makefile会自动识别并处理,无需修改规则。
内容的提问来源于stack exchange,提问作者Grimey
相关产品推荐
相关产品推荐

