2013-02-01 51 views
1

我想使用GNU make來自動化批處理文件處理,在我的具體情況下,我有大量的圖像文件,我想要色空間轉換和重新編碼它們以自定義文件格式。文件格式編碼器只接受命令行上的文件名,即沒有stdio重定向。GNU使批處理文件處理的隱式規則

我的文件和目錄結構是

./sourceimages/*.tif 
./destimages/*.mie 
./Makefile 

我寫了一個Makefile文件peliminary用圖案規則

%.mie : %.tif 
    tmpraw := $(shell mktemp --suffix=raw) 
    convert $< -colorspace YUV -resize …x… rgb:$(tmpraw) 
    miecoder $(tmpraw) [email protected] 
    rm $(tmpraw) 

但現在我卡住了,因爲我無法弄清楚如何使使sourceimages中的所有文件作爲destimages中隱式目標的先決條件。那我該怎麼做?

我真的想用來製作,以利用它的並行執行能力。

回答

1

首先,您使用mktemp來創建一個唯一的臨時文件名是不必要的,並導致其他問題;如果您要將foo.tif轉換爲foo.mie,我們只需要調用臨時文件foo_temp.tif即可。

%.mie : %.tif 
    convert $< -colorspace YUV -resize …x… rgb:$*_temp.tif 
    miecoder $*_temp.tif [email protected] 
    rm $*_temp.tif 

接下來,我們把該路徑,以便使可以在一個地方使用的先決條件從另一個構建一個目標:

destimages/%.mie : sourceimages/%.tif 
    convert $< -colorspace YUV -resize …x… rgb:$*_temp.tif 
    miecoder $*_temp.tif [email protected] 
    rm $*_temp.tif 

最後我們尋找來源,推斷期望目標的列表,然後讓他們默認taget(把所有這一切都在生成文件destimages/%.mie:...規則以上)的先決條件:

SOURCES := $(wildcard sourceimages/%.tif) 
TARGETS = $(patsubst sourceimages/%.tif, destimages/%.mie, $(SOURCES)) 

.PHONY: all 
all: $(TARGETS) 
+0

很不幸miecoder預計將輸入圖像是一個TIFF和文件名是SUFF ixed .tif,這就是爲什麼mktemp;但一些靜態中綴也可以,但我更喜歡這是一些獨特的字符串。 – datenwolf

+0

輕鬆修復;我已經編輯了使用'foo_temp.tif'而不是'foo.tmp'的答案。 – Beta