尽管已经改变

时间:2015-08-20 03:59:00

标签: makefile gnu-make

给出一个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

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

然后,为什么要构建最新的文件all,通过其依赖项运行 - 各自的构建后 - 我们发现new修改时间“依赖于”依赖“新”的那个。

1 个答案:

答案 0 :(得分:0)

-Wnew

的效果说明

-Wnew选项告诉make假设new已被修改,我们必须更新目标 先决条件无论我们的new makefile 中的文件make发生的事情必须更新所有目标 new是。

先决条件

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

使用-Wnew

执行的过程

因此,在执行make -Wnew make时,请先阅读makefile并查看

all: new
    echo '$@'

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

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

的原因

证明all不会保留旧的修改时间

如果我们使用make注意make选项)执行您的示例,则输出将为

-Wnew

啊哈! $ make cp -p old new 没有更新make。它意识到通过重新构建all new的修改时间已更改,现在已超过new,因此all是最新的,我们可以完成。

相关问题