【问题标题】:one target for one dependency in makefilemakefile 中一个依赖项的一个目标
【发布时间】:2015-02-24 22:43:01
【问题描述】:

我正在尝试使用 make 通过键入“make all”来生成照片的缩略图。如果缩略图尚未生成,则 make all 生成它们,否则 make all 仅生成修改照片的缩略图。为此,我需要为每个依赖项(照片)设置一个目标(缩略图)。我的代码是这样的:

input = pictures/*.jpg
output = $(subst pictures,thumbs,$(wildcard $(input)))
all : $(output)
    echo "Thumbnails generated !"

$(output) : $(input)
    echo "Converting ..."
    convert -thumbnail 100 $(subst thumbs,pictures,$@) $@

如何修改它以获得所需的结果?

【问题讨论】:

    标签: makefile dependencies target


    【解决方案1】:

    你的问题是这一行

    $(output) : $(input)
    

    output 变量是每个输出文件的列表。

    input 变量是通配符模式。

    这将每个输出目标的先决条件设置为通配符模式,这意味着如果任何文件更改每个输出文件将被视为需要要重建。

    解决此问题的方法是使用 static pattern rule 像这样

    $(output) : thumbs/% : pictures/%
    

    它说通过将它们与模式thumbs/% 匹配并在先决条件模式(pictures/%) 中使用与% 匹配的部分(称为stem)来构建$(output) 中的所有文件。

    或者,您可以为每个文件构建一组特定的输入/输出匹配,例如

    infiles = $(wildcard pictures/*.jpg)
    $(foreach file,$(infiles),$(eval $(subst pictures/,thumbs/,$(file)): $(file)))
    
    $(output):
        echo "Converting ..."
        convert -thumbnail 100 $(subst thumbs,pictures,$@) $@
    

    它使用eval 函数为每个输入文件创建明确的thumbs/file.jpg: pictures/file.jpg 目标/先决条件对。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      相关资源
      最近更新 更多