【问题标题】:GNU make implicit rules for batch file processingGNU 为批处理文件处理制定隐含规则
【发布时间】:2013-02-01 19:24:58
【问题描述】:

我想使用 GNU make 来自动处理批处理文件,在我的特殊情况下,我有大量图像文件,我想将色彩空间转换并重新编码为自定义文件格式。文件格式编码器只接受命令行上的文件名,即不接受 stdio 重定向。

我的文件和目录结构是

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

我用模式规则编写了一个 peliminary Makefile

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

但现在我被卡住了,因为我不知道如何 make 将sourceimages 中的所有文件作为destimages 中隐式目标的先决条件。那么我该怎么做呢?

我真的很想为此使用 make,以利用其并行执行的能力。

【问题讨论】:

    标签: makefile rules implicit


    【解决方案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
    

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

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

    【讨论】:

    • 好吧,不幸的是,miecoder 期望输入图像是 tiff 并且文件名后缀为 .tif,这就是 mktemp 的原因;但一些静态中缀也可以,虽然我更喜欢这是一些独特的字符串。
    • 容易修复;我已将答案编辑为使用foo_temp.tif 而不是foo.tmp。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 2020-10-07
    相关资源
    最近更新 更多