Makefile 是否可以使用make删除过时的目标
我使用make从图像文件创建缩略图,这些图像文件将反过来用于创建网页 有时我删除一个源图像,我想缩略图被自动删除。显而易见的方法是简单地添加一个规则,其中交换了目标和先决条件,但这会导致循环引用和如下消息:Makefile 是否可以使用make删除过时的目标,makefile,obsolete,Makefile,Obsolete,我使用make从图像文件创建缩略图,这些图像文件将反过来用于创建网页 有时我删除一个源图像,我想缩略图被自动删除。显而易见的方法是简单地添加一个规则,其中交换了目标和先决条件,但这会导致循环引用和如下消息: make[2]:Circular image123.jpg首先,让我们设置一个规则来构建缩略图: images := $(wildcard *.jpg) TARGETS := $(addprefix thumbnails/, $(images)) .PHONY: all all : $(T
make[2]:Circular image123.jpg首先,让我们设置一个规则来构建缩略图:
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))
然后添加一些代码以查找过时的缩略图:
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
谢谢,这很好用,但我有一个问题:使用:=代替=有什么区别吗?我试过有结肠和没有结肠的情况下,没有发现行为上的任何区别。默认情况下应该使用哪一个?请阅读此处的区别:简而言之,在这种特定情况下,行为是相同的,但是
=
版本做的工作更多。然而,在这样一个小例子中,差异是无法测量的。