文章目录
Linux系统移植:menuconfig 原理分析
一、make menuconfig 执行过程
在控制台输入 make menuconfig 后最终会执行如下代码:
%config: scripts_basic outputmakefile FORCE
$(Q)$(MAKE) $(build)=scripts/kconfig $@
其中 build=-f ./scripts/Makefile.build obj,把变量带入,展开代码
@ make -f ./scripts/Makefile.build obj=scripts/kconfig menuconfig
看一下 menuconfig 函数
menuconfig: $(obj)/mconf
$< $(silent) $(Kconfig)
参数传入进去:
menuconfig: scripts/kconfig/mconf
scripts/kconfig/mconf Kconfig
scripts/kconfig/mconf.c 这个文件会被编译,生成 mconf 这个可执行文件,而 mconf 会调用 uboot 根目录下的 Kconfig 文件开始构建图形配置界面,这就是 menuconfig 执行原理
二、Kconfig 语法
一中提到 mconf 根据 Kconfig 文件构建图形界面,所以要了解一下 Kconfig 的语法
Kconfig 语法有相关文档,在 linux 内核下面 Documentation/kbuild/kconfig-language.txt 有详细说明
2.1 mainmenu 菜单
mainmenu 是主菜单,输入“make menuconfig”以后打开的默认界面,Kconfig 中代码配置如下:
参数是 uboot 的菜单名称:
2.2 调用其他目录 Kconfig
Kconfig 也可以调用其他子目录中的 Kconfig 文件,方法如下:
source "xxx/Kconfig" //xxx 为相对路径目录
Kconfig 后面有相关的代码段
顶层 Kconfig 文件调用了其他子目录下的 Kcofig 文件,子目录下的 Kconfig 文件在主菜单中生成各自的菜单项
2.3 menu/endmenu 条目
menu 条目用于生成菜单,endmenu 则是该条目的结尾
整个 Kconfig 有两个 menu 菜单,子菜单 “General setup” 和子菜单 “Boot images”,在界面中如下:
其他的子菜单是 Kconfig 调用的其他 Kconfig 生成的
2.4 config 条目
在 menu/endmenu 代码块中有大量的 “config xxxx” 的代码块:
这些 config 条目其实就是子菜单的具体配置项
比如 General setup 的子菜单如下,和 config 可以对上:
config 规范以一段代码解释:
config + 名字 对应不同的配置项,config 关键字下面的几行是该配置项属性,
string 是变量类型,可以为:bool、tristate、string、hex 和 int,最常用的是 bool、tristate 和 string 这三种
- bool 类型有两种值:y 和 n,当为 y 的时候表示使能这个配置项,当为 n 的时候就禁止这个配置项
- tristate 类型有三种值:y、m 和 n,其中 y 和 n 的涵义与 bool 类型一样,m 表示将这个配置项编译为模块
- string 为字符串类型,用来存储本地字符串,选中以后即可输入字符串,比如:
string "Local version - append to U-Boot release"
代码选中 “Local version - append to U-Boot release” 后就可以输入字符串报错到该变量,如下:
“default y” 表示默认值就是 y
2.5 depends on 和 select
打开 arch/Kconfig 文件,代码如下:
这段代码中有 depends on 和 select 条目:
depends on 表示 SYS_GENERIC_BOARD 依赖于 HAVE_GENERIC_BOARD,表示 HAVE_GENERIC_BOARD 被选中以后 SYS_GENERIC_BOARD 才能被选中
select 则表示关联,当选中 ARC 后,下面 select 的 4 个选项都会被关联选上
2.6 choice/endchoice 条目
arch/Kconfig 有一段 choice 开头,endchoice 结尾的代码段,该代码段定义了一组可选择项,将多个类似的配置项组合在一起,供用户单选或者多选,部分代码如下:
选项如下:
2.7 menuconfig
menuconfig 和 menu 类似,但 menuconfig 比子菜单还多了选项的功能,顶层 Kconfig 中有如下代码:
这段代码定义了一个可选的菜单 EXPERT,只有 Y 选中了 EXPERT,然后 Enter 进入了 EXPERT,才会进一步显示 if 到 endif 的选项,否则进入了则一片空白,这就是 menuconfig 的功能
2.8 comment
comment 用于注释,比如在配置项 Configure Arasan Nand 下面有一行注释,注释内容为
*** Generic NAND options ***
界面如下:
2.9 source
source 前面有提到,用于读取另一个 Kconfig,比如:
source "arch/Kconfig"
三、自定义 menuconfig 菜单
图形化配置工具的主要工作就是在 .config 下面生成前缀为 “CONFIG_” 的变量,这些变量一般会有一个值,为 y,m 或 n,然后 uboot 源码里面会根据这些变量来决定编译对应的文件,我们也可以自定义菜单,编译自己的代码,我们自定义一个菜单,菜单属性如下:
- 在主界面中添加一个配置项为 JECKXU_Config_Test
- 配置项的为变量类型为 string
- 设置配置项的帮助内容为 test
编写代码如下:
config JECKXU_Config_Test
string "JECKXU_Config_Test"
help
test
配置项:
帮助内容:
给字符串添加值
然后 save 配置的值到 .config,可以看到写入成功
我们可以在进一步根据 CONFIG 的内容编译我么需要的代码,达到我们自定义配置的效果
到此 uboot 图形化配置界面基本结束,一般不用图形化界面来配置 uboot 功能,主要还是靠修改代码来配置 uboot 功能