Linux make命令正在删除源文件
我继承了一个项目文件,其中包含一个Makefile,它正在做我以前从未见过的事情——它正在注入一个rm命令。我找不到使用rm命令的任何原因,因此我遗漏了一些非常明显或非常深奥的内容 谢谢 运行make的结果如下:Linux make命令正在删除源文件,linux,makefile,rm,Linux,Makefile,Rm,我继承了一个项目文件,其中包含一个Makefile,它正在做我以前从未见过的事情——它正在注入一个rm命令。我找不到使用rm命令的任何原因,因此我遗漏了一些非常明显或非常深奥的内容 谢谢 运行make的结果如下: bison --defines --xml --graph=calc.gv -o calc.c calc.y Bison flags = cc -c -o calc.o calc.c Making BASE = calc cc -o calc calc.o Done ma
bison --defines --xml --graph=calc.gv -o calc.c calc.y
Bison flags =
cc -c -o calc.o calc.c
Making BASE = calc
cc -o calc calc.o
Done making BASE
rm calc.c <======== WHERE IS THIS COMING FROM?
bison--defines--xml--graph=calc.gv-o calc.c calc.y
野牛旗=
cc-c-o计算
制造基准=计算
cc-o计算
完成制作基地
rm calc.c见:
第二个区别是,如果make确实创建了b
以更新其他内容,那么它会在不再需要b
之后删除它。因此,在make之前不存在的中间文件在make之后也不存在make
通过打印显示要删除的文件的rm-f
命令向您报告删除
正如Maxim在他的回答中所解释的,这是正常行为,calc.c
是一个中间目标,您没有明确要求。我只想补充一点,如果你想保留这个目标,你可以通过将它作为特殊目标.precious
的先决条件来声明它是珍贵的。只需在Makefile中的某个位置添加行.preciouse:calc.c
。保留中间文件不是一个好主意,因为这样会阻止make在calc.y更改时重建它。您不应该使用.preciouse
.PRECIOUS
具有潜在的危险性,只能在特定情况下使用,并应仔细考虑。无论如何,您不需要这样做,只需将文件列为目标或先决条件即可。如果你真的没有其他需要,那么简单的添加一个虚拟规则,比如<代码>,使SRC:$(Base)。C/<代码>将执行它。为什么是代码>。由于您已声明文件.PRECIOUS
,make将不会为您清理该文件,并且您将拥有一个修改时间较新的半写文件,因此重新运行make将不会重建该文件。这可能会导致明显的失败,但也可能会导致微妙的失败.PRECIOUS
仅用于即使构建中断也要保留输出的情况。这真的与中间文件无关。谢谢大家的回复。尽管我搜索了“rm”,但在有关中间文件的文档中,我还是遗漏了该参考。
BASE = calc
BISON = bison
XSLTPROC = xsltproc
all: $(BASE)
%.c %.h %.xml %.gv: %.y
$(BISON) $(BISONFLAGS) --defines --xml --graph=$*.gv -o $*.c $<
@echo "Bison flags = " $(BISONFLAGS)
$(BASE): $(BASE).o
@echo "Making BASE = " $(BASE)
$(CC) $(CFLAGS) -o $@ $^
@echo "Done making BASE"
run: $(BASE)
@echo "Type arithmetic expressions. Quit with ctrl-d."
./$<
html: $(BASE).html
%.html: %.xml
$(XSLTPROC) $(XSLTPROCFLAGS) -o $@ $$($(BISON) --print-datadir)/xslt/xml2xhtml.xsl $<
CLEANFILES = $(BASE) *.o $(BASE).[ch] $(BASE).output $(BASE).xml $(BASE).html $(BASE).gv
clean:
@echo "Running clean" $(CLEANFILES)
rm -f $(CLEANFILES)