1.Kconfig介绍
参考文档:
任一个Linux内核的Documentation\kbuild\kconfig-language.rst https://www.rt-thread.org/document/site/programming-manual/kconfig/kconfig/
对于各类内核,只要支持menuconfig配置界面,都是使用Kconfig。
在配置界面中,可以选择、设置选项,这些设置会保存在.config文件里。
Makefile会包含.config,根据里面的值决定编译哪些文件、怎么编译文件。
1.1 配置界面示例
问题:
这个界面里,各个配置项来自哪里
这个界面里,这些配置项是怎么组织的
这个界面里,我们的选择、设置,结果保存在哪里
1.2 配置结果的保存
1.2.1 示例
在配置界面中操作的结果保存在.config文件中,示例如下:
# LOSCFG_COMPILER_HIMIX_32 is not set LOSCFG_COMPILER_CLANG_LLVM=y # # Platform # LOSCFG_PLATFORM="stm32mp157" # LOSCFG_PLATFORM_HI3516DV300 is not set # LOSCFG_PLATFORM_HI3518EV300 is not set LOSCFG_PLATFORM_STM32MP157=y # LOSCFG_PLATFORM_IMX6ULL is not set LOSCFG_PLATFORM_BSP_GIC_V2=y LOSCFG_ARCH_ARM=y LOSCFG_ARCH_ARM_AARCH32=y LOSCFG_ARCH_ARM_V7A=y LOSCFG_ARCH_ARM_VER="armv7-a" LOSCFG_ARCH_FPU_VFP_V4=y LOSCFG_ARCH_FPU_VFP_D32=y LOSCFG_ARCH_FPU_VFP_NEON=y LOSCFG_ARCH_FPU="neon-vfpv4" LOSCFG_ARCH_CORTEX_A7=y LOSCFG_ARCH_CPU="cortex-a7"
Makefile会包含.config文件,它会根据里面的变量比如LOSCFG_PLATFORM_STM32MP157选择单板相关的文件。
1.2.2 配置项的前缀
在Kconfig文件中,假设配置项的名字是XXX,在.config文件中:
默认情况下,它对应的变量名为CONFIG_XXX
如果设置了环境变量CONFIG_=ABC,则对应的变量名为ABC_XXX
在Liteos-a中的Makefile中export CONFIG_=LOSCFG_,所以对应的变量名为LOSCFG_XXX
1.3 描述单个配置项config
1.3.1 示例
在make menuconfig界面,可以看到这个配置项:
在配置界面,使用方向箭头游走到Enable FAT Cache Sync Thread后,可以:
输入Y,选择配置项,在.config中对应LOSCFG_FS_FAT_CACHE_SYNC_THREAD=y
输入N,不选择配置项,在.config中对应# LOSCFG_FS_FAT_CACHE_SYNC_THREAD is not set
上图中的配置项怎么实现的? (下面是帮助信息。我们可以通过这个找到kconfig文件)
grep "FS_FAT_CACHE_SYNC_THREAD" * -nr | grep Kconfig
在Kconfig文件中,它对应下列代码:
1.3.2 语法
解释如下:
config 表示config option,这是Kconfig的基本entry;其他entry是用来管理config的。 config 表示一个配置选项的开始,紧跟着的 FS_FAT_CACHE_SYNC_THREAD 是配置选项的名称。
config 下面几行定义了该配置选项的属性。
属性可以是该配置选项的:类型、输入提示、依赖关系、默认值、帮助信息。
bool 表示配置选项的类型,每个 config 菜单项都要有类型定义,变量有5种类型
bool 布尔类型
tristate 三态类型
string 字符串
hex 十六进制
int 整型
"Enable FAT Cache Sync Thread":提示信息
depends on:表示依赖关系,只有FS_FAT_CACHE被选中,才可以选择FS_FAT_CACHE_SYNC_THREAD
select XXX:表示反向依赖关系,即当前配置选项被选中后,XXX选项就会被选中。
default 表示配置选项的默认值,bool 类型的默认值可以是 y/n。
help 帮助信息,在make menuconfig界面输入H键时,就会提示帮助信息。
1.4 实现菜单menu/endmenu
1.4.1 示例
在Kconfig中,代码如下:
menu "Lib" config LIB_LIBC bool "Enable Libc" default y help Answer Y to enable libc for full code. config LIB_ZLIB bool "Enable Zlib" default y depends on LIB_LIBC help Answer Y to enable LiteOS support compress file library. endmenu
1.4.2 语法
解释如下:
menu "xxx"表示一个菜单,菜单名是"xxx"
menu和endmenu之间的entry都是"xxx"菜单的选项
在上面的例子中子菜单有2个选项:“Enable Libc”、“Enable Zlib”
由于第二个菜单项依赖于第一个菜单项,所以第二个菜单项缩进一格