我正在尝试编写一个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
这当然不起作用。是否可以编写单一规则来实现这一目标?
以上情况简要描述了我的实际情况。重要的是RESOLUTIONS
和COLORS
变量的值不是事先知道的。此外,您能否提供足以处理两个以上维度的解决方案?在上面的示例中,第三个维度可以是文件类型 - PNG,JPG,GIF等。
答案 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个维度,只要您使用的标志都不包含-
: - )