Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux make命令正在删除源文件_Linux_Makefile_Rm - Fatal编程技术网

Linux 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

我继承了一个项目文件,其中包含一个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?
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)