快速业务通道

Linux内核构建系统之三

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

顶层Makefile的总体框架结构

既然前面我们说过顶层Makefile最为重要,那么我们就先来研究一下这个文件.在你用VI编辑器打开这个文件时,千万别被它的复杂吓倒.这个文件虽然行数颇多,但其实里面也是有道道可寻的,我们可以抽出其中最重要的框架结构出来,列出如下(稍做整理和缩进):

从上面的框架中可以看出,影响内核构建过程动作的有数个变量,分别是:KBUILD_SRC, KBUILD_OUTPUT, skip-makefile, mixed-targets, config-targets 和 dot-config.我们将它们分成两组,前三为一组,后三个为一组.显然,前一组影响着框架中最外面的两个ifeq-endif块,而后一组则决定了第二个ifeq-endif块内的逻辑.

对于第一组变量,其实是为了支持"make O=1 [Targets]", 也就是为了支持将输出文件放到另外目录(不同于内核源代码目录的其他目录)的功能而准备的.那到底是如何支持的呢?我们说其实这是两次调用顶层Makefile的过程.

Empire CMS,phome.net

,当我们输入"make O=dir [Targets]"命令的时候,会第一次调用顶层Makefile.而此时变量KBUILD_SRC没有定义,会进入到第一个ifeq-endif块.进去之后,条件判断ifeq ("$(origin O)", "command line")会发现命令行里有变量O的定义,并且其值为dir.接下来,make会把变量O的值,也就是dir赋给变量KBUILD_OUTPUT.

既然KBUILD_OUTPUT的值为dir,条件判断ifneq ($(KBUILD_OUTPUT),)就必定成立,make会去处理上面的A部分.处理完A部分后,会将变量skip-makefile设置为1.因此显然,在退出第一个ifeq-endif块后,进入第二个ifeq-endif块的条件判断就得不到满足.我们说,其实到这里,第一次调用Makefile的过程就提前结束了.

那第二次调用顶层Makefile的过程又是在哪里呢?答案是在对A部分的处理上.我们列出A部分中关键的代码:


PHONY  = $
Empire CMS,phome.net
(MAKECMDGOALS) sub-make $(filter-out _all sub-make $(CURDIR)/Makefile, $(MAKECMDGOALS)) _all: sub-make $(Q)@: sub-make: FORCE $(if $(KBUILD_VERBOSE:1=),@)$(MAKE) -C $(KBUILD_OUTPUT) KBUILD_SRC=$(CURDIR) KBUILD_EXTMOD="$(KBUILD_EXTMOD)" -f $(CURDIR)/Makefile $(
Empire CMS,phome.net
filter-out _all sub-make,$(MAKECMDGOALS))

从这里,我们可以看出,不管命令"make O=dir [Targets]"中的Targets个数有多少个,它们都是要依赖于 sub-make.,对A部分的处理,其实就是执行sub-make规则的命令.在这个命令中,KBUILD_OUTPUT值为dir,CURDIR值为当前的内核源码目录.make命令中没有设置M变量或者SUBDIRS变量,KBUILD_EXTMOD值为空.这个命令就简化为:

make -C dir KBUILD_SRC=`pwd` KBUILD_EXTMOD="" -f `pwd`/Makefile [Targets]

这样一个命令的执行就和执行没带O=dir的"make [Targets]"命令差不多了.其差别只在于将输出文件存到dir目录,而非内核源码树目录而已.

从上面的框架中看出来,如果只是简单的"make [Targets]",那么就不会进去到第一个ifeq-endif块,而直接进到第二个ifeq-endif块中去处理了.这就要涉及到上面说到的第二组变量了.我们说,设置第二组变量的目的,就是为了适应make命令后面所跟Targets数目和类型上的多样性而已.

Empire CMS,phome.net

在详细分析第二个ifeq-endif块之前,让我们看看第二组变量的含义以及它们的初始值设置情况.我们之前已经对几乎所有Targets的作用及分类做了说明,理解它们不应该很难.如上面框架图中所示的那样,让我们先抽出B2部分中和这个相关的代码如下:


no-dot-config-targets := clean mrproper distclean 

                         cscope TAGS tags help %docs check% 

                         include/linux/version.h headers_% 

                         kernelrelease kernelversion

 

config-targets := 0

mixed-targets  := 0

dot-config     := 1

 

ifneq (
Empire CMS,phome.net
$(filter $(no-dot-config-targets), $(MAKECMDGOALS)),) ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),) dot-config := 0 endif endif ifeq ($(KBUILD_EXTMOD),) ifneq ($(filter config %config,$(MAKECMDGOALS)),) config-targets :=
Empire CMS,phome.net

【原文请至这里浏览:http://yihect.juliantec.info/julblog//post/4/19】

本文出自 “巨立安技术老师写的文章” 博客,请务必保留此出处http://juliantec.blog.51cto.com/2773953/500222

Empire CMS,phome.net

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号