KConfig使用介绍

Kconfig语法介绍

  1. 语法文档位置:linux源码目录Documentation/kbuild/kconfig-language.txt。
  2. 语法例程:linux源码下的所有KConfig文件。

在项目开发中我们通常需要对一个工程根据不同的需求进行配置、裁剪。通常做法是专门定义一个config_xxx.h的文件,然后再文件中使用#define CONFIG_USING_XX等宏进行配置和裁剪。但是这种配置不太直观化,而且当一个工程由很多模块组成时,人为的去维护这个文件效率也较低。为此linux使用了KConfig来组织并生成配置文件。

KConfig文件一般使用menuconfig命令可视化配置,配置完成后被保存为.config文件。然后又将.config文件转化成xxx.h文件。这样c语言就可以识别使用了。

Kconfig语法

  1. KConfig语法使用菜单项作为基本组成单位。每个菜单项都有自己的相关属性(菜单项属性)。菜单项之间可以嵌套。
  2. 使用#作为注释符.

KConfig的菜单项

KConfig中按菜单项的性质可以分为下面几种菜单项:

  1. config菜单项: 定义一个配置选项。可以接受所有的菜单项属性。是语法中最常用的一个菜单项。语法格式为
    //格式
    "config" <symbol>
        <config options>
    //eg:
    config CONFIG_USING_XXX
        bool "this is use xxx"
        default n
    
  2. menuconfig菜单项:定义一个配置选项类似config菜单项。它常常配合if块使用。只有menuconfig菜单项选中时,才会展现if中的配置选项。
    //格式
    "menuconfig" <symbol>
        <config options>
    //eg:
    
    
  3. mainmenu菜单项::这将设置配置程序的标题栏,如果配置程序选择使用它。它应该放在配置的顶部,在任何其他语句之前。
    //格式
    "mainmenu" info
        <config options>
    //eg:
    mainmenu "KConfig test"
    
    config CONFIG_USING_XXX
        bool "this is use xxx"
        default n
    
  4. choice/endchoice菜单项::选择器
    //格式
    "choice" [symbol]
        <choice options>
        <choice block>
    "endchoice"
    //eg:
    choice
        prompt "Version"
        default PKG_USING_LITTLED_LATEST_VERSION
        help
            Select the package version
    
        config PKG_USING_LITTLED_V020
            bool "v0.2.0"
    
        config PKG_USING_LITTLED_LATEST_VERSION
            bool "latest"
    endchoice
    
  5. menu/endmenu菜单项:定义一个菜单块。
    //格式
        "menu" <prompt>
        <menu options>
        <menu block>
        "endmenu"
    //eg:
    menu "menu test"
        config CONFIG_USING_XXX
            bool "this is use xxx"
            default n
    
        config CONFIG_USING_XXXy
            bool "this is use xxx"
            default y
    endmenu
    
  6. comment菜单项: 添加注释,这个注释在配置文件转化成.h文件时也会转换成注释。
    //格式
    "comment" <prompt>
    <comment options>
    //eg:
    comment "this is set period"
    config CONFIG_USING_XXX
    int "default pwm period (ms)"
    range 1 1000
    default 1000
    
  7. if/endif菜单项:定义一个if条件判断块
    //格式
    "if" <expr>
        <if block>
    "endif"
    //eg:
        if RT_USING_USER_MAIN
        config RT_MAIN_THREAD_STACK_SIZE
            int "Set main thread stack size"
            default 2048
        config RT_MAIN_THREAD_PRIORITY
            int "Set main thread priority" 
            default 4  if RT_THREAD_PRIORITY_8
    endif
    
  8. source菜单项: 将其他的Kconfig文件加入到此位置,并解析显示。
    //格式
    "source" <prompt>
    //eg:
    source "./xxx/Kconfig"
    

菜单项属性

  1. 每个菜单项必须选择一种类型定义
    1. bool:二值量。取值为y或者n
    2. int:十进制整型数
    3. hex:十六进制整型数
    4. tristate:三态量。取值为
      1. y:选中
      2. n:不选中
      3. m: 编译成模块
    5. string:字符串
  2. 输入提示(input prompt):每个菜单项最多只有一个输入提示。可以使用“if”添加仅针对此提示的可选依赖项。
  3. default(默认值):在用户没有对其设置时它使用默认值。配置选项可以有任意数量的默认值。如果多个默认值是可见的,则只有第一个定义的值是活动的。默认值不局限于定义它们的菜单项。这意味着默认值可以在其他地方定义,也可以由以前的定义覆盖。
  4. 类型定义+默认值:是上面两个的简写。eg:bool "this is test"
  5. depends on(菜单项依赖):这个菜单项所依赖的菜单项,只有所依赖的菜单项被选中,当前的菜单项才会出现。如果有多个依赖,使用&&连接。这个属性一般多用if语句代替。
  6. select(反向依赖),当前配置被选中,则此依赖也会被选中。他只能用在bool、tristate类型的菜单项中。
  7. visible if <expr>(限制菜单显示): 此属性仅适用于菜单块,如果条件为false,则菜单块不会显示给用户(但包含在其中的符号仍然可以由其他符号选择)。“可见”的默认值为真。
  8. range min max(数值范围):限制inthex类型的范围。大于等于min并且小于等于max
  9. 帮助信息:help或者"---help---"它的结束由缩进决定。可以使用?查看.
  10. 其他属性:
    1. defconfig_list
    2. modules
    3. env=<value>:将环境变量导入Kconfig.

下面是一个菜单项属性使用的简单展示:
KConfig文件内容:

config ARM
	bool
	default y
	select ARCH_HAS__POSITIVE
	select ARCH_HAVE_CUSTOM_GPIO
	help
		The ARM series is a line of low-power-consumption RISC chip designslicensed by ARM Ltd and targeted at... 

config ARM_DMA_IOMMU_ALIGNMENT
	int "Maximum PAGE_SIZE"
	range 4 9
	default 8

config ARCH_MMAP_RND_BITS_MAX
	default 14 if PAGE_OFFSET=0x40000000
	default 15 if PAGE_OFFSET=0x80000000
	default 16

config ARCH_MULTIPLATFORM
	bool "Allow multiple platforms to be selected"
	depends on MMU

关于技术交流

此处后的文字已经和题目内容无关,可以不看。
qq群:825695030
微信公众号:嵌入式的日常
如果上面的文章对你有用,欢迎打赏、点赞、评论。二维码

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
编写 Kconfig 文件需要按照一定的语法和规则进行。下面是 Kconfig 文件的编写方式的介绍: 1. 定义选项和菜单: Kconfig 文件以菜单(menu)和选项(config)的方式组织配置。菜单用来组织选项,而选项用来定义具体的配置参数。 一个基本的选项定义如下: ``` config OPTION_NAME type prompt "Option description" default DEFAULT_VALUE depends on DEPENDENCY_EXPRESSION help Additional help text ``` 其中,`OPTION_NAME` 是选项的标识符,`type` 是选项的类型(如 bool、tristate、string 等),`prompt` 是选项的描述信息,`default` 是选项的默认值,`depends on` 是选项的依赖条件,`help` 是选项的帮助文本。 2. 组织菜单: 菜单用来组织选项,形成层次化的菜单结构。一个基本的菜单定义如下: ``` menu "Menu description" ``` 菜单之间可以嵌套,形成多级菜单结构。可以使用 `endmenu` 来表示菜单的结束。 3. 条件表达式: Kconfig 支持使用条件表达式来控制选项的可见性和可配置性。条件表达式可以包含其他选项的状态或操作系统的特定功能。 例如,可以使用 `if`、`elseif` 和 `endif` 来定义条件块: ``` if CONDITION_EXPRESSION ... elseif CONDITION_EXPRESSION ... endif ``` 条件表达式可以使用选项的标识符、逻辑运算符(如 `&&`、`||`)和关系运算符(如 `==`、`!=`)构建。 4. 依赖关系: Kconfig 支持自动解析和处理依赖关系。可以使用 `depends on` 来定义选项之间的依赖关系。 例如,可以使用 `depends on OPTION_NAME` 来表示当前选项依赖于另一个选项的状态。 以上是 Kconfig 文件的基本编写方式。在实际编写 Kconfig 文件时,需要根据具体的需求和配置选项进行定义和组织,同时注意语法和规则的正确性。可以参考 Linux 内核源码中的 Kconfig 文件来了解更多编写方式的示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

theboynoName

感谢鼓励

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

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

打赏作者

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

抵扣说明:

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

余额充值