Linux操作系统的移植(八)(下)
[ 2007-11-1 17:06:00 | By: 山野村夫 ]
 

  5.子目录Makefile

 

  子目录Makefile用来控制本级目录以下源代码的编译规则。我们通过一个例子来讲解子目录Makefile的组成:



此文件中包含以下内容。

 

(1)注释:对Makefile的说明和解释,由#开始。

 

(2)编译目标定义:类似于obj-$(CONFIG_TC)+=tcO的语句是用来定义编译的目标,是子目录Makefile中最重要的部分。编译目标定义那些在本子目录下,需要编译到Linux内核中的目标文件列表。为了只在用户选择了此功能后才编译,所有的目标定义都融合了对配置变量的判断。

 

前面说过,每个配置变量取值范围是:YNm和空,obj-$(CONFIG_TC)分别对应着obj-Yobj-nobj-mobj-。如果CONFIG_TC配置为Y,那么tc0就进入了obj-Y列表。obj-Y为包含到Linux内核vmlinux中的目标文件列表;obj-m为编译成模块的目标文件列表;obj-nobj-中的文件列表被忽略。配置系统就根据这些列表的属性进行编译和链接。

 

    export-objs中的目标文件都使用EXPORT_SYMBOL0定义了公共的符号,以便可装载模块使用。在tcC文件的最后部分,有“EXPORT_SYMBOL(search tc card);”,表明tco

符号输出。

 

这里需要指出的是,对于编译目标的定义,存在两种格式,分别是老式定义和新式定义。老式定义是前面Rulesmake使用的那些变量,新式定义是obj-Yobj-mobj-nobj-Linux内核推荐使用新式定义,不过由于Rulesmake不理解新式定义,需要在Makefile中的适配段将其转换成老式定义。

 

(3)适配段:适配段的作用是将新式定义转换成老式定义。在上面的例子中,适配段就是将obj-Yobj-m转换成Rulesmake能够理解的L_TARGETL_OBJSLX_OBJSM_OBJSMX_OBJS

 

L_OBJS=$(sort $(filter-out$(export-objs)$(obj-y)))定义了L_OBJS的生成方式:在obj-Y的列表中过滤掉export-objs(tco),然后排序并去除重复的文件名。这里使用了GNUMake的一些特殊功能,具体的含义可参考Make的文档(info make)

 

(4)include $(TOPDIR)Rulesmake:包含上层Rulesmake文件。

 

6configin配置功能概述

 

除编写Makefile外,还有一个重要的工作就是把新功能加入到Linux的配置选项中,提供此项功能的说明,让用户有机会选择此项功能。所有的这些都需要在configin文件中用配置语言来编写配置脚本,在Linux内核中,配置命令有多种方式:
 

以字符界面配置(make config)为例,顶层Makefile调用scriptsConfigure,按照archarmconfigin进行配置。命令执行完后产生文件.config,其中保存着配置信息。下一次再做make config将产生新的.config文件,原.config被改名为.configold

 

7.配置语言

 

(1)顶层菜单:mainmenu_nameprompt/,其中/prompt/是用“或”包围的字符串,“与”的区别是‘…’中可使用$引用变量的值。mainmenu_name设置最高层菜单的名字,它只在make xconfig时才会显示。

 

  (2)询问语句。
 

询问语句首先显示一串提示符/prompt/,等待用户输入,并把输入的结果赋给/symbol/所代表的配置变量。不同的询问语句的区别在于它们接受的输入数据类型不同,比如,bool接受布尔类型(yn)hex接受16进制数据。有些询问语句还有第3个参数/word/,用来给出默认值。

 

(3)定义语句。
 

不同于询问语句等待用户输入,定义语句显式地给配置变量/symbol/赋值/word/。

 

(4)依赖语句。
 

与询问语句类似,依赖语句也是定义新的配置变量。不同的是,配置变量/symbol/的取值范围将依赖于配置变量列表/dep/…。这就意味着:被定义的配置变量所对应功能的取舍取决于依赖列表所对应功能的选择。以dep_bool为例,如果/dep/…列表的所有配置变量都取值y,则显示/prompt/,用户可输入任意的值给配置变量/symbol/,但是只要有一个配置变量的取值为n,则/symbol/被强制成n。不同依赖语句的区别在于它们由依赖条件所产生的取值范围不同。

 

(5)选择语句。

 

choiceprompt//word//word/:choice语句首先给出一串选择列表,供用户选择其中一种。比如,Linux for ARM支持多种基于ARM coreCPULinux使用choice语句提供一个CPU列表,供用户选择:
 

hoice首先显示/prompt/,然后将/word/分解成前后两个部分,前部分为对应选择的提示符,后部分是对应选择的配置变量。用户选择的配置变量为y,其余的都为n

 

(6)if语句。



if语句对配置变量(或配置变量的组合)进行判断,并做出不同的处理。判断条件/expr/可以是单个配置变量或字符串,也可以是带操作符的表达式。操作符有:=!--o-a等。

 

  (7)菜单块(menu block)语句。
 

以上代码用以引入新的菜单。在向内核增加新的功能后,需要相应地增加新的菜单,并在新菜单下给出此项功能的配置选项。Comment后带的注释就是新菜单的名称。所有归属于此菜单的配置选项语句都写在commentendmenu之间。

 

(8)Source语句:sourceword/。

 

word/是文件名,source的作用是调入新的文件。

 

8.默认配置

 

Linux内核支持非常多的硬件平台,对于具体的硬件平台而言,有些配置就是必需的,有些配置就不是必需的。另外,新增加功能的正常运行往往也需要一定的先决条件,针对新功能,必须做相应的配置。由此可见,特定硬件平台能够正常运行对应着一个最小的基本配置,这就是默认配置。

 

Linux内核中针对每个ARCH都会有一个默认配置。在向内核代码增加了新的功能后,如果新功能对于这个ARCH是必需的,就要修改此ARCH的默认配置。修改方法如下(Linux内核根目录下)

 

备份.config文件
 
 
修改.Config
 
 

恢复.Config

 

如果新增的功能适用于许多的ARCH,只要针对具体的ARCH,重复上面的步骤就可以了。

 

  9help file

  在配置Linux内核时,遇到不懂含义的配置选项,可以查看它的帮助,从中可得到选择的建议。所有配置选项的帮助信息都在DocumentationConfigurehelp中,它的格式为:



<descrJption>给出本配置选项的名称,<vatiable name>对应配置变量,<help file>对应配置帮助信息。在帮助信息中,首先简单描述此功能,其次说明选择了此功能后会有什么效果,不选择又有什么效果,最后,不要忘了写上“如果不清楚,选择N(或者)Y”,给不知所措的用户以提示。


 
 

发表评论:

    大名:
    密码: (游客无须输入密码)
    主页:
    标题:

时 间 记 忆
最 新 评 论
专 题 分 类
最 新 日 志
最 新 留 言
搜 索
用 户 登 录
友 情 连 接
博 客 信 息