Makefile 使用make清除过时的输出
假设我有一个带有自动规则的make文件,如:Makefile 使用make清除过时的输出,makefile,Makefile,假设我有一个带有自动规则的make文件,如: %.o: %.c gcc -c $(CFLAGS) $< -o $@ 运行make将生成a.o。现在,如果我将a.c重命名为b.c,并再次运行make,它将生成b.o。当我删除a.c.而不删除所有其他.o文件时,是否有办法删除a.o 例如,是否有某种方法可以提供一个模式(*.o,它匹配a.o和b.o)并从中删除所有生成/跳过的文件(b.o)以获得a.o?类似的东西应该可以工作(未测试!) 我会通过运行make-n clean orphan
%.o: %.c
gcc -c $(CFLAGS) $< -o $@
运行make
将生成a.o
。现在,如果我将a.c
重命名为b.c
,并再次运行make,它将生成b.o
。当我删除a.c.而不删除所有其他.o文件时,是否有办法删除a.o
例如,是否有某种方法可以提供一个模式(
*.o
,它匹配a.o
和b.o
)并从中删除所有生成/跳过的文件(b.o
)以获得a.o
?类似的东西应该可以工作(未测试!)
我会通过运行make-n clean orphaned
或将rm
更改为echo
并仔细检查哪些对象将被删除来测试它
就我个人而言,我不会为此而烦恼,只需删除
*.o
并重新构建。您不太可能经常重命名文件,以至于重建所有文件都是一个严重的问题。您需要提供一个示例,说明您想要完成的任务,您所说的“额外输出”是什么意思?为什么要删除源文件?还有,为什么您要使用$*
而不是$@
,$单词很难。。。“过时”呢?基本上是以前生成的输出,但由于源文件已不存在,因此将不再生成输出。+1表示“我个人不想为此烦恼”,我不确定清理碎屑是否应该是makefile的责任,这可能会导致删除您想要保留的内容。另外,rm
=>$(rm)
?@user657267我确实考虑过使用$(rm)
,但是那样就可以了rm-f
,我故意不这样做,因为(1)规则应该只尝试删除我们知道确实存在的文件,所以没有丢失文件的错误,以及(2)正如你所说的,整个想法似乎有风险,可能会删除你想要保留的东西,而-f
可能会使这种情况更加可能发生!没错,我提出它的唯一原因是我经常需要编写在windows上工作的makefiles。
int main() {}
ALL_OBJS := $(wildcard *.o)
WANTED_OBJS := $(addsuffix .o,$(basename $(wildcard *.c)))
.PHONY: clean-orphaned
clean-orphaned:
@rm $(filter-out $(WANTED_OBJS),$(ALL_OBJS))