【问题标题】:Linux make command is deleting a source fileLinux make 命令正在删除源文件
【发布时间】: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”,我也错过了有关中间文件的文档中的引用。

标签: linux makefile rm


【解决方案1】:

https://www.gnu.org/software/make/manual/make.html#Chained-Rules:

第二个区别是,如果 make 确实创建 b 以更新其他内容,它会在不再需要 b 后删除它。因此,在 make 之前不存在的中间文件在 make 之后也不存在。 make 通过打印 rm -f 命令向您报告删除情况,显示正在删除的文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 2015-09-06
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    相关资源
    最近更新 更多