如何配置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
关键细节解释
- 路径精准匹配:用
patsubst代替嵌套subst,能精准匹配目录结构(比如target/xxx/data/yyy.json→target/xxx/image/yyy.png),解决了你之前路径不匹配的核心问题。 - 自动创建目录:每个规则里的
mkdir -p $(@D)会自动创建目标文件所在的目录($(@D)代表目标文件的目录部分),避免因为目录缺失导致的报错。 - 动态增改响应:
JSON_FILES用wildcard实时抓取所有JSON文件,只要JSON新增/修改,Make会自动触发下游的图像→音频→视频生成流程。 - 自动删除冗余文件:
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
相关产品推荐
相关产品推荐

