2009-07-14 11 views
2

私はmakefileを使ってsvgのセットをpngに変換したいと思っています。次のスニペットは、私がこれまで行ってきたことを示しています。Makefile - すべての可能なターゲットを構築する

%.png: origs/%.svg 
    convert -resize "32x" $< [email protected] 

make foo.pngが今すぐ動作します。しかし、私はすべてターゲットで立ち往生しています。私はすべてのもの(すべてのsvgs)を1つのコマンドで変換したいと思います。私はすべてターゲットを発見したすべての例では

はこのような何かを行います。

all: ${OBJECTS} 

しかし、私は簡単な方法は、私の場合のためにあります確信している、私はそれを見つける助けてください! :D

答えて

5

使用しているmakeのバージョンによっては、存在するすべてのsvgに基づいてターゲットのセットを定義できます。たとえば、GNU makeの場合:

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

all: $(PNG) 
+0

よろしくお願いします!このバリエーションを見つけました: PNG = $(patsubst origs /%。svg、%。png、$(SVG)) – reto

0

私はmakeがそれを行うことができるかどうか覚えていません。

あなたのすべてにシェルforeach文を追加することができます。

(CDのorigs; *の.SVG内のファイルのために、やる; $ {file}を変換する; done)を

あなたが作るために括弧を必要としますforeachは同じ環境(シェル)を共有します。

セミコロンが多すぎます。複数行のシェルコマンドを1つのライナーにするときに、必要な場所と必要がない場所は決して覚えていません。

+0

"do"の後にセミコロンを削除しても問題ありません。 –

0

あなたが持っているものはパターンルールです。それは、特にターゲットではなく、証明書の種類( ".png"で終わるもの)を作る方法を教えてくれます。だからあなたが持っているものは、あなたが任意の "make foo.png"をタイプすることができるもので、それを行う方法を知っているでしょう。

「このディレクトリからすべての.pngを作ることができます」というルールを作成するためにこれを一般化する方法は、変数を使用します。あなたのメイクファイルの上部に次のような行の何かを置く:

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

最初の行は「.SVG」で終わるディレクトリ内のすべてのファイルが含まれている変数SVGsを作成します。 2番目の変数は、同じリストを含む変数PNGを作成しますが、代わりに末尾に ".png"を付けます。

次に、あなたがそうのように、すべてのSVGのを構築するために、ルールを作成する必要があります。私は、「すべてを」それを呼び出すことはありませんでした

allsvgs : $(PNGs) 

注意。 "すべての"ターゲットは、 "make all files to make"を常に意味するはずの不公平な標準ターゲットです。あなたのケースでは、すべてのターゲットリストに "allsvgs"を置くことができると思いますが、makefileが成長するそれにものを追加する必要があります。