makefile 初探
【程序编程相关:Unix操作系统的发展及时间表】makefile 初探 【推荐阅读:关于Neighbour table ov】
原文出自:http://www.linuxforum.net 【扩展信息:关于linux图形界面的基本知识[转]】 作者:jkl ========================================== makefile 初探 ========================================== linux的内核配置文件有两个,一个是隐含的.config文件,嵌入到主makefile中;另一个是 include/linux/autoconf.h,嵌入到各个c源文件中,它们由make config.make menuconfig.make xconfig这些过程创建.几乎所有的源文件都会通过linux/config.h而嵌入autoconf.h,如果按照通常方法建立文件依赖关系 (.depend),只要更新过autoconf.h,就会造成所有源代码的重新编绎. 为了优化make过程,减少不必要的重新编绎,linux开发了专用的mkdep工具,用它来取代gcc来生成.depend文件.mkdep在 处理源文件时,忽略linux/config.h这样的头文件,识别源文件宏指令中具有"config_"特征的行.例如,如果有"#ifdef config_smp"这样的行,它就会在.depend文件中输出$(wildcard /usr/src/linux/include/config/smp.h). include/config/下的文件是另一个工具split-include从autoconf.h中生成,它利用autoconf.h中的 config_标记,生成与mkdep相对应的文件.例如,如果autoconf.h中有"#undef config_smp"这一行,它就生成include/config/smp.h文件,内容为"#undef config_smp".这些文件名只在.depend文件中出现,内核源文件是不会嵌入它们的.每配置一次内核,运行split-include一次. split-include会检查旧的子文件的内容,确定是不是要更新它们.这样,不管autoconf.h修改日期如何,只要其配置不变,make就不 会重新编绎内核. 如果系统的编绎选项发生了变化,linux也能进行增量编绎.为了做到这一点,make每编绎一个源文件时生成一个flags文件.例如编绎 sched.c时,会在相同的目录下生成隐含的.sched.o.flags文件.它是makefile的一个片断,当make进入某个子目录编绎时,会 搜索其中的flags文件,将它们嵌入到makefile中.这些flags代码测试当前的编绎选项与原来的是不是相同,如果相同,就将自已对应的目标文 件加入files_flags_up_to_date列表,然后,系统从编绎对象表中删除它们,得到files_flags_changed列表,最后, 将它们设为目标进行更新. 下一步准备逐步深入的剖析makefile代码. ========================================== makefile解读之二: sub-make ========================================== linux各级内核源代码的子目录下都有makefile,大多数makefile要嵌入主目录下的rule.make,rule.make将识 别各个makefile中所定义的一些变量.变量obj-y表示需要编绎到内核中的目标文件名集合,定义o_target表示将obj-y连接为一个 o_target名称的目标文件,定义l_target表示将obj-y合并为一个l_target名称的库文件.同样obj-m表示需要编绎成模块的目 标文件名集合.如果还需进行子目录make,则需要定义subdir-y与subdir-m.在makefile中,用"obj-$ (config_binfmt_elf) += binfmt_elf.o"与"subdir-$(config_ext2_fs) += ext2"这种形式自动为obj-y.obj-m.subdir-y.subdir-m添加文件名.有时,情况没有这么单纯,还需要使用条件语句个别对 待.makefile中还有其它一些变量,如mod-subdirs定义了subdir-m以外的所有模块子目录. rules.make是如何使make进入子目录的呢? 先来看subdir-y是如何处理的,在rules.make中,先对subdir-y中的每一个文件名加上前缀"_subdir_"再进行排序生成 subdir-list集合,再以它作为目标集,对其中每一个目标产生一个子make,同时将目标名的前缀去掉得到子目录名,作为子make的起始目录参 数.subdir-m与subdir-y类似,但情况稍微复杂一些.由于subdir-y中可能有模块定义,因此利用mod-subdirs变量将 subdir-y中模块目录提取出来,再与subdir-m合成一个大的mod_sub_dirs集合.subdir-m的目标所用的前缀是 "_modsubdir_". 一点说明,子目录中的makefile与rules.make都没有嵌入.config文件,它是通过主makefile向下传递 makefiles变量完成的.... 下一页