关于Kconfig语法在linux中的应用

    总结比前进更重要!

                                                    -------舍得之间,不忘初心,方才进退自如!    2020-5-12 于济南

前段时间折腾了一段时间的linux,对makefile有些了解,Kconfig算是新内容,这里扩展下。

linux下编译的过程:

  1. 遍历每个源码目录(或配置指定的源码目录)Makefile
  2. 每个目录的Makefile 会根据Kconfig来定制要编译对象
  3. 回到顶层目录的Makeifle执行编译

那么我们就得出各个文件的作用

Kconfig ---> (每个源码目录下)提供选项
.config ---> (源码顶层目录下)保存选择结果
Makefile---> (每个源码目录下)根据.config中的内容来告知编译系统如何编译

说到底,Kconfig就是配置哪些文件编译,那些文件不用编译。后期linux内核都做出了如下的图形界面。

这里写图片描述

怎么样,眼熟吧,和RTT一样的。

基本使用方法
我们以简单的单选项为案例来演示
假比,我们做好了一个驱动,需要将选项加入到内核的编译选项中,可以按以下步骤操作:

第一步 配置Kconfig
在driver目录下新建一个目录

mkdir driver/test 
1、进入test目录,创建Kconfig文件

这里写图片描述

这里定义了一个TEST的句柄,Kconfig可以通过这个句柄来控制Makefile中是否编译,”Test driver”是显示在终端的名称。
具体的语法在Kconfig语法简介中介绍。

第二步 配置Makefile

在同样的目录中,新建一个Makefile

Makfile

Obj-$(CONFIG_选项名) += xxx.o 
/*当CONFIG_选项名=y时,表示对应目录下的xxx.c将被编译进内核
当CONFIG_选项名=m时对应目录下的xxx.c将被编译成模块*/

第三步 配置上层目录的Makefile与Kconfig

在上一层目录的Kconfig中

这里写图片描述

表示将test文件夹中的Kconfig加入搜寻目录

在上一层目录的Makefile中

这里写图片描述

结果,运行根目录的.config查看结果

这里写图片描述

 

Kconfig语法简介

单一选项

总体原则:每一个config就是一个选项,最上面跟着控制句柄,下面则是对这个选项的配置,如选项名是什么,依赖什么,选中这个后同时会选择什么。

config CPU_S5PC100
    bool "选项名"
    select S5P_EXT_INT
    select SAMSUNG_DMADEV
    help
      Enable S5PC100 CPU support

config —> 选项  CPU_S5PC100 —>句柄,可用于控制Makefile 选择编译方式
bool —>选择可能:TRUE选中、FALSE不选 选中则编译,不选中则不编译。如果后面没有字符串名称,则表示其不会出现在选择软件列表中

注:

这里可以参看RTT官网给出的解释 bool其实是配置的选项的类型

布尔类型变量的取值范围是 y/n ,其使用示例如下

config BSP_USING_WDT
    bool "Enable Watchdog Timer"
    select RT_USING_WDT
    default n

上述语句对应的配置界面如下所示

bool
select —> 当前选项选中后则select后指定的选项自动被选择
 

depends on ARM || BLACKFIN || MIPS || COLDFIRE

depend on 依赖,后面的四个选择其中至少一个被选择,这个选项才能被选

tristate —> 选中并编译进内核、不选编译成模块

运行结果:< M > test

其他选项类型:

string 类型

字符串变量的默认值是一个字符串,其使用示例如下

config RT_CONSOLE_DEVICE_NAME
    string "the device name for console"
    default "uart1"

上述语句对应的配置界面如下所示

string

 

选项为数字

config ARM_DMA_IOMMU_ALIGNMENT
    int "Maximum PAGE_SIZE order of alignment for DMA IOMMU buffers" ---->该选项是一个整型值
    range 4 9 ---->该选项的范围值
    default 8 ---->该选项的默认值
    help
      DMA mapping framework by default aligns all buffers to the smallest

4-8为这个数字的范围,运行结果

这里写图片描述

这里的defult其实也可以用在bool中

config STACKTRACE_SUPPORT
    bool    --->该选项可以选中或不选,且不会出现在选择列表中
    default y ---->表示缺省情况是选中

hex 类型

十六进制类型变量的取值范围是一个十六进制的数,其使用方法和整型变量用法一致,整型变量生成的是十进制的数,而十六进制生成的是十六进制的数。

tristate 类型

三态类型变量的取值范围是 y、n 和 m。tristate 代表在内核中有三种状态,一种是不选中,一种是选中直接编译进内核,还有一种是 m 手动添加驱动,而布尔类型变量只有两种状态,即选中和不选中。其使用方法和布尔类型变量类似。

 

if..endif

if ARCH_S5PC100 --->如果ARCH_S5PC100选项选中了,则在endif范围内的选项才会被选

config CPU_S5PC100
    bool "选项名"
    select S5P_EXT_INT
    select SAMSUNG_DMADEV
    help
      Enable S5PC100 CPU support

endif

举个例子,如果CPU没有选择使用多核CPU,则不会出现CPU个数的选项。是一个条件判断,相比较之下,还是RTT的例子更好些:

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 选项并不会显示出来,如下图所示

if0

if1 当上一级菜单选中 "Enable CAN" 时

if11

if2

 

choice多个选项

choice      --->表示选择列表
    prompt "Default I/O scheduler"         //主目录名字
    default DEFAULT_CFQ                    //默认CFQ
    help
      Select the I/O scheduler which will be used by default for all
      block devices.

    config DEFAULT_DEADLINE
        bool "Deadline" if IOSCHED_DEADLINE=y 

    config DEFAULT_CFQ
        bool "CFQ" if IOSCHED_CFQ=y

    config DEFAULT_NOOP
        bool "No-op"

endchoice

RT-Thread Kconfig 文件中 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

以上代码对应的配置界面为

choice

语句解析: - prompt 给出提示信息,光标选中后回车进入就可以看到多个 config 条目定义的配置选项; - choice/endchoice 给出选择项,中间可以定义多个配置项供选择,但是在配置界面只能选择一个配置项。

menu "Boot options"  ----> menu表示该选项是不可选的菜单,其后是在选择列表的菜单名

config USE_OF
    bool "Flattened Device Tree support"
    select IRQ_DOMAIN
    select OF
    select OF_EARLY_FLATTREE
    help
      Include support for flattened device tree machine descriptions.
....

endmenu     ----> menu菜单结束

menu指的是不可编辑的menu,而menuconfig则是带选项的menu
menu和choice的区别
menu 可以多选 choice 是单项选择题

 

menuconfig MODULES ---> menuconfig表示MODULE是一个可选菜单,其选中后是CONFIG_MODULES
    bool "菜单名"
if MODULES
...
endif # MODULES

说到底,menconfig 就是一个带选项的菜单,在下面需要用bool判断一下,选择成立后,进入if …endif 中间得空间

以下为 RT-Thread 系统 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

当没有打开串口 DMA 配置时,以上代码对应的界面为

menuconfig1

 当打开串口 DMA 配置时,以上代码对应的界面为

menuconfig2

语句分析: - menuconfig 这个语句和 config 语句很相似,但它在 config 的基础上要求所有的子选项作为独立的行显示。 - depends on 表示依赖某个配置选项,depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA 表示只有当 BSP_USING_UART1 和 RT_SERIAL_USING_DMA 配置选项同时被选中时,当前配置选项的提示信息才会出现,才能设置当前配置选项

 

comment 语句

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

以上代码对应的配置界面为

comment

source 语句

source 语句用于读取另一个文件中的 Kconfig 文件,如:

source "../libraries/HAL_Drivers/Kconfig"

上述语句用于读取当前 Kconfig 文件所在路径的上一级文件夹 libraries/HAL_Drivers 下的 Kconfig 文件。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guangod

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值