【问题标题】:Make deletes my target. Why?Make 删除我的目标。为什么?
【发布时间】:2015-08-18 06:15:11
【问题描述】:

来自docs

第二个区别是,如果make 确实创建了 B 以 更新其他东西,它不再是 B 之后它稍后会删除 需要。因此,之前不存在的中间文件 makemake 之后也不存在。 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. 使没有创建目标。

不过,Make 觉得删除这个文件是合适的。它没有要求做的事情。那为什么会这样呢?

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

$(shell rm -rf x)
$(shell touch x)

x ::
    @echo '$@'

.INTERMEDIATE: x

跑步:

$ make
x

$ ls x
x

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

  1. 它没有创建!
  2. 在运行 Make 之前已存在

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

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

没有别的!

那么,在第一个示例中,Make 是如何绕过并删除预先存在的文件的?

【问题讨论】:

    标签: shell makefile


    【解决方案1】:

    执行说明

    在您的第一个示例中,虽然D/x 在执行make 之前确实存在,因为您已将phony 指定为先决条件make 必须重新制作D/x,因为目标phony 不存在。所以make 创建了 intermediate 文件D/x 并根据你的报价

    删除 D/x 不再需要时。

    在重制all 之后。 make 的执行路径是

    • all不存在,所以我们必须检查x
    • make 找到 D/xphony 不存在
    • make 重制 phony,现在我们必须重制 D/x,因为它依赖于已更新的 phony
    • make 重新制作了 intermediate 文件 D/x (我们现在必须在不再需要它时将其删除)
    • make 现在可以创建all,最后
    • make 删除 intermediate 文件 D/x

    与文档的关系

    您引用的文档的关键部分是第一句话。

    第二个区别是,如果make 确实创建 B 以更新其他内容,它会在它不再存在之后删除 B需要。

    这正是您的示例中发生的情况。 make 创建了D/x,因此它必须稍后在不需要时删除D/x

    文档解释说明

    我认为您需要小心您对文档的解释。通过声明'因此',他们不会make不会删除已经存在的文件。他们只是说make 更新一个以前不存在的中间文件的结果,它将在完成后将其删除。他们仍然留下可能中间文件之前存在make被执行,它必须更新随后删除


    我想我应该多强调一点。鉴于报价

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

    这并不意味着make 不会删除之前存在的文件。

    【讨论】:

    • Make 不会删除预先存在的文件的证据就是我的第二个例子。其中:1) 必须重新制作 x。 2) x 在运行 Make 之前已经存在。 3)通过运行一些命令来“重新构建”目标。 4) Make 没有没有删除目标,因为它没有创建它,开始。
    • 继续,修改上面的第二个示例,使x 是某个目标all 的依赖项。结果相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    相关资源
    最近更新 更多