我想使用 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 来利用它的并行执行能力。
答案 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)