在学习linux 0.11内核时,对它的makefile中产生各文件的依存关系的那部分很是不理解,直到最近看了《Managing Projects with GNU Make》后才明白了。简单的记录一下。
下面是原文件中的那部分:
首先说一下这样做到必要性:当我们的项目文件比较小时,自己手动的添加文件的依存关系还是可以的,但是在实际的项目中,这是不可完成的事,因为大多数的头文件还会包括其他头文件所形成的复杂树状结构,如头文件stdio.h会包含如下文件:
所以,我们需要自动产生依存关系,而gcc 的-M选项可以产生文件的依存关系,传统上,有两种方法可用来将自动产生的依存关系纳入makefile中。
第一种是最古老的方法,就是在makefile的结尾加入下面一行:
# Automatically generated dependencies follow - Do Not Edit(why?不太明白,类似与linux 0.11 makefile中的 ### Dependencies:)
然后编写一个脚本以便加入这些自动产生的脚本。
第二种方法是为make加入一个include指令即编写一个makefile工作目标,此工作目标的动作是以—M选项对所有的源文件执行gcc,并将结果存入一个依存文件中,然后重新执行make以便把刚才所产生的依存文件引入makefile。如
要注意的是在运行make之前,应首先执行make depend以产生依存关系。
Linux 0.11 的makefile采用的是第一种方法。用sed 找到 ### Dependencies 这一行退出,然后对init目录下的所有c文件执行gcc - M 来产生依存关系,上面的所有输出都重定向到tmp_make中,最后用tmp_make来替代原来的makefile。
但是,当对源文件加入或移除依存关系时,通常不会重新产生depend文件,这会出错。在GNU make中,有一个很酷的功能及一个算法来解决此问题。
使用gcc 的-M 选项产生依赖。
sed : $* 匹配主文件名,后面跟着扩展名.o,工作目标的文件名之后跟着零个或多个空格或冒号[ :]*,这部分被替换为最初的工作目标加上扩展名再加上依赖文件的工作目标$@。