2013-02-01 47 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