同一配方的多个隐式(或模式)规则

multiple implicit (or pattern) rules for the same recipe

我有一个命令可以接受多种类型的输入文件并生成相关输出。 IT 所做的事情类似于从图像生成缩略图。我想写一次食谱并有一个隐式规则列表,每个规则都调用食谱,例如:

%.png : %.jpg
%.png : %.jpeg
%.png : %.svg
%.png : %.gif
        convert $< -resize 100x100 $@

这适用于 .gif 但对于其他文件类型我得到 "No rule to make target".

有没有办法在不复制食谱的情况下表达这套规则?

您可以添加一个没有先决条件的规则:

%.png : %.jpg
%.png : %.jpeg
%.png : %.svg
%.png : %.gif
%.png :
        convert $< -resize 100x100 $@

缺点 是,如果您在 none 的先决条件存在时尝试构建 foo.png, Make 将勇敢地尝试在没有输入文件的情况下构建它。您可以在配方中进行测试,以在这种情况下获得更优雅的退出,但它不会很优雅。

以下内容应该接近您的要求:

PICTURES   := $(wildcard *.jpg *.jpeg *.svg *.gif)
THUMBNAILS := $(addsuffix .png,$(basename $(PICTURES)))

.PHONY: all

all: $(THUMBNAILS)

$(THUMBNAILS):
    convert $< -resize 100x100 $@

%.png: %.jpg
%.png: %.jpeg
%.png: %.svg
%.png: %.gif