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

如何编写Makefile处理先生成未知文件名的构建流程?

解决方案:递归Make + 动态目标生成

针对你遇到的问题,可以通过分阶段递归调用Make结合动态生成目标列表文件的方式解决,既保留Make的增量构建能力,又能处理第一步生成未知文件名的场景。

最终Makefile实现

.PHONY: all build clean

# 默认目标:先确保测试文件已生成,再调用子Make构建后续产物
all: .targets_ready
	@$(MAKE) --no-print-directory build

# 生成测试文件并创建目标列表
.targets_ready: spec.json
	# 清理旧产物,避免残留(若需要保留部分成功文件可删除此rm命令)
	-rm -f *.txt *.log *.csv targets.mk $@
	# 生成测试用例.txt文件
	./generate_testcases spec.json
	# 动态生成目标列表文件,记录所有.txt及对应.csv目标
	echo "TXT_FILES := $$(wildcard *.txt)" > targets.mk
	echo "CSV_FILES := $$(patsubst %.txt,%.csv,$$(TXT_FILES))" >> targets.mk
	touch $@

# 引入动态生成的目标列表
-include targets.mk

# 实际构建目标:所有.csv文件
build: $(CSV_FILES)

# 模式规则:.txt → .log
%.log : %.txt
	./run_test_case $<

# 模式规则:.log → .csv
%.csv : %.log
	./grab_test_data $<

# 清理所有产物
clean:
	-rm -f *.txt *.log *.csv targets.mk .targets_ready

方案细节说明

  1. 分阶段执行

    • 第一次运行make时,先执行.targets_ready规则:调用generate_testcases生成.txt文件,然后通过Shell命令收集所有.txt文件名,写入targets.mk文件。
    • 随后递归调用Make,此时targets.mk已存在,Make能读取到完整的.csv目标列表,通过模式规则完成增量构建。
  2. 增量构建保障

    • 模式规则%.log : %.txt和%.csv : %.log会自动检查文件时间戳,仅处理过期或缺失的文件,完美解决后两步易失败、需要重跑的问题。
  3. 旧文件残留处理

    • 当spec.json更新时,.targets_ready会被重新触发,自动清理旧的.txt/.log/.csv文件、targets.mk和标记文件,确保基于最新的spec生成所有产物。若希望保留部分已成功的文件,可删除rm -f *.txt *.log *.csv这一行。
  4. 避免提前依赖解析问题

    • 通过递归Make,将文件列表的生成和后续构建拆分为两个独立阶段,彻底解决了二次扩展时文件未生成、依赖解析过早的问题。

使用方式

  • 首次构建:直接运行make
  • 重跑失败任务:再次运行make,仅处理未完成或过期的文件
  • 更新spec后重新构建:运行make clean && make,或直接make(因为spec.json变化会触发重新生成所有文件)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 05:22:42