生成文件ߝ 建立所有可能的目标

发布于 2024-07-27 03:48:10 字数 365 浏览 0 评论 0原文

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

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

make foo.png 现在可以工作了。 但我坚持全部目标。 我想用一个命令转换所有内容(即所有 svgs)。

在所有示例中,我发现 all 目标执行类似以下操作:

all: ${OBJECTS}

但我确信对于我的情况有一种更简单的方法,请帮助我找到它! :D

I'd like to use a makefile to convert a set of svgs to pngs. The following snippet shows what I've done so far.

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

make foo.png works now. but I'm stuck with the all target. I'd like to convert everything (all svgs that is) with a single command.

In all examples I've found the all target does something like this:

all: ${OBJECTS}

But I'm sure there's a simpler way for my case, please help me find it ! :D

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

一口甜 2024-08-03 03:48:10

根据您使用的 make 版本,您也许能够基于所有存在的 svgs 定义一组目标。 例如,在 GNU make 中:

SVG = $(wildcard *.svg)
PNG = $(SVG:.svg=.png)

all: $(PNG)

Depending on the version of make you're using, you may be able to define a set of targets based on all the svgs that are present. For example, in GNU make:

SVG = $(wildcard *.svg)
PNG = $(SVG:.svg=.png)

all: $(PNG)
筱武穆 2024-08-03 03:48:10

我不记得 make 是否可以做到这一点。

您可以将 shell foreach 语句添加到您的所有内容中:

( cd origs ; for file in *.svg ; do ; conversion ${file} ; done )

您需要括号以使 foreach 共享相同的环境(shell)。

我的分号太多了; 当将多行 shell 命令转换为单行命令时,我永远记不起哪里需要它们,哪里不需要它们。

I don't remember if make can do that.

You could add a shell foreach statement to your all:

( cd origs ; for file in *.svg ; do ; convert ${file} ; done )

You need the parens to make the foreach share the same environment (shell).

I have too many semicolons; I can never remember where they're needed and not needed when turning a multiline shell command into a one-liner.

信愁 2024-08-03 03:48:10

你所拥有的是一个模式规则。 它告诉 make 如何创建某种类型的目标(以“.png”结尾的目标),而不是特定的任何目标。 所以你所拥有的是允许你输入任意“make foo.png”的东西,它会知道如何做到这一点。

我将其概括为创建一条用于制作“您可以从此目录制作的所有 .png”的规则的方法是使用变量。 在 makefile 的顶部添加类似这样的一行:

SVGs = *.svg
PNGs = $(subst .svg,.png,$(SVGs))

第一行将创建一个变量 SVG,其中包含目录中以“.svg”结尾的所有文件。 第二个创建一个变量 PNGs,包含相同的列表,但末尾带有“.png”。

然后您应该创建一个规则来构建所有 SVG,如下所示:

allsvgs : $(PNGs)

请注意,我没有将其称为“全部”。 “all”目标是一个非正式的标准目标,应该始终意味着“构建我的 makefile 支持的每个目标”,在您的情况下,我想您可以将“allsvgs”放在 all 的目标列表中,但是随着您的 makefile 的增长,您将需要向其中添加内容。

What you have up there is a pattern rule. It tells make how to make a certian kind of target (those ending with ".png"), rather than any target in particular. So what you have is something that allows you type in an arbitrary "make foo.png" and it will know how to do that.

The way I would generalise this to create a rule for making "all .png's you can make from this directory" would be using a variable. Put a line something like this at the top of your makefile:

SVGs = *.svg
PNGs = $(subst .svg,.png,$(SVGs))

The first line will create a variable SVGs that contains all the files in your directory ending in ".svg". The second creates a variable PNGs containing the same list, but with ".png" on the end instead.

Then you should create a rule to build all SVG's like so:

allsvgs : $(PNGs)

Note that I did not call it "all". The "all" target is an unnoficial standard target that should always mean "build every target my makefile supports", In your case I suppose you could make a case for putting "allsvgs" on all's list of targets, but as your makefile grows you will need to add stuff to it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文