来自docs:
第二个区别是,如果
make
确实创建了B 更新其他内容后,它会在以后删除B. 需要。因此,在之前不存在的中间文件 在make
之后make
也不存在。make
报告删除 通过打印rm -f
命令来显示它正在删除哪个文件。
现在,一个makefile,如下所示:
$(shell rm -rf x D)
$(shell mkdir D)
$(shell touch D/x)
VPATH = D
all: x ;
x:: phony
@echo '$@'
.INTERMEDIATE: D/x
.PHONY: phony
运行:
$ make
D/x
rm D/x
$ ls D/x
ls: cannot access D/x: No such file or directory
现在,鉴于上面的引用,Make只删除了一个"中间文件,它在"之前不存在,我们在这里有一个明确的案例,其中:
仍然,Make认为删除此文件是合适的。这是不要求做的事情。那为什么呢?
将它与以下简单的makefile进行比较:
$(shell rm -rf x)
$(shell touch x)
x ::
@echo '$@'
.INTERMEDIATE: x
运行:
$ make
x
$ ls x
x
简单就是这样! Make没有删除以下文件:
因为,中间文件删除的所有要点是,引用上面的文档:
因此,在
make
之后,make
之前不存在的中间文件也不存在。
别的!
那么,在第一个例子中,如何复制并删除预先存在的文件?
答案 0 :(得分:1)
在执行D/x
之前make
确实存在的第一个示例中,因为您已指定phony
作为先决条件make
必须重新D/x
作为目标{ {1}}不存在。因此phony
创建了中间文件make
并根据您的引用
重拍删除
D/x
不再需要时。
D/x
后。执行路径all
需要
make
不存在,因此我们必须检查all
x
找到make
,但D/x
不存在phony
重新制作make
,现在我们必须重新制作phony
因为它取决于已更新的D/x
phony
重新制作了中间文件make
(我们现在必须删除它时不再需要) D/x
现在可以创建make
,最后all
删除中间文件make
您引用的文档的关键部分是第一句话。
第二个区别是,如果
D/x
创建make
以便更新其他内容,则稍后删除B
在不再需要它之后。
这正是您的示例中发生的情况。 B
创建make
,因此必须在不需要时删除D/x
。
我认为您需要对文档的解释稍加谨慎。通过声明'因此',他们不说D/x
将不删除已存在的文件。他们只是简单地说make
更新了一个以前不存在的中间文件,它会在完成时将其删除。他们仍然留下可能性,执行 make
之前存在中间文件 必须更新> strong>和随后删除。
我想我应该再强调一点。鉴于报价
因此,在
make
之后,make
之前不存在的中间文件也不存在。
这并不意味着make
不会删除之前存在的文件。