Linux内核配置Kconfig
Kconfig作用
Kconfig文件用来控制内核的编译动作。简单理解,就是Kconfig配置了哪些文件需要参与编译,哪些文件不用编译。
rtconfig.h 完整说明
核心作用
它是 RT-Thread 操作系统的「编译开关总头文件」,本质是把 menuconfig 图形化配置结果即 .config ,转换成 C 语言可识别的宏定义(#define xxx_xxx),给源码做条件编译裁剪。
Kconfig配置方法
第一步:配置Kconfig
# driver目录下创建空目录
mkdir driver/test
# 在test目录下创建Kconfig空文件
vi Kconfig
Kconfig中添加内容如下:
config TEST
bool "Test driver"
help
this is for test
这里定义了一个 TEST 的句柄,Kconfig可以通过这个句柄来控制在Makefile中是否编译,”Test driver”是显示在终端的名称。
第二步:配置Makefile
在上面新建的Kconfig同级目录下新建Makefiel文件
vi Makefile
填写以下内容:
obj-$(CONFIG_TEST) += test.o
obj - $(CONFIG_选项名) += xxx.o
当CONFIG_选项名=n时,表示对应目录下的xxx.c不参与编译
当CONFIG_选项名=y时,表示对应目录下的xxx.c将被编译进内核
当CONFIG_选项名=m时,表示对应目录下的xxx.c将被编译成一个.ko模块
第三步:配置上层目录的Kconfig和Makefile
上层Kconfig添加如下:
menu "Device Driver"
source "driver/test/Kconfig"
表示将test目录下的Kconfig加入搜寻目录。
上层目录Makefile添加内容如下:
obj-y += test/
表示将test目录下的Makefile加入编译队列中。
根目录执行 make menuconfig 查看结果:
Kconfig语法
config 定义了一组新的配置选项
示例属性讲解:
config ARCH_AIROHA
bool "选项名"
depends on ARCH_MULTI_V7
select ARM_AMBA
default n
help
Support for Airoha EN7523 SoCs
-
config 表示一个配置选项的开始,紧跟着的 ARCH_AIROHA 是配置选项的名称,config 下面几行定义了该配置选项的属性。
-
bool 表示配置选项的类型,每个 config 菜单项都要有类型定义,变量有5种类型
bool 布尔类型:布尔类型变量的取值范围是 y/n tristate 三态类型:三态类型变量的取值范围是 y、n 和 m。tristate 代表在内核中有三种状态,一种是不选中,一种是选中直接编译进内核,还有一种是 m 手动添加驱动,而布尔类型变量只有两种状态,即选中和不选中。其使用方法和布尔类型变量类似。 string 字符串:字符串变量的默认值是一个字符串 hex 十六进制:十六进制类型变量的取值范围是一个十六进制的数,其使用方法和整型变量用法一致,整型变量生成的是十进制的数,而十六进制生成的是十六进制的数。 int 整型:整型变量的取值范围是一个整型的数 -
select 是反向依赖关系的意思,即当前配置选项被选中,则 ARM_AMBA 就会被选中。
-
default 表示配置选项的默认值,bool 类型的默认值可以是 y/n。
-
help 帮助信息上面的帮助信息内容为 Support for Airoha EN7523 SoCs 。
-
depends on 表示依赖某个配置选项,depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA 表示只有当 BSP_USING_UART1 和 RT_SERIAL_USING_DMA 配置选项同时被选中时,当前配置选项的提示信息才会出现,才能设置当前配置选项
choice/endchoice 语句
choice 语句将多个类似的配置选项组合在一起,供用户选择一组配置项
menu "Hardware Drivers Config"
menuconfig BSP_USING_ONCHIP_RTC
bool "Enable RTC"
select RT_USING_RTC
select RT_USING_LIBC
default n
if BSP_USING_ONCHIP_RTC
choice
prompt "Select clock source"
default BSP_RTC_USING_LSE
config BSP_RTC_USING_LSE
bool "RTC USING LSE"
config BSP_RTC_USING_LSI
bool "RTC USING LSI"
endchoice
endif
endmenu
- prompt 给出提示信息,光标选中后回车进入就可以看到多个 config 条目定义的配置选项;
- choice/endchoice 给出选择项,中间可以定义多个配置项供选择,但是在配置界面只能选择一个配置项。
comment 语句
comment 语句出现在界面的第一行,用于定义一些提示信息。
menu "Hardware Drivers Config"
comment "uart2 pin conflict with Ethernet and PWM"
config BSP_USING_COM2
bool "Enable COM2"
select BSP_USING_UART
select BSP_USING_UART2
default n
endmenu

source 语句
source 语句用于读取另一个文件中的 Kconfig 文件,如:
source "../libraries/HAL_Drivers/Kconfig"
上述语句用于读取当前 Kconfig 文件所在路径的上一级文件夹 libraries/HAL_Drivers 下的 Kconfig 文件。
menu/endmenu 语句
menu 语句用于生成菜单。
menu "Hardware Drivers Config"
config BSP_USING_COM2
bool "Enable COM2 (uart2 pin conflict with Ethernet and PWM)"
select BSP_USING_UART
select BSP_USING_UART2
default n
config BSP_USING_COM3
bool "Enable COM3 (uart3 pin conflict with Ethernet)"
select BSP_USING_UART3
default n
endmenu
menu 之后的字符串是菜单名。menu 和 endmenu 间有很多 config 语句。
if/endif 语句
if/endif 语句是一个条件判断,定义了一个 if 结构,示例代码如下
menu "Hardware Drivers Config"
menuconfig BSP_USING_CAN
bool "Enable CAN"
default n
select RT_USING_CAN
if BSP_USING_CAN
config BSP_USING_CAN1
bool "Enable CAN1"
default n
endif
endmenu
当没有选中 "Enable CAN " 选项时,下面通过 if 判断的 Enable CAN1 选项并不会显示出来。
menuconfig 语句
menuconfig 语句表示带菜单的配置项
menu "Hardware Drivers Config"
menuconfig BSP_USING_UART
bool "Enable UART"
default y
select RT_USING_SERIAL
if BSP_USING_UART
config BSP_USING_UART1
bool "Enable UART1"
default y
config BSP_UART1_RX_USING_DMA
bool "Enable UART1 RX DMA"
depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA
default n
endif
endmenu
menuconfig 这个语句和 config 语句很相似,但它在 config 的基础上要求所有的子选项作为独立的行显示。
总结

参考文章
https://blog.csdn.net/Pz_z1/article/details/125811780
语法:
https://blog.csdn.net/c_hnie/article/details/109393488
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)