Makefile文件的重建过程

最近在理解Makefile自动推导依赖关系时,总感觉理解不动。原因是对Makefile的重建过程不清楚。所以学习一下。

感谢《GNU make中文手册》。


下面时书中makefile文件重建的原文:

Makefile 可由其它文件生成,例如 RCS 或 SCCS 文件。如果 Makefile 由其它文
件重建,那么在 make 在开始解析这个 Makefile 时需要重新读取更新后的 Makefile、
而不是之前的 Makefile。make 的处理过程是这样的:
make 在读入所有 makefile 文件之后,首先将所读取的每个 makefile 作为一个目
标,寻找更新它们的规则。如果存在一个更新某一个 makefile 文件明确规则或者隐含
规则,就去更新对应的 makefile 文件。完成对所有的 makefile 文件的更新之后,如果
之前所读取任何一个 makefile 文件被更新,那么 make 就清除本次执行的状态重新读
取一遍所有的 makefile 文件(此过程中,同样在读取完成以后也会去试图更新所有的
已经读取的 makefile 文件,但是一般这些文件不会再次被重建,因为它们在时间戳上
已经是最新的)。读取完成以后再开始解析已经读取的 makefile 文件并开始执行必要
的动作。


我自己的理解就是,makefile会读取所有被include的文件,然后为每一个被include进来的文件找一个生成规则,即使这些文件已经存在了。

如果找到了生成规则,并且这些被include进来的文件比依赖的文件要旧,那么就会重新重新生成这个被include进来的文件,然后重新读取整个makefile。


所以,做下面一个小实验:

实验器材:

4个文件:a.mk  b.mk  depend  Makefile

其中前三个文件都是空的,并且depend文件要在a.mk  b.mk建立之后再建立。也就是让depend文件比a.mk  b.mk新。

Makefile文件内容如下:

a.mk:depend
	echo "name=chen" > a.mk
b.mk:depend
	echo "city=henan" > b.mk
include a.mk b.mk
.PHONY:show
show:
	echo $(city)
	echo $(name)
然后,执行make show
root@chen-pc:/home/workspace/Makefile/mf4# make show
echo "city=henan" > b.mk
echo "name=chen" > a.mk
echo henan
henan
echo chen
chen
分析:

此时,打开a.mk和b.mk

a.mk

name=chen

b.mk

city=henan

所以,流程应该时这样的:

Makefile读取到include a.mk b.mk的时候,在目录内都寻这两个文件,然后,把文件的内容替换在Makefile的include的位置(这里a.mk  b.mk最初是空文件),然后,Makefile把所有文件都include进来之后,为每个include的文件寻找生成规则,而我们显式的为a.mk和b.mk定义了生成规则,并且depend文件比这两个新。所以,会执行a.mk和b.mk的生成规则。在这个例子中就是把两个变量以及变量的值写到a.mk  b.mk中。

当所有被include进来的文件都被重新生成之后(当然,如果依赖的文件比较旧,那么这个被include进来的文件不会重新生成)。make命令清楚本次的读取状态,重新读取这个Makefile,再次读取到include a.mk b.mk,然后把a.mk  b.mk中的内容替换到include的位置,把所有的文件都include进来之后,又为这些被include进来的文件寻找生成规则(例子中就是为a.mk  b.mk寻找生生成规则),然后再次找到了生成了生成规则。然后他们依赖的depend文件比较旧(因为第一次读取makefile的时候,对a.mk  b.mk进行了写操作),所以 a.mk  b.mk不会重新生成。由于这次所有被include进来的文件都没有重新生成,所以,make完成了对makefile的解析。

然后,执行make show,打印除了变量的值。


才接触makefile,如果有写错的地方,恳请路过的大神指教。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章