给出一个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
修改时间“依赖于”依赖“新”的那个。
答案 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命令并创建文件old
,all
和new
。它现在遍历您的目标和先决条件,注意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
是最新的,我们可以完成。