是否可以使用 make 删除过时的目标

Is it possible to use make to remove obsolete targets

我使用 make 从图像文件创建缩略图,这些缩略图将用于创建网页。

有时我删除了源图像,我希望缩略图被自动删除。显而易见的方法是简单地添加一个规则,在该规则中交换目标和先决条件,但这会导致循环引用和如下消息:

make[2]:循环 image123.jpg <- thumbnails/image123.jpg 依赖项已删除。

有没有办法做到这一点,或者我必须使用单独的 makefile 吗?实际上尝试过,但我似乎也无法做到这一点。我试过这个:

# -*- mode: makefile -*-

images = $(wildcard *.jpg) 
thumbnails = $(wildcard thumbnails/*.jpg) 

.PHONY: all
all : $(images)


# Delete thumbnails if source is not present.
%.jpg: thumbnails/%.jpg
    [ -f "$@" ] || rm "$<"

除了打印一行引用要保留的图像外,它什么也没做。

总结一下:有没有一种方法可以使用 make 来删除如果缺少就不会构建的目标?

首先,让我们设置一个构建缩略图的规则:

images := $(wildcard *.jpg)
TARGETS := $(addprefix thumbnails/, $(images))

.PHONY: all
all : $(TARGETS)

thumbnails/%.jpg: %.jpg
    create the thumbnail somehow

然后添加一些代码来查找过时的缩略图:

thumbnails := $(wildcard thumbnails/*.jpg)
OBSOLETE := $(filter-out $(TARGETS), $(thumbnails))

然后写一个规则来删除它们:

.PHONY: purge
purge:
    rm $(OBSOLETE)

如果没有过时的缩略图,这会造成麻烦,所以让我们将食谱包装在条件中:

purge:
ifneq ($(OBSOLETE),)
    rm $(OBSOLETE)
endif

最后使purge成为all的先决条件:

all : $(TARGETS) purge