删除我的目标。为什么?

时间:2015-08-18 06:15:11

标签: shell makefile

来自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只删除了一个"中间文件,它在"之前不存在,我们在这里有一个明确的案例,其中:

  1. 目标确实存在,然后再运行Make。
  2. 没有创建目标。
  3. 仍然,Make认为删除此文件是合适的。这是要求做的事情。那为什么呢?

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

    $(shell rm -rf x)
    $(shell touch x)
    
    x ::
        @echo '$@'
    
    .INTERMEDIATE: x
    

    运行:

    $ make
    x
    
    $ ls x
    x
    

    简单就是这样! Make没有删除以下文件:

    1. 它没有创造!
    2. 在运行Make
    3. 之前存在

      因为,中间文件删除的所有要点是,引用上面的文档:

        

      因此,在make之后,make之前不存在的中间文件也不存在。

      别的!

      那么,在第一个例子中,如何复制并删除预先存在的文件?

1 个答案:

答案 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不会删除之前存在的文件。