是否可以使用 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
我使用 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