此文章大部为参考/复述整理编写,为私有理解回顾用
概况
Kconfig是Linux内核及许多其它系统广泛使用的一款配置管理工具,用于配置选择功能模块的编译与否
- Kconfig是脚本语言,用于定义配置选项和配置菜单
- Kconfig文件分布在各级目录下,构成一个分布式的配置数据库
- 一般来说,
make menuconfig
通过make命令执行menuconfig目标,来调用Kconfig生成界面
其单个配置项基本语法如下:
1 | config <option-name> # config:配置选项的名称 |
简单示例如下: 该Kconfig文件定义了两个配置选项:MY_FEATURE和MY_FEATURE_SUB_OPTION。MY_FEATURE是一个布尔类型的选项,默认值为y。MY_FEATURE_SUB_OPTION是一个布尔类型的选项,依赖于MY_FEATURE
1 | config MY_FEATURE |
在使用make menuconfig命令生成配置界面后,可以看到以下配置选项:
1 | My Feature [y] |
用户可以选择将MY_FEATURE选项设置为y或n。如果将MY_FEATURE选项设置为y,则会显示MY_FEATURE_SUB_OPTION选项。用户可以选择将MY_FEATURE_SUB_OPTION选项设置为y或n
Linux内核之make menuconfig
以下部分复述自参考文章
menuconfig
目标是Linux内核的顶层Makefile中的目标之一,定义如下:
1 | config_cmd = menuconfig |
该目标设置指定了make menuconfig
命令执行步骤如下:
- 调用make命令的config_cmd目标
- config_cmd目标会调用
scripts/kconfig/Makefile:mconf
命令来生成配置界面 - mconf命令会解析Kconfig文件,并将配置选项显示在配置界面中,mconf代码位于
//script/Kconfig/mconf.c
解析Kconfig:./mconf Kconfig
生成对话框:init_dialog
配置界面:conf
在make menuconfig
之后生成.config文件
- 在编译链接时,Makefile会读取.config文件中的内容,从而决定是否编译或者链接相关代码
- 此外,系统会将所有的选项以宏的形式保存在Linux内核根目录下的
include/generated/autoconf.h
文件,此头文件被包含于工程源文件中,用于决定源文件的条件编译选项
Kconfig常用语法
在Kconfig文件中,如果配置项名字为XXX
,则生成的.config文件中,会展示其变量为CONFIG_XXX
- 如果设置了
CONFIG_=LINUX
,则变量名展示为LINUX_XXX
- not set,则表示配置选项未设置或依赖于其他配置选项(此其他选项未设置)
- .config文件如下所示,设置了
CONFIG_=LOSCFG
,去掉前缀的变量即为Kconfig文件中的配置项名字1
2
3LOSCFG_DEBUG_TOOLS=y
LOSCFG_MEM_DEBUG=y
# LOSCFG_DRIVERS is not set
菜单
1 | menu "test menu" |
选择
1 | choice |
menuconfig
menuconfig XXX和config XXX类似, 唯一不同的是该选项除了能设置y/m/n外,还可以实现菜单效果(能回车进入该项内部)
1 | menuconfig M |
以下为Kconfig文件示例:其定义了一个名为My Menu的菜单,菜单下包含四个配置选项:MY_FEATURE_1、MY_FEATURE_2、MY_FEATURE_3和MY_FEATURE_4。其中,MY_FEATURE_4依赖于MY_FEATURE_1
1 | menu "My Menu" |
在使用make menuconfig命令生成配置界面后,可以看到以下配置选项:
1 | My Menu |
用户可以选择将菜单下的任意一个配置选项设置为y或n。如果将MY_FEATURE_1选项设置为y,则会显示MY_FEATURE_4选项。用户可以选择将MY_FEATURE_4选项设置为y或n。
进阶操作
source语句
source 语句用于读取另一个文件中的 Kconfig 文件
if语句
if语句:用于根据条件来显示或隐藏配置选项
以下示例,如果CONFIG_CPU_32选项设置为n,则MY_FEATURE选项才会显示在配置界面中
1 | if !CONFIG_CPU_32 |
tristate语句
用于定义三态配置选项
以下示例,MY_FEATURE选项可以设置为y、n或m
1 | config MY_FEATURE |
OpenHarmony之Kconfig应用
在OpenHarmony轻量系统的编译链接配置过程中,有如下应用:
- 用户在
//kernel/liteos_m/
目录下make menuconfig
,结果生成于//vendor/${company}/${company_product}/kernel_configs/debug.config
文件中(前提是先创建该文件) - 而此debug.config文件的宏配置会公开可见于整个GN构建工程,使得系统可以进行选择性的条件编译链接
- 另外,会有mkconfig.sh脚本将此配置文件转化为C语言的宏定义,写入
los_config.h
文件,此效果等同于在target_config.h
文件声明配置相关宏定义
注意项及疑惑解答
- 一定是生成.config文件吗,这个文件名是否可改
- .config文件的配置是如何导入到C源文件的宏定义的
- Kconfig.xx.xx文件类型
- 如何构建
- .json文件的用法,其属性与Kconfig的联系?