make 自动产生依存关系
2012-12-18 17:07
155 查看
在学习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,工作目标的文件名之后跟着零个或多个空格或冒号[ :]*,这部分被替换为最初的工作目标加上扩展名再加上依赖文件的工作目标$@。
下面是原文件中的那部分:
首先说一下这样做到必要性:当我们的项目文件比较小时,自己手动的添加文件的依存关系还是可以的,但是在实际的项目中,这是不可完成的事,因为大多数的头文件还会包括其他头文件所形成的复杂树状结构,如头文件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,工作目标的文件名之后跟着零个或多个空格或冒号[ :]*,这部分被替换为最初的工作目标加上扩展名再加上依赖文件的工作目标$@。
相关文章推荐
- 自动产生依存关系
- make文件自动生成依赖关系
- 一般都是使用qmake自动解析必要头文件依存关系
- make文件自动生成依赖关系
- 某处看到的SO与WIP的关系(仅限于从标准SO自动产生任务单)
- GNU Make 自动生成依存(依赖)关系的完善解决方案
- [编译环境][make]自动生成依赖关系
- JAVA Struts2 考试功能 —— 自动产生随机试题
- Effective C++读书笔记---将文件间的编译依存关系降至最低
- U盘的热拔插/自动挂载跟linux2.6 kernel、 udev、 hal、 dbus 、gnome-mount 、thunar的关系
- 超级简单:使用Visual Studio自动产生存储过程
- Shader代码自动优化产生的问题
- makefile自动生成目标与依赖的关系
- 编译器产生的输出文件的MD5值与生成代码的关系
- Sql 自动产生编号
- 自动生成 Makefile 的全过程详解! automake/autoconf 入门
- 使用autotools自动生成Makefile并在此之上使用dh-make生成可发布的deb程序包(详解)
- 使用EA(Enterprise Architect)自动生成SQLServer数据库所有表的schema设计和关系图(类图)-反向工程
- 如何自动产生转储单LT06
- struts和spring的plugin产生Action的时候会自动把action的属性注入进来,默认按名字