Makefile:依赖于整个文件夹的目标
Makefile: target that depend on a whole folder
我想使用 Makefile 将一堆图像转换成视频(视频 video1.mp4
由文件 video1/*.mjpg
制作而成)。我试过了:
SOURCES=video1.mp4 video2.mp4
all: $(SOURCES)
%.mp4: $(shell find % -type f)
ffmpeg -framerate 24 -pattern_type glob -i '$*/*.jpg' -c:v libx264 -pix_fmt yuv420p $@
但它不起作用,%
没有变成类似 video1
的前缀。知道如何让它发挥作用吗?
您必须以另一种方式添加依赖项,因为 %
确实没有按照您的意愿处理。像这样的东西(用足够的 ffmpeg 调用替换猫)应该可以解决问题:
DESTS=video1.mp4 video2.mp4
all: $(DESTS)
define add_dependencies
$(1): $(wildcard $(1:.mp4=)/*.jpg)
endef
$(foreach dst,$(DESTS),$(eval $(call add_dependencies,$(dst))))
%.mp4:
cat $^ > $@
注:
我正在使用 built-in 通配符而不是查找。我使用它的方式,我不在 sub-directories 中递归,但你对 ffmpeg 的调用提示我这不是我想要的。
如果可能,我建议使用 $^
而不是在 ffmpeg 中再次匹配文件。
这是针对 GNU make 的,但我认为如果其他 make 不针对广泛的 GNU make 兼容性,则它们不会接受 $(shell)
语法。
我想使用 Makefile 将一堆图像转换成视频(视频 video1.mp4
由文件 video1/*.mjpg
制作而成)。我试过了:
SOURCES=video1.mp4 video2.mp4
all: $(SOURCES)
%.mp4: $(shell find % -type f)
ffmpeg -framerate 24 -pattern_type glob -i '$*/*.jpg' -c:v libx264 -pix_fmt yuv420p $@
但它不起作用,%
没有变成类似 video1
的前缀。知道如何让它发挥作用吗?
您必须以另一种方式添加依赖项,因为 %
确实没有按照您的意愿处理。像这样的东西(用足够的 ffmpeg 调用替换猫)应该可以解决问题:
DESTS=video1.mp4 video2.mp4
all: $(DESTS)
define add_dependencies
$(1): $(wildcard $(1:.mp4=)/*.jpg)
endef
$(foreach dst,$(DESTS),$(eval $(call add_dependencies,$(dst))))
%.mp4:
cat $^ > $@
注:
我正在使用 built-in 通配符而不是查找。我使用它的方式,我不在 sub-directories 中递归,但你对 ffmpeg 的调用提示我这不是我想要的。
如果可能,我建议使用
$^
而不是在 ffmpeg 中再次匹配文件。这是针对 GNU make 的,但我认为如果其他 make 不针对广泛的 GNU make 兼容性,则它们不会接受
$(shell)
语法。