Shell 使删除我的目标。为什么?
从: 第二个区别是,如果Shell 使删除我的目标。为什么?,shell,makefile,Shell,Makefile,从: 第二个区别是,如果make确实创建了B,以便 更新其他内容,它会在不再更新B之后删除B 需要。因此,以前不存在的中间文件 make之后也不存在make生成将删除报告给 您可以通过打印显示要删除的文件的rm-f命令来删除 现在,一个makefile,如下所示: $(壳牌rm-rf x D) $(shell mkdir D) $(shell touch D/x) VPATH=D 全部:x; 虚假的 @回显“$@” .中级:D/x .冒牌货 运行: $make D/x rm D/x $ls D
make
确实创建了B,以便
更新其他内容,它会在不再更新B之后删除B
需要。因此,以前不存在的中间文件
make
之后也不存在make
<代码>生成将删除报告给
您可以通过打印显示要删除的文件的rm-f
命令来删除
现在,一个makefile,如下所示:
$(壳牌rm-rf x D)
$(shell mkdir D)
$(shell touch D/x)
VPATH=D
全部:x;
虚假的
@回显“$@”
.中级:D/x
.冒牌货
运行:
$make
D/x
rm D/x
$ls D/x
ls:无法访问D/x:没有这样的文件或目录
现在,鉴于上述引用,Make只删除了一个“以前不存在的中间文件”,我们这里有一个明确的例子,其中:
$(壳牌rm-rf x)
$(shell touch x)
x::
@回显“$@”
.中级:x
运行:
$make
x
$ls x
x
就这么简单!Make未删除以下文件:
make
之前不存在的中间文件在make
之后也不存在
没有别的了
那么,在第一个示例中,Make如何绕过并删除预先存在的文件呢?执行说明
在第一个示例中,D/x
在执行make
之前确实存在,因为您已将phony
指定为先决条件make
必须重新生成D/x
,因为目标phony
不存在。所以make
创建了中间文件D/x
,并根据您的报价创建了它
在不再需要时删除D/x
重新制作all
后。执行make
的路径为
不存在,因此我们必须检查all
x
查找make
,但D/x
不存在phony
remakesmake
现在我们必须重新制作phony
,因为它取决于已更新的D/x
phony
重新生成中间文件make
(我们现在必须在不再需要时将其删除)D/x
现在可以创建make
,最后all
删除中间文件make
D/x
make
确实创建了B
以更新其他内容,则会在不再需要后删除B
这正是您的示例中发生的情况make
创建D/x
,因此它必须在以后不需要时删除D/x
文件解释
我认为您需要对文档的解释稍微小心一点。通过声明“因此”他们是not说make
将not删除已经存在的文件。他们只是说,由于make
更新了一个以前不存在的中间文件,它将在完成后删除它。他们仍然保留一种可能性,即在执行生成
之前存在一个中间文件,该文件必须更新并随后删除
我想我应该再强调一点。引用 因此,在
make
之前不存在的中间文件在make
之后也不存在
这并不意味着make不会删除先前存在的文件。我举的第二个例子就是make不会删除先前存在的文件。其中:1)Make必须重新制作
x
。2) x
在运行Make之前存在。3) 通过运行一些命令来“重建”目标。4) Make没有删除目标,因为它没有创建目标。继续,修改上面的第二个示例,以便x
是某个目标all
的依赖项。同样的结果。