一、配置选项系统构成
Linux内核的配置系统由以下几个部分组成:
Makefile:分布在 Linux 内核源代码中的Makefile,定义 Linux 内核的编译规则;
配置脚本:Kconfig文件,定义了各个模块和其对应的可配置选项
配置工具:配置命令解释器(如Make config、Make menuconfig 和 make xconfig),对配置脚本进行解释,提供基于字符或图形的用户配置选择界面。
配置文件:顶层.config文件,用户配置选择的初值和选择结果。
其中配置工具都是使用脚本语言,如 Tcl/TK、Perl 编写的(也包含一些用 C 编写的代码),除非是配置系统的维护者,一般的内核开发者无须了解它们的原理,只需知道如何编写 Makefile 和配置脚本就可以。
Step1:顶层Makefile调用配置工具
scripts_basic:
$(Q)$(MAKE) $(build)=scripts/basic
……
#rule for config
config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
#rule for xconfig, gconfig, menuconfig, oldconfig
%config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
${Q}:根据V选项,为空或者@,是否显示这条命令执行过程
相当于执行:make –C scripts/kconfig/ config
Step2: scripts/kconfig/Makefile调用配置工具
#以menuconfig为例,其他的类似
menuconfig: $(obj)/mconf
$< $(Kconfig)
Kconfig := arch/$(SRCARCH)/Kconfig , SRCARCH:=arm
所以相当于调用 scripts/kconfig/mconf arch/arm/Kconfig 在顶层目录生成.config
.config会被转换为include/linux/autoconf.h头文件,然后被include/linux/config.h包含。
Step3: 配置工具解释配置脚本
配置工具
对应的Makefile目标
依赖的程序和软件
conf
defconfig, oldconfig
conf.c, zconf.tab.c
mconf
menuconfig
mconf.c, zconf.tab.c调用scripts/lxdialog/lxdialog
qconf
xconfig
qconf.c, kconfig_load.c, zconf.tab.c基于QT软件包的图形界面
gconf
gconfig
gconf.c, kconfig_load.c, zconf.tab.c基于GTK软件包的图形界面
step4:用户配置结果保存.config 文件中保存配置结果。
二、配置选项脚本文件
参考文档: Documentation/kbuild/kconfig-language.txt
主config:arch/$(SRCARCH)/Kconfig是主config文件,它会调用其他config文件,类似顶层Makefile。
配置脚本语法-关键字
关键字
语法
说明
config
config symbolname
定义一个配置选项符号及其属性
nemu
menu menublockendmenu
定义一个菜单项,包括若干其他配置选项
choice
choicchoiceblockendchoice
定义一个选择组, 如果bool类型,则只能单选,三态类型除了单选还可以把其他的设置为m。optional类型允许一个都不选。
comment
comment
定义一个注视
if
if ifblockendif
if条件块
source
source "Kconfig-file-name"
类似include,读取其他配置文件例子:config NR_CPUS int "Maximum number of CPUs (2-32)" range 2 32 depends on SMP default "4"
配置脚本语法-类型bool, int, hex, tristate, string
配置脚本语法-属性
属性
语法
说明
选择提示
prompt "string"
每个菜单选项只能有一个提示,可以和if配合使用
缺省值
default value [if expr]
可以定义多个带if的default值,最和定义一个不发if的,类似else情况。
依赖关系
depends on require [if expr]
依赖条件require 可以用&&或者|| 组合,可以定义多个denpends属性
反向依赖
select symbol [if expr]
可以定义多个select选现
数字范围
range min max
对于int hex类型的,定义其取值范围为 min<=x<=max
帮助文档
help string或者---help--- string
只有接下来的一行的缩进不小于上一行的缩进,就一直作为help文档,不需要加引号
配置脚本语法-表达式
表达式用于对符号定义值的判断,可以使用( ), &&, ||, ! , =, != 操作符进行组合。
三、内核配置系统的应用
利用本文提到的mconf,qconf,gconf,conf等工具,编写config脚本文件,即可完成类似场合的配置工作。
特别的,声称的.config文件可以直接被makefile利用, 一般方法为:
CONFIG-${DEFINE_SYMBOL1_IN_CONFIG} += xxx
CONFIG-${DEFINE_SYMBOL2_IN_CONFIG} += xxx
……CONFIG-y, CONFIG-n 分别得到定义的和没有定义的映射集合。