1

我的 Makefile 有一些问题:

# Manage rendering of images
.PHONY: explode

all: explode anime.apng

out.ppm: file.code
    ./pgm -f $<

explode: out.ppm
    split -d -a 3 --lines=$(N) --additional-suffix=.ppm $< frame

# Convert to multiple png
%.png: %.ppm
    convert $< $@
    optipng $@

# Assemble in one animated png
anime.apng: %.png
    apngasm $@ frame000.png

我的问题是:我不知道要生成最终目标需要多少中间文件,所以我无法提前指定它们。示意图:

1 file.code -> 1 out.ppm |> LOADS of .ppm |> LOADS of .png -> 1 anime.apng
                         +> …             +> …
                         +> …             +> …

为此,我使用了一个隐含的规则%.png: %.ppm。但是我无法为最后一个合并步骤指定先决条件!有任何想法吗?使用 make 以外的其他工具?有什么优雅的吗?

4

2 回答 2

2

我认为一个简单而相当干净的方法是让一个变量记录那些 ppm 的“负载”列表,在我的示例中它是变量 STEP2。当然,您可以使用让您从“1 out.ppm”到“LOADS of .ppm”的程序来列出您将获得的 .ppm 文件。

举一个非常简单的例子,其中 out.ppm 将是一个列出要生成的 .ppm 名称的文本文件,您可以编写如下内容:

SOURCE = file.code
STEP1 = out.ppm
STEP2 = $(shell cat $(STEP1))
STEP3 = $(STEP2:%.ppm=%.png)
TARGET = anime.apng

然后,您需要编写一个规则以从文件 $(STEP1) 中获取 STEP2 中列出的所有文件。这是一个文件一个文件完成的,就好像它是一个带有 % 模式的隐式规则,假设你的程序被称为 'extractor' :

$(STEP2): $(STEP1)
    extractor $^ $@

此规则将对 STEP2 中列出的每个文件应用一次。这假定您的程序只需要源文件和输出文件的名称。如果您更喜欢传递输出文件的词干,您仍然可以使用普通的 ol' 隐式规则:

$(STEP2):%.ppm: $(STEP1)
    extractor $^ $*

($(STEP2):一开始是为了防止make使用这个规则生成out.ppm)

然后,在编译方面一切都照常进行,您可以调整编译和链接任何 C 项目的规则。%.ppm -> %.png 步骤就像将 %.c 编译为 %.o :

%.png: %.ppm
    convert $< $@
    optipng $@

最后将所有内容分组(相当于将几个 %.o 链接到一个二进制文件中):

$(TARGET): $(STEP3)
    apngasm $@ $^

我在这里假设 apngasm 可以将所有内容的列表放在一起作为参数à la tar。

希望它足够清晰和有帮助。

于 2013-02-19T12:38:33.123 回答
0

一个临时的解决方法是从一个关闭的问题中获取灵感,并使用 sub-make 调用在子文件夹中渲染图像。就像是:

生成文件

# Manage rendering of images
.PHONY: explode

all: explode anime.apng

out.ppm: file.code
    ./pgm -f $<

explode: out.ppm
    split -d -a 3 --lines=$(N) --additional-suffix=.ppm $< subfolder/frame

ppm2png: explode
    $(MAKE) -C subfolder

# Assemble in one animated png
anime.apng: ppm2png
    apngasm $@ subfolder/frame000.png

临时/生成文件

SOURCES := $(wildcard *.ppm)
OUTPUTS = $(patsub %.ppm,%.png,%(SOURCES))

.PHONY: all
all: $(OUTPUTS)

# Convert to multiple png
%.png: %.ppm
    convert $< $@
    optipng $@

我确信可以做得更好。使用 make 以外的其他工具?

于 2013-02-08T15:37:54.150 回答