【问题标题】:Make "keeps" the old modification-time, although it has changed使“保留”旧的修改时间,尽管它已经改变
【发布时间】:2015-08-20 03:59:00
【问题描述】:

给定一个 makefile:

# Create the following sequence of files, in the following order: 1)'old' then 2)'all', finally 3)'new'.
$(shell touch 'old')
$(shell sleep 1)
$(shell touch 'all')
$(shell sleep 1)
$(shell touch 'new')

all: new
    echo '$@'

# Let the modification-time of 'new', to be like 'old' ("older" than 'all').
new :  phony
    cp -p old new

.PHONY : phony

.INTERMEDIATE: new


运行,我们得到:

$ make -Wnew
cp -p old new
echo 'all'
all
rm new

现在,虽然 all 早于文件 new 解析构建之前,在 Make 完成构建 new 文件后,事情发生了变化,配方 cp -p old new,基本上将 old 的修改时间复制到 new,因此:all现在 em> 比文件new“更新”。

那么,为什么要构建最新的文件all,因为它贯穿了它的依赖项——他们各自的构建——我们发现@ 987654332@ modify-time 在其依赖项“new”之后。

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    -Wnew效果说明

    -Wnew 选项告诉make 假设new 已被修改,并且我们必须更新目标其中它是 先决条件不管文件new在我们的makefile make 必须更新所有的目标 new是一个先决条件

    我已经使用您的示例提供了一个解释和演示,make 不保留 旧的修改时间,而是效果 的 -Wnew 选项 导致make 重建all,如下。


    -Wnew 的执行过程

    所以在执行make -Wnewmake首先读取你的makefile并看到

    all: new
        echo '$@'
    

    所以它知道无论new 以后会发生什么,它都必须更新目标all,因为我们已经指定了-Wnew 选项。

    make 然后继续执行您的 shell 命令并创建文件oldallnew。它现在遍历您的目标和先决条件,指出 phony 不存在,因此我们必须重新制作它。在创建phony 之后,我们将new 作为它的目标phony 比它更新。这实际上将new 的修改时间修改为早于all。但是,我们指定了-Wnew,因此无论new 发生了什么,我们都告诉make,我们希望它重建以new 作为先决条件的目标,例如all。这就是为什么make 然后继续构建all


    make 不保留旧修改时间的证明

    如果我们使用make 执行您的示例,(注意 没有-Wnew 选项),输出将是

    $ make
    cp -p old new
    

    啊哈! make 没有更新 all。它意识到通过重新制作newnew 的修改时间发生了变化,现在它比all 更旧,因此all 是最新的,我们可以完成。

    【讨论】:

      猜你喜欢
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 2019-12-29
      • 2017-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多