2009-07-14 109 views
2

我想使用makefile將一組svgs轉換爲png。以下片段顯示了我迄今爲止所做的工作。Makefile - 構建所有可能的目標

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

make foo.png現在開始工作。但我堅持與所有目標。我想用一個命令來轉換所有的東西(所有的svgs)。

在所有案例中,我發現了所有目標確實是這樣的:

all: ${OBJECTS} 

但我敢肯定有一個簡單的方法對我的情況下,請幫我找到它! :D

回答

5

根據您使用的make的版本,您可以根據所有存在的svgs定義一組目標。例如,在GNU make中:

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

all: $(PNG) 
+0

非常感謝!我剛剛發現這個變體: PNG = $(patsubst origs /%。svg,%。png,$(SVG)) – reto 2009-07-14 17:46:39

0

我不記得make是否可以做到這一點。

你可以添加一個殼foreach語句到所有:

(CD origs;對於* .svg文件;做;轉換$ {}文件;完成)

你需要括號,使該foreach共享相同的環境(shell)。

我有太多的分號;將多行shell命令轉換爲單行命令時,我永遠不會記得它們需要的地方,也不需要它們。

+0

刪除「do」後的分號,你應該沒問題。 – 2009-07-14 17:36:11

0

你在那裏有一個模式規則。它告訴如何製作一個特定類型的目標(以「.png」結尾),而不是任何目標。所以你有什麼可以讓你鍵入一個任意的「make foo.png」,它會知道如何做到這一點。

我會推廣這種方式來創建一個規則,使「所有.png的,你可以從這個目錄」將使用一個變量。放線這樣的事情在你的makefile的頂部:

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

第一行會創建一個包含您在「.SVG」結尾的目錄下所有文件的變量SVGs。第二個創建一個包含相同列表的變量PNG,但是在末尾使用「.png」。

那麼你應該創建一個規則來建立所有SVG的,像這樣:

allsvgs : $(PNGs) 

請注意,我並沒有把它稱爲「所有」。 「全部」目標是一個無意義的標準目標,應該始終意味着「構建我的生成文件支持的每個目標」,在你的情況下,我想你可以將「allsvgs」放在所有目標列表上,但隨着你的makefile增長將需要添加的東西。

相關問題