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 $^ > $@

注:

  1. 我正在使用 built-in 通配符而不是查找。我使用它的方式,我不在 sub-directories 中递归,但你对 ffmpeg 的调用提示我这不是我想要的。

  2. 如果可能,我建议使用 $^ 而不是在 ffmpeg 中再次匹配文件。

  3. 这是针对 GNU make 的,但我认为如果其他 make 不针对广泛的 GNU make 兼容性,则它们不会接受 $(shell) 语法。