我想使用makefile将一组svgs转换为pngs。以下代码段显示了我到目前为止所做的工作。
%.png: origs/%.svg
convert -resize "32x" $< $@
make foo.png
现在有效。但我坚持使用所有目标。我想用一个命令转换所有东西(所有的svgs)。
在所有示例中,我发现所有目标都是这样的:
all: ${OBJECTS}
但我确信我的案子有一个更简单的方法,请帮助我找到它! :d
答案 0 :(得分:5)
根据您正在使用的make版本,您可以根据所有存在的svgs定义一组目标。例如,在GNU make:
中SVG = $(wildcard *.svg)
PNG = $(SVG:.svg=.png)
all: $(PNG)
答案 1 :(得分:0)
我不记得make是否能做到这一点。
您可以向所有人添加shell foreach语句:
(cd origs; for file in * .svg; do; convert $ {file}; done)
你需要使用parens来使foreach共享相同的环境(shell)。
我有太多的分号;我永远无法记住将多线外壳命令转换为单线时需要它们的位置。
答案 2 :(得分:0)
你有什么样的模式规则。它告诉make如何制作一种certian类型的目标(以“.png”结尾的目标),而不是特别是任何目标。所以你所拥有的是允许你输入任意“make foo.png”的东西,它会知道如何做到这一点。
我将这个概括为创建一个规则来制作“你可以从这个目录中创建所有.png”的方法将使用一个变量。在makefile的顶部放一行这样的行:
SVGs = *.svg
PNGs = $(subst .svg,.png,$(SVGs))
第一行将创建一个变量SVG,其中包含目录中以“.svg”结尾的所有文件。第二个创建一个包含相同列表的变量PNG,但最后使用“.png”。
然后你应该创建一个规则来构建所有SVG:
allsvgs : $(PNGs)
请注意,我并未将其称为“全部”。 “全部”目标是一个非正式的标准目标,应始终意味着“构建我的makefile支持的每个目标”,在您的情况下,我想您可以将“allsvgs”放在所有目标列表上,但随着您的makefile增长将需要添加东西。