Makefile - 构建所有可能的目标

时间:2009-07-14 17:20:00

标签: makefile

我想使用makefile将一组svgs转换为pngs。以下代码段显示了我到目前为止所做的工作。

%.png: origs/%.svg
    convert -resize "32x" $< $@

make foo.png现在有效。但我坚持使用所有目标。我想用一个命令转换所有东西(所有的svgs)。

在所有示例中,我发现所有目标都是这样的:

all: ${OBJECTS}

但我确信我的案子有一个更简单的方法,请帮助我找到它! :d

3 个答案:

答案 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增长将需要添加东西。