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只删除了一个“以前不存在的中间文件”,我们这里有一个明确的例子,其中:

  • 在运行Make之前,目标确实存在
  • Make未创建目标
  • 尽管如此,Make仍然认为删除此文件是合适的。一件它被要求做的事。那么为什么会这样呢

    将其与以下简单makefile进行比较:

    $(壳牌rm-rf x)
    $(shell touch x)
    x::
    @回显“$@”
    .中级:x
    
    运行:

    $make
    x
    $ls x
    x
    
    就这么简单!Make未删除以下文件:

  • 它没有创造
  • 在运行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
      不存在
    • make
      remakes
      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
    的依赖项。同样的结果。