【发布时间】:2021-03-13 13:39:27
【问题描述】:
我继承了一个项目文件,其中包含一个 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 making BASE
rm calc.c <======== WHERE IS THIS COMING FROM?
Makefile 是:
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)
【问题讨论】:
-
正如 Maxim 在他的回答中解释的那样,这是正常行为,
calc.c是您没有明确要求的中间目标。我只是补充一点,如果你想保留这个目标,你可以通过将它添加为特殊目标.PRECIOUS的先决条件来声明它是珍贵的。只需在 Makefile 中的某处添加行.PRECIOUS: calc.c。 -
保留中间文件不是一个好主意,因为这会阻止 make 在 calc.y 更改时重建它。
-
你不应该使用
.PRECIOUS。.PRECIOUS具有潜在危险,应仅在特定情况下使用并谨慎考虑。无论如何您都不需要这样做,您只需将文件列为目标或先决条件ANYWHERE。如果你真的没有其他需要,那么添加一个像make-src: $(BASE).c这样的简单规则就可以了。 -
为什么
.PRECIOUS不好:考虑bison是否正在编写calc.c并且您使用^C。因为你已经声明了文件.PRECIOUS,make 不会为你清理它,你会得到一个半写的文件,它的修改时间较新,所以重新运行 make 不会重建它。也许这会导致明显的失败,但也许会导致微妙的失败。.PRECIOUS仅用于即使构建中断也希望保留输出的情况。真的跟中间文件没关系。 -
感谢大家的回复。即使我搜索了“rm”,我也错过了有关中间文件的文档中的引用。