GNU Make的双倍百分比

时间:2011-07-08 14:28:36

标签: makefile gnu-make

我正在尝试编写一个Makefile,它将从单个源文件生成一组“矩形”输出文件。想象一下,我们有一个SVG文件,我们想将它编译成许多PNG文件。 PNG文件的创建由两个参数(因此是“矩形”字)控制 - 分辨率(高,低)和颜色(彩色,黑白)。从SVG文件创建此类PNG文件的最简单的Makefile可能如下所示:

img-highres-color.png: img.svg
    convert --highres --color --output img-highres-color.png img.svg

img-highres-bw.png: img.svg
    convert --highres --bw --output img-highres-color.png img.svg

img-lowres-color.png: img.svg
    convert --lowres --color --output img-highres-color.png img.svg

img-lowres-bw.png: img.svg
    convert --lowres --bw --output img-highres-color.png img.svg

下一步是创建使用%的静态模式规则。我能够想出这个:

RESOLUTIONS = highres lowres
COLORS = color bw

PNG_FILES = $(foreach r, $(RESOLUTIONS), $(foreach c, $(COLORS), img-$(r)-$(c).png))

$(filter img-highres-%.png, $(PNG_FILES)): img-highres-%.png: img.svg
    convert --highres --$* --output img-highres-$*.png img.svg

$(filter img-lowres-%.png, $(PNG_FILES)): img-lowres-%.png: img.svg
    convert --lowres --$* --output img-lowres-$*.png img.svg

最后,我想创建一个静态模式规则,但这需要使用双%,如下所示:

RESOLUTIONS = highres lowres
COLORS = color bw

PNG_FILES = $(foreach r, $(RESOLUTIONS), $(foreach c, $(COLORS), img-$(r)-$(c).png))

$(filter img-%-%.png, $(PNG_FILES)): img-%-%.png: img.svg
    convert --$* --$* --output img-$*-$*.png img.svg

这当然不起作用。是否可以编写单一规则来实现这一目标?

以上情况简要描述了我的实际情况。重要的是RESOLUTIONSCOLORS变量的值不是事先知道的。此外,您能否提供足以处理两个以上维度的解决方案?在上面的示例中,第三个维度可以是文件类型 - PNG,JPG,GIF等。

2 个答案:

答案 0 :(得分:2)

您可以在此处使用$(eval)

RESOLUTIONS=highres lowres
COLORS=color bw
PNG_FILES = $(foreach r, $(RESOLUTIONS), $(foreach c, $(COLORS), img-$(r)-$(c).png))

all: $(PNG_FILES)

# Make the rules for converting the svg into each variant.

define mkrule
img-$1-$2.png: img.svg
    @convert --$1 --$2 --output $$@ $$<
endef
$(foreach color,$(COLORS),$(foreach res,$(RESOLUTIONS),$(eval $(call mkrule,$(res),$(color)))))

$(eval)允许您动态构造并将makefile片段注入正在解析的makefile中。你应该能够根据自己的喜好扩展它。

答案 1 :(得分:0)

您可以使用单个%并使用文本操作函数“解压缩”$*,如下所示:

$(filter img-%.png, $(PNG_FILES)): img-%.png: img.svg
    convert $(addprefix --,$(subst -, ,$*)) --output $@ $<

$(subst)$*拆分为-的单词,$(addprefix)依次对每个单词进行操作。额外奖励:同样的规则也适用于超过2个维度,只要您使用的标志都不包含-: - )