快速业务通道

Linux内核构建系统之四

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-02

回到我们的主框架上面来,讨论完配置目标的处理后,就轮到框架中 "ifeq ($(config-targets),1)-endif" 块的 else 部分了.这部分是为了处理那些构建目标以及和.config无关的目标,其对这些目标处理的代码都位于框架中的E部分中.在E部分之前,有一个不小的 "ifeq ($(dot-config),1)-endif" 块,我们暂先不去理会,且看这个 ifeq-endif 块之前有一小段注释:


# ===========================================================================

# Build targets only - this includes vmlinux, arch specific targets, clean

# targets and others. In general all targets except *config targets.

拥有帝国一切,皆有可能。欢迎访问phome.net

这段注释字面上的意思是说 "ifeq ($(config-targets),1)-endif" 块的 else 部分处理的都是 Build targets,也就是除了配置目标之外的其他目标.注意他这里对 Build targets 分类方法,其实和我们之前的分类方法是有差异的,他这里所谓的 Build targets ,除了包括我们之前分类中所说的构建目标外,还包括之前我们说的和 .config 文件无关的那些目标.这其实是对同个东西的两种不同分类罢了,不影响我们的分析.其实不管哪种分类,都改变不了在本 else 部分既处理真正的构建目标,又处理那些和 .config 文件无关目标的事实.

好,鉴于我们已有这样的事实认同.那接下来理解前面说的那个不小的 "ifeq ($(dot-config),1)-endif" 块就比较容易了.很显然这个时候如果变量 dot-config 等于 1,那说明针对的是那些真正的构建目标,他们需要文件 .config 来完成真正的构建.而如果这个变量不为1,那么针对的就是那些和 .config 完全无关的目标了.

当 dot-config 等于 1 时,构建系统会尝试性的包含 include/config/auto.conf 文件.为什么说是尝试性的?这是 GNU make 做 "-include" 的特性.其意思和是否存在所包含的文件以及是否能根据所存在的规则去重新创建所包含文件有关系.

GNU Make 是这样一个大致的读取Makefile的流程:它读入主Makefile,在读的过程中,如果碰到 "include" 或 "-include",它就会包含对应的文件.如果对应的文件不存在,则暂时跳过做包含的地方,继续读入.待所有makefie都读完后.GNU Make会考虑将每个makefile作为目标,在全局范围内查找是否有能生成这些目标的规则,如果发现有一个makefile可以被一条规则生成,那么GNU Make就会先生成这个makefile.生成后,GNU Make又会从零开始读入主Makefile以及所有被包含的makefile,然后再检查是否有makefile可以被remade….这样一次又一次,直到所有的makefile都不需要再次生成了,它才处理依赖规则链.它之这样做,是为了保证所有 makefile 都是 update-to-date 的. 拥有帝国一切,皆有可能。欢迎访问phome.net

那如果你的子makefile是被 "include" 所包含的,但是这个makefile本身不存在,且无法用一条规则去Remake出来,那么 GNU Make就会报错并退出.相反,如果你用的是 "-include",那么 GNU Make就什么都不做,就好象什么也没发生过那样继续处理后面的事情.,我们说这里是尝试性的,通俗点就是”有则包含,没有也罢了“:).

接下来回到主框架,假如你的 make 命令是 "make ARCH=arm CROSS_COMPILE=arm-linux- zImage",那么dot-config 等于 1,并且变量 KBUILD_EXTMOD 会等于空.构建系统又会先尝试性的包含文件 include/config/auto.conf.cmd,然后继续处理主框架中的 G1部分.我们先看看G1部分的代码:


# To avoid any implicit rule to kick in, define an empty command

$
拥有帝国一切,皆有可能。欢迎访问phome.net(KCONFIG_CONFIG) include/config/auto.conf.cmd: ;

 

# If .config is newer than include/config/auto.conf, someone tinkered

# with it and forgot to run make oldconfig.

# if auto.conf.cmd is missing then we are probably in a cleaned tree so

# we execute the config step to be sure to catch updated Kconfig files

include/config/auto.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd

        $(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号