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 の「LOADS」のリストを記録させることだと思います。私の例では変数 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 でリストされたファイルごとに 1 回適用されます。これは、プログラムがソース ファイルと出力ファイルの名前のみを必要とすることを前提としています。出力ファイルの語幹を渡したい場合でも、昔ながらの暗黙のルールを使用できます。

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

(先頭の $(STEP2): は、make がこのルールを使用して out.ppm を生成しないようにするためのものです)

その後、コンパイルに関してはすべてが通常どおりになり、C プロジェクトのコンパイルとリンクのルールを適応させることができます。%.ppm -> %.png のステップは、 %.c を %.o にコンパイルするようなものです:

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

最後にすべてをグループ化するには (複数の %.o を 1 つのバイナリにリンクするのと同じ):

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

ここでは、 apngasm がすべてのリストをtarの引数としてまとめて取得できると想定しています。

それが明確で十分に役立つことを願っています。

于 2013-02-19T12:38:33.123 に答える
0

一時的な回避策は、近い質問からインスピレーションを得て、サブメイク呼び出しを使用してサブフォルダーに画像をレンダリングすることです。何かのようなもの:

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 $< subfolder/frame

ppm2png: explode
    $(MAKE) -C subfolder

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

temp / Makefile

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

.PHONY: all
all: $(OUTPUTS)

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

私はもっ​​とうまくやれると確信しています。作る以外のツールで?

于 2013-02-08T15:37:54.150 に答える