makefile中一个依赖项的一个目标

makefile中一个依赖项的一个目标,makefile,dependencies,target,Makefile,Dependencies,Target,我正在尝试使用make通过键入“makeall”生成照片的缩略图。如果缩略图尚未生成,则“全部生成”,否则“全部生成”仅生成修改照片的缩略图。为此,我需要一个目标(缩略图)为每个依赖(照片)。我的代码如下: input = pictures/*.jpg output = $(subst pictures,thumbs,$(wildcard $(input))) all : $(output) echo "Thumbnails generated !" $(output) : $(inp

我正在尝试使用make通过键入“makeall”生成照片的缩略图。如果缩略图尚未生成,则“全部生成”,否则“全部生成”仅生成修改照片的缩略图。为此,我需要一个目标(缩略图)为每个依赖(照片)。我的代码如下:

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

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

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

您的问题是这一行

$(output) : $(input)
output
变量是每个输出文件的列表

输入
变量是通配符模式

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

解决这个问题的办法是要么像这样使用

$(output) : thumbs/% : pictures/%
这表示要在
$(输出)
中构建所有文件,方法是将它们与模式
拇指/%
匹配,并在必备模式(
图片/%
)中使用与
%
匹配的部分(称为

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

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
目标/先决条件对