Makefile 使用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

假设我有一个带有自动规则的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 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))