如何参数化制作目标?

时间:2016-03-01 03:46:56

标签: shell unix makefile

我的makefile中有以下目标,可以为我的Android应用生成图标:

base_icon := icon-base.png

Icon-ldpi.png: $(base_icon)
    convert $< -resize 36x36 -unsharp 1x4 $@

Icon-mdpi.png: $(base_icon)
    convert $< -resize 48x48 -unsharp 1x4 $@

Icon-hdpi.png: $(base_icon)
    convert $< -resize 72x72 -unsharp 1x4 $@

Icon-xhdpi.png: $(base_icon)
    convert $< -resize 96x96 -unsharp 1x4 $@

Icon-xxhdpi.png: $(base_icon)
    convert $< -resize 144x144 -unsharp 1x4 $@

Icon-xxxhdpi.png: $(base_icon)
    convert $< -resize 192x192 -unsharp 1x4 $@

icons_android: \
    Icon-ldpi.png \
    Icon-mdpi.png \
    Icon-hdpi.png \
    Icon-xhdpi.png \
    Icon-xxhdpi.png \
    Icon-xxxhdpi.png

如果不反复重复转换说明,我怎样才能使它更优雅?

我正在寻找的是某种参数化目标:

Icon-%.png: $(base_icon)
    convert $< -resize $(size) -unsharp 1x4 $@

但我不确定如何查找给定图标的$(size)。是否有一些我可以在Makefile中定义并在目标中查找的地图?

1 个答案:

答案 0 :(得分:1)

尝试以下示例,尽管它并不完美,

base_icon :=  icon-base.png

define icon_template
Icon-$(1).png: $$(base_icon)
        convert $$< -resize $(2) -unsharp 1x4 $$@
icons_android: Icon-$(1).png
endef

$(eval $(call icon_template,ldpi,36x36))
$(eval $(call icon_template,mdpi,48x48))
$(eval $(call icon_template,hdpi,72x72))