GNU为批处理文件处理制定隐式规则

时间:2013-02-01 19:24:58

标签: makefile rules implicit

我想使用 GNU make 来自动执行批处理文件处理,在我的特定情况下,我有大量的图像文件,我喜欢颜色空间转换和重新编码它们是自定义文件格式。文件格式编码器仅接受命令行上的文件名,即没有stdio重定向。

我的文件和目录结构是

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

我用模式规则

写了一个带有伪造的Makefile
%.mie : %.tif
    tmpraw := $(shell mktemp --suffix=raw)
    convert $< -colorspace YUV -resize …x… rgb:$(tmpraw)
    miecoder $(tmpraw) $@
    rm $(tmpraw)

但是现在我被卡住了,因为我无法弄明白如何让 make sourceimages中的所有文件作为destimages中隐含目标的先决条件{1}}。那我怎么能这样做呢?

我真的很想使用 make 来利用它的并行执行能力。

1 个答案:

答案 0 :(得分:1)

首先,您使用mktemp创建唯一的临时文件名是不必要的,并导致其他问题;如果您要将foo.tif转换为foo.mie,那么我们只需调用临时文件foo_temp.tif即可。

%.mie : %.tif
    convert $< -colorspace YUV -resize …x… rgb:$*_temp.tif
    miecoder $*_temp.tif $@
    rm $*_temp.tif

接下来,我们放入路径,以便Make可以使用另一个先决条件在一个地方构建目标:

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

最后,我们查找源,推断出所需目标的列表,然后将它们作为默认taget的先决条件(将所有这些放在makefile中的destimages/%.mie:...规则之上):

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

.PHONY: all
all: $(TARGETS)
相关问题