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

Makefile 同一配方的多个隐式(或模式)规则,makefile,gnu-make,Makefile,Gnu Make,我有一个命令,可以获取多种类型的输入文件并生成相关的输出。它的功能类似于从图像生成缩略图。我想写一次配方,并列出每个调用配方的隐式规则列表,例如: %.png : %.jpg %.png : %.jpeg %.png : %.svg %.png : %.gif convert $< -resize 100x100 $@ %.png:%.jpg %.png:%.jpeg %.png:%.svg %.png:%.gif 转换$

我有一个命令,可以获取多种类型的输入文件并生成相关的输出。它的功能类似于从图像生成缩略图。我想写一次配方,并列出每个调用配方的隐式规则列表,例如:

%.png : %.jpg
%.png : %.jpeg
%.png : %.svg
%.png : %.gif
        convert $< -resize 100x100 $@
%.png:%.jpg
%.png:%.jpeg
%.png:%.svg
%.png:%.gif
转换$<-调整大小100x100$@
这适用于
.gif
,但对于其他文件类型,我得到的是“无规则设置目标”


有没有一种方法可以在不重复配方的情况下表达这组规则?

您可以添加一条规则,而无需先决条件:

%.png : %.jpg
%.png : %.jpeg
%.png : %.svg
%.png : %.gif
%.png :
        convert $< -resize 100x100 $@
%.png:%.jpg
%.png:%.jpeg
%.png:%.svg
%.png:%.gif
%.png:
转换$<-调整大小100x100$@

缺点是,如果您试图在不存在任何prereq的情况下构建
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
图片:=$(通配符*.jpg*.jpeg*.svg*.gif)
缩略图:=$(addsuffix.png,$(basename$(图片)))
冒牌货:全部
全部:$(缩略图)
$(缩略图):
转换$<-调整大小100x100$@
%.png:%.jpg
%.png:%.jpeg
%.png:%.svg
%.png:%.gif

想知道如果有两个文件具有相同的stem但文件扩展名不同,比如
picture.svg
picture.jpeg
,会发生什么情况?这与两个规则匹配一个目标时会发生的情况相同:第一个规则获胜。我没有说,但我已经有了一个作为过程一部分构建的目标列表,所以不需要$(通配符)。这是有道理的。。。我没有想到您可以在没有指定依赖项的规则的配方中使用$<。