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

如何配置Makefile实现JSON变更时自动维护对应音视频文件?

搞定Makefile的动态文件同步问题

咱们先拆解下你遇到的错误:你的规则%.mp3: %.json默认要求.mp3和.json在同一个目录,但你通过嵌套subst生成的目标是target/main/audio/hello.mp3,Make会自动去找同目录下的hello.json——可你的JSON明明在target/main/data/里啊!路径不匹配,自然就找不到规则了。

接下来咱们一步一步配置一个能完整支持「JSON→图像→音频→视频」全流程,还能自动响应JSON增删改的Makefile:

完整Makefile示例

# 1. 自动抓取所有动态变化的JSON源文件
JSON_FILES := $(wildcard target/*/data/*.json)

# 2. 生成对应图像文件的路径(这里假设图像是.png,你可以改成自己的格式)
IMAGE_FILES := $(patsubst target/%/data/%.json, target/%/image/%.png, $(JSON_FILES))

# 3. 生成对应音频文件的路径
AUDIO_FILES := $(patsubst target/%/image/%.png, target/%/audio/%.mp3, $(IMAGE_FILES))

# 4. 生成对应视频文件的路径(这里假设视频是.mp4)
VIDEO_FILES := $(patsubst target/%/audio/%.mp3, target/%/video/%.mp4, $(AUDIO_FILES))

# 默认目标:生成所有最终视频文件
all: $(VIDEO_FILES)

# 规则1:JSON → 图像(替换成你实际的图像生成命令)
target/%/image/%.png: target/%/data/%.json
	# 先创建目标目录,避免目录不存在报错
	mkdir -p $(@D)
	./scripts/image --input $< --output $@

# 规则2:图像 → 音频(调整路径匹配,替换成你的音频生成命令)
target/%/audio/%.mp3: target/%/image/%.png
	mkdir -p $(@D)
	./scripts/audio --input $< --output $@

# 规则3:音频 → 视频(替换成你的视频生成命令)
target/%/video/%.mp4: target/%/audio/%.mp3
	mkdir -p $(@D)
	./scripts/video --input $< --output $@

# 自动清理:删除没有对应上游源文件的中间/最终文件
clean-unused:
	# 清理无对应JSON的图像
	@for img in $(wildcard target/*/image/*.png); do \
		source_json=$$(echo $$img | sed 's/image/data/; s/png/json/'); \
		if [ ! -f $$source_json ]; then \
			echo "Removing unused image: $$img"; \
			rm $$img; \
		fi; \
	done
	# 清理无对应图像的音频
	@for audio in $(wildcard target/*/audio/*.mp3); do \
		source_img=$$(echo $$audio | sed 's/audio/image/; s/mp3/png/'); \
		if [ ! -f $$source_img ]; then \
			echo "Removing unused audio: $$audio"; \
			rm $$audio; \
		fi; \
	done
	# 清理无对应音频的视频
	@for video in $(wildcard target/*/video/*.mp4); do \
		source_audio=$$(echo $$video | sed 's/video/audio/; s/mp4/mp3/'); \
		if [ ! -f $$source_audio ]; then \
			echo "Removing unused video: $$video"; \
			rm $$video; \
		fi; \
	done

# 声明伪目标,避免和同名文件冲突
.PHONY: all clean-unused

关键细节解释

  1. 路径精准匹配:用patsubst代替嵌套subst,能精准匹配目录结构(比如target/xxx/data/yyy.json → target/xxx/image/yyy.png),解决了你之前路径不匹配的核心问题。
  2. 自动创建目录:每个规则里的mkdir -p $(@D)会自动创建目标文件所在的目录($(@D)代表目标文件的目录部分),避免因为目录缺失导致的报错。
  3. 动态增改响应:JSON_FILES用wildcard实时抓取所有JSON文件,只要JSON新增/修改,Make会自动触发下游的图像→音频→视频生成流程。
  4. 自动删除冗余文件:clean-unused目标会遍历所有中间/最终文件,检查对应的上游源文件是否存在——如果某个JSON被删除了,对应的图像、音频、视频都会被自动清理。你可以把它加到all的依赖里(比如all: $(VIDEO_FILES) clean-unused),这样每次执行make都会自动清理冗余文件;或者手动执行make clean-unused。

如果你不需要图像步骤

如果你的流程是JSON直接生成音频(跳过图像),只需要调整路径转换和对应规则即可:

# 直接从JSON生成音频路径
AUDIO_FILES := $(patsubst target/%/data/%.json, target/%/audio/%.mp3, $(JSON_FILES))

# 对应的规则
target/%/audio/%.mp3: target/%/data/%.json
	mkdir -p $(@D)
	./scripts/audio --json $< --output $@

这样路径就完全匹配了,不会再出现找不到规则的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:12:42