KConfig语言学习(一文全览)

news2024/11/17 1:43:11

KConfig 语言学习

      • 菜单项
      • 菜单属性
        • 类型定义
        • prompt: 输入提示
        • default: 默认值
        • depends on/requires: 依赖关系
        • select: 反向依赖关系
        • imply: 弱反向依赖关系
        • visible if: 选项可见
        • range: 数据范围
        • help: 帮助信息
      • 菜单依赖关系
      • 菜单结构关系
      • KConfig语法
        • config: 配置项
        • menuconfig: 配置菜单块
        • choice/endchoice: 选择组
        • comment: 注释项
        • menu/endmenu: 菜单块
        • if/endif: 条件块
        • source: 读取项
        • mainmenu: 标题栏
        • #: 注释
    • 参考文献

菜单项


总体原则:每一个 config 就表示一个配置选项的开始,后面紧跟着的 ARCH_AIROHA 是配置选项的名称,config 下面几行定义了该配置选项的属性:如选项名是什么,依赖什么,选中这个后同时会选择什么等等。

1. config ARCH_AIROHA 
2.     bool "选项名" 
3.     depends on ARCH_MULTI_V7 
4.     select ARM_AMBA 
5.     default n 
6.     help 
7.       Support for Airoha EN7523 SoCs

config —> 选项。

ARCH_AIROHA —> 句柄,可用于控制Makefile,选择编译方式。

bool —> 选择可能:TRUE选中、FALSE不选;选中则编译,不选中则不编译。如果后面选项名字串为空,则表示其不会出现在选择软件列表中。

depends on —> 依赖,后面的选择被选择后,这个选项才能被选。

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

default—> 缺省配置项。

help—> 帮助信息。

菜单属性


类型定义

“bool”/“tristate”/“string”/“hex”/“int”

菜单选项可以有多个属性。并不要求这些属性可以用在任何地方。每个配置选项都必须指定类型。

在5种类型中 tristate 和 string 为基本类型,其他类型都是基于这两个基本类型。

  • bool 布尔类型:取值范围为Y/N。
config BSP_USING_WDT
	bool "Enable Watchdog Timer"
	select RT_USING_WDT
	default n

bool类型

  • tristate 三态类型:取值范围为Y/N/M,相较bool类型,tristate类型的菜单项多了编译成内核模块的选项。

  • string 字符串:默认菜单选项显示对应字符串。

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

string类型

  • int 整型
config BSP_I2C1_SCL_PIN
	int "I2C1 scl pin number"
	range 1 176
	default 116

int类型

  • hex 十六进制

类型定义可以用输入提示,所以下面的两个例子是等价的:

   bool "Networking support"
和
   bool
   prompt "Networking support"

prompt: 输入提示

"prompt " [“if” ]

每个菜单选项最多只能有一个显示给用户的输入提示。可以用 “if” 来表示该提示的依赖关系,当然这是可选的。

default: 默认值

“default” [“if” ]

一个配置选项可以有任意多个默认值。如果有多个默认值,那么只有第一个被定义的值是可用的。

默认值并不是只限于应用在定义他们的菜单选项,这就意味着默认值可以定义在任何地方或被更早的定义覆盖。

如果用户没有设置(通过上面的输入提示),配置选项的值就是默认值。如果可以显示输入提示的话,就会把默认值显示给用户,并可以让用户进行修改。默认值的依赖关系可以用 “if” 添加。(可选项)

depends on/requires: 依赖关系

“depends on”/“requires”

意思是本配置项依赖于另一个配置项。如果那个依赖的配置项为Y或者M,则本配置项才有意义;如果依赖的那个配置项本身被设置为N,则本配置项根本没有意义。

depends on 依赖的配置项可以是多个,还可以有逻辑运算。这种时候只要依赖项目运算式子的结果为真则依赖就成立。

依赖关系也可以应用到该菜单中所有的其它选项(同样接受一if表达式),所以下面的两个例子是等价的:

   bool "foo" if BAR
   default y if BAR
和
   depends on BAR
   bool "foo"
   default y

select: 反向依赖关系

“select” [“if” ]

表示depends on的值有效时,且当前配置选项被选中,则下面的select也会成立,将相应的内容选上。例如下面的例子表示选中BOOTLOADER_BOSSA时,也会选中USE_DT_CODE_PARTITION。

config BOOTLOADER_BOSSA
	bool "BOSSA bootloader support"
	select USE_DT_CODE_PARTITION

尽管普通的依赖关系可以降低选项的上限,反向依赖能将这一限制降的更低。当前菜单选项的值是symbol的最小值。如果symbol被选择了多次,上限就是其中的最大值。反向依赖只能用在 boolean 或 tristate 选项上。

imply: 弱反向依赖关系

“imply” [“if” ]

此属性和 select 相似,用于选定一个符号,但是被选定的符号仍有可能被直接依赖或用户输入设置为 n。

其选择规则为让目标选项的默认值不高于该选项的最大选项。可以看该例子:

config FOO
    tristate "foo"
    imply BAZ

config BAZ
    tristate "baz"
    depends on BAR
FOOBARBAZ’s defaultchoice for BAZ
yyyy/m/n
ymnm/n
ynn
mymy/m/n
mmmm/n
nyny/m/n
nmnm/n

该机制很有用,例如,有多个驱动程序想表明它们有能力连接到一个次要的子系统,同时允许用户将该子系统配置出来,而不必同时取消这些驱动程序。

visible if: 选项可见

“visible if”

这个属性只适用于菜单块,如果条件是N,菜单块就不会显示给用户(不过其中包含的symbol仍然可以被其他symbol选中)。它类似于单个菜单项的条件性 "提示 "属性。"可见 "的默认值是Y。

range: 数据范围

“range” [“if” ]

为int和hex类型的选项设置可以接受输入值范围。用户只能输入大于等于第一个symbol,小于等于第二个symbol的值。

help: 帮助信息

“help” or “—help—”

定义一段帮助信息,解释这个配置项的含义,以及如何去配置它。帮助信息的结束就由缩进的水平决定的,这也就意味着信息是在第一个比帮助信息开始缩进小的行结束。

“—help—” 和 “help” 在实现的作用上没有区别,“—help—” 有助于将文件中的配置逻辑与给开发人员的提示分开。

菜单依赖关系


<expr> ::= <symbol>                           (1)	// 在表达式计算的时候, bool和tristate可以对应的转化为对应的值, 其他的类型转化为 ‘n’
         <symbol> '=' <symbol>                (2)	// 如果两者相同, 那么就返回 y,否则返回 n
         <symbol> '!=' <symbol>               (3)	// 如果两者相同, 那么就返回 n,否则返回 y
         <symbol1> '<' <symbol2>              (4)	// 如果symbol1比symbol2小、大、小于等于、大于等于,那么就返回 y,否则返回 n
         <symbol1> '>' <symbol2>              (4)
         <symbol1> '<=' <symbol2>             (4)
         <symbol1> '>=' <symbol2>             (4)
         '(' <expr> ')'                       (5)	// 返回表达式的值。用于覆盖优先级
         '!' <expr>                           (6)	// 返回 (2-/expr/) 的结果
         <expr> '&&' <expr>                   (7)	// 返回 min(/expr/, /expr/) 的结果
         <expr> '||' <expr>                   (8)	// 返回 max(/expr/, /expr/) 的结果

表达式的值可以是“n”、“m”、“y”(或计算时分别用 0、1、2 表示)。菜单项在其 表达式的计算结果为“m”或“y”。

共有两种类型的symbol:常量symbol和非常量symbol。

非常量符号是最常见的符号,用 "config "语句定义。非常量符号完全由字母数字字符或下划线组成。

常量符号只是表达式的一部分。常量符号总是被单引号或双引号所包围。在引号内,任何其他字符都是允许的,引号可以用’'转义。

菜单结构关系


一个菜单项在菜单树中的位置是通过两种方式确定的。首先,它可以被明确指定:

menu "Network device support"
      depends on NET
    
config NETDEVICES
      ...
    
endmenu

上面例子,在 “menu” ~ “endmenu” 块内的所有条目都成为 “Network device support” 的子菜单。所有子项都继承了菜单项的依赖关系,例如,例子里的 “NET” 依赖项被加入了 “NETDEVICES” 配置项的依赖关系中。

另一种生成菜单结构的方法是通过分析依赖关系完成的。**如果一个菜单条目在某种程度上依赖于前一个条目,它就可以成为它的子菜单。**首先,前一个(父)符号必须是依赖关系列表的一部分,然后这两个条件中的一个必须为真。

  • 如果父项设置为n,子项一定会变成不可见
  • 如果父项可见,子项一定只能为可见
config MODULES
    bool "Enable loadable module support"

config MODVERSIONS
    bool "Set version information on all module symbols"
    depends on MODULES

comment "module support disabled"
    depends on !MODULES

例子中,MODVERSIONS 直接依赖于 MODULES,这意味着只有当MODULES不为n它才是可见的。另一方面,注释只有在MODULES被设置为’n’时才是可见的。

KConfig语法


配置文件描述了一系列菜单项,其中每行以关键字开头(帮助文本除外)。下列关键字则作为菜单项结束:

  • config
  • menuconfig
  • choice/endchoice
  • comment
  • menu/endmenu
  • if/endif
  • source

上述前五项也作为菜单项定义的开始。

config: 配置项

"config" <symbol>
<config options>

这段话将定义一个配置符号,并接受上述任何一种菜单属性作为选项。

例如,可以使用config语句进行赋值:

choice
	prompt "Flash PageSize"
	default FLASH_PAGESIZE_2K
	config FLASH_PAGESIZE_512
		bool "512 Bytes"
	config FLASH_PAGESIZE_2K
		bool "2K Bytes"
	config FLASH_PAGESIZE_4K
		bool "4K Bytes"
	config FLASH_PAGESIZE_8K
		bool "8K Bytes"
	config FLASH_PAGESIZE_16K
		bool "16K Bytes"
endchoice

config SSC_FLASH_PAGE_SIZE
    int
    default 512 if FLASH_PAGESIZE_512
    default 2048 if FLASH_PAGESIZE_2K
	default 4096 if FLASH_PAGESIZE_4K
	default 8192 if FLASH_PAGESIZE_8K
	default 16384 if FLASH_PAGESIZE_16K

image-20230301153548943

menuconfig: 配置菜单块

menuconfig <symbol>
<config options>

此入口和简单 config 入口相似,定义一个符号 symbol,但是也暗示一个菜单块,后接子入口。需保证所有子入口应该在此入口下方,且依赖于此入口符号。举例:

menuconfig BR2_TARGET_GENERIC_GETTY
	bool "Run a getty (login prompt) after boot"
	default y

if BR2_TARGET_GENERIC_GETTY
config BR2_TARGET_GENERIC_GETTY_PORT
	string "TTY port"
	default "console"
	help
	  Specify a port to run a getty on.

choice
	prompt "Baudrate"
	default BR2_TARGET_GENERIC_GETTY_BAUDRATE_KEEP
	help
	  Select a baudrate to use.

config BR2_TARGET_GENERIC_GETTY_BAUDRATE_KEEP
	bool "keep kernel default"
config BR2_TARGET_GENERIC_GETTY_BAUDRATE_9600
	bool "9600"
config BR2_TARGET_GENERIC_GETTY_BAUDRATE_19200
	bool "19200"
config BR2_TARGET_GENERIC_GETTY_BAUDRATE_38400
	bool "38400"
config BR2_TARGET_GENERIC_GETTY_BAUDRATE_57600
	bool "57600"
config BR2_TARGET_GENERIC_GETTY_BAUDRATE_115200
	bool "115200"
endchoice

config BR2_TARGET_GENERIC_GETTY_BAUDRATE
	string
	default "0"		if BR2_TARGET_GENERIC_GETTY_BAUDRATE_KEEP
	default "9600"		if BR2_TARGET_GENERIC_GETTY_BAUDRATE_9600
	default "19200"		if BR2_TARGET_GENERIC_GETTY_BAUDRATE_19200
	default "38400"		if BR2_TARGET_GENERIC_GETTY_BAUDRATE_38400
	default "57600"		if BR2_TARGET_GENERIC_GETTY_BAUDRATE_57600
	default "115200"	if BR2_TARGET_GENERIC_GETTY_BAUDRATE_115200
    
config BR2_TARGET_GENERIC_GETTY_TERM
	string "TERM environment variable"
	default "vt100"
	# currently observed by all but systemd
	depends on !BR2_INIT_SYSTEMD
	help
	  Specify a TERM type.

config BR2_TARGET_GENERIC_GETTY_OPTIONS
	string "other options to pass to getty"
	default ""
	# currently observed by all but systemd
	depends on !BR2_INIT_SYSTEMD
	help
	  Any other flags you want to pass to getty,
	  Refer to getty --help for details.
endif

image-20230301155512298

choice/endchoice: 选择组

choice [<symbol>]
<choice options>
<choice block>
endchoice

定义一个选择组。选择组类型仅仅可以设置为 bool 或 tristate,如果未指定类型,则取决于第一个选择项的类型。bool 类型只允许单个 config 入口被选择,tristate 类型允许多个 config 入口被设置为 m。

如上述例子的 baudrate 选择,其菜单展现结果如下:

image-20230301160216035

comment: 注释项

"comment" <prompt>
<comment options>

定义注释语句。将多个类似的配置选项组合在一起,供用户单选或多选,并且打印到输出文件中,仅支持依赖属性。例如:

choice
	bool "/bin/sh"
	default BR2_SYSTEM_BIN_SH_DASH if !BR2_PACKAGE_BUSYBOX
	help
	  Select which shell will provide /bin/sh.

# busybox has shells that work on noMMU
config BR2_SYSTEM_BIN_SH_BUSYBOX
	bool "busybox' default shell"
	depends on BR2_PACKAGE_BUSYBOX

config BR2_SYSTEM_BIN_SH_BASH
	bool "bash"
	depends on BR2_USE_MMU # bash
	depends on BR2_PACKAGE_BUSYBOX_SHOW_OTHERS
	select BR2_PACKAGE_BASH

config BR2_SYSTEM_BIN_SH_DASH
	bool "dash"
	depends on BR2_USE_MMU # dash
	depends on BR2_PACKAGE_BUSYBOX_SHOW_OTHERS
	select BR2_PACKAGE_DASH

config BR2_SYSTEM_BIN_SH_MKSH
	bool "mksh"
	depends on BR2_USE_MMU # mksh
	depends on BR2_PACKAGE_BUSYBOX_SHOW_OTHERS
	select BR2_PACKAGE_MKSH

config BR2_SYSTEM_BIN_SH_ZSH
	bool "zsh"
	depends on BR2_USE_MMU # zsh
	depends on BR2_PACKAGE_BUSYBOX_SHOW_OTHERS
	select BR2_PACKAGE_ZSH

comment "bash, dash, mksh, zsh need BR2_PACKAGE_BUSYBOX_SHOW_OTHERS"
	depends on !BR2_PACKAGE_BUSYBOX_SHOW_OTHERS && BR2_PACKAGE_BUSYBOX

config BR2_SYSTEM_BIN_SH_NONE
	bool "none"

endchoice # /bin/sh

image-20230301163754967

menu/endmenu: 菜单块

"menu" <prompt>
<menu options>
<menu block>
"endmenu"

定义一个菜单块。菜单块内的其他子入口继承此项的依赖。仅支持依赖和可视属性。

if/endif: 条件块

"if" <expr>
<if block>
"endif"

定义一个条件块。条件块内的其他菜单入口追加此项的依赖表达式 expr。参考前面 menuconfig 部分的例子。

source: 读取项

"source" <prompt>

source条目用于读取另一个Kconfig文件。例如:

// /Config.in文件:
menu "Target options"
    ……………………
endmenu
menu "Build options"
    ……………………
endmenu
source "toolchain/Config.in"
    
// /toolchain/Config.in文件:
menu "Toolchain"
    ……………………
endmenu    

最终显示在菜单树里的为展开后的选项列表:

image-20230301162508877

mainmenu: 标题栏

"mainmenu" <prompt>

如果配置程序启用,将被显示在配置程序的标题栏。该语句应该被放在配置文件的开头,所有语句之前。例如在buildroot根目录下config.in文件开头定义了该句:

mainmenu "Buildroot $BR2_VERSION Configuration"

其最终被显示在了 menuconfig 菜单列表的标题栏。

image-20230301162943833

#: 注释

除了上述语法,在源文件行任何地方出现一个未加引号的’#'字符,表示该行的其余部分是一段注释。

参考文献

[1]: Kconfig Language官网

[2]: Kconfig内容(详细)总结附示例快速掌握

[3]: Kconfig基本语法

[4]: Kconfig [@rt-thread]

[5]: kconfig语法整理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/381180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

发布依赖到maven仓库

maven中央仓库是一个开放的仓库&#xff0c;所以我们也可以把自己开发的jar推送到远程仓库&#xff0c;这样可以直接引入pom依赖使用我们的库。 准备工作 ● 需要一个github账号&#xff08;程序员必备&#xff09; ● 网络代理&#xff08;涉及到的网站通常没版本在国内直接访…

Computers Graphics(CAG)及Elsevier常见期刊投稿记录

1.期刊地址 Editorial Managerhttps://www.editorialmanager.com/cag/default2.aspx先进行用户注册&#xff0c;登录后进入首页点击Submit New Manuscript开始提交手稿&#xff0c;其他期刊流程相同&#xff0c;CAG所有的投稿注意事项见&#xff1a;Guide for authors - Comp…

数据库连接与properties文件

管理properties数据库&#xff1a; 现在pom文件中加入Druid的坐标&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency>配置文件中添加相应的数据&…

拒绝B站邀约,从月薪3k到年薪47W,我的经验值得每一个测试人借鉴

有时候&#xff0c;大佬们总是会特立独行。因为像我这样的常人总是想不通&#xff0c;究竟是怎样的情境&#xff0c;连B站这样的大厂面试都可以推掉&#xff1f; 缘起一通电话&#xff0c;踏出了改变人生轨迹的第一步 我是小瑾&#xff0c;今年28岁&#xff0c;2016年毕业于陕…

线程池的基本认识与使用

线程池的基本认识与使用线程池线程池工作原理&#xff1a;优点&#xff1a;传统的创建线程方式线程池创建线程使用线程池 池化思想&#xff1a;线程池、字符串常量池、数据库连接池可以提高资源的利用率 线程池工作原理&#xff1a; 预先创建多个线程对象 放入线程池种&#…

数据库基础-数据库基本概念(1-1)

你好&#xff0c;欢迎来到数据库基础系列专栏&#xff0c;欢迎留言互动哦~ 目录一、数据库基础1. 数据库基本概念1.1 数据库1.2 什么是数据库管理软件1.3 表1.4 行1.5 列和数据类型1.6 主键1.7 什么是 SQL一、数据库基础 1. 数据库基本概念 1.1 数据库 数据库是一个以某种有…

射频调试的习惯

三月开工了&#xff0c;一个月的调试即将开始。其实调试的重心是测试&#xff0c;核心的推动力是做事的习惯和思维。测试很重要&#xff0c;数据不对&#xff0c;能力和时间都浪费了上面了。测试的问题初步解完了&#xff0c;今天吃饭的时候碰到大领导。领导好忙&#xff0c;我…

SQL报错注入(上)

SQL报错注入报错注入概述报错注入的前提条件Xpath型函数&#xff08;需要数据库版本>5.15&#xff09;extractvalue&#xff08;&#xff09;extractvalue&#xff08;&#xff09;实操![在这里插入图片描述](https://img-blog.csdnimg.cn/5c7bfbc6565045d4bb352448c17f0869…

docker搭建redis集群、哨兵

集群搭建 本机IP 192.168.1.149 分别采用映射 192.168.1.149 的6379 6380 6381 三个端口模拟三台服务器。搭建三主无从的集群 首先可以在本机上创建三份redis.conf配置文件,分别命名为redis1.conf, redis2.conf, redis3.conf &#xff0c;我这里放在/opt/redis/conf/中 redis*.…

MyBatis学习笔记(九) —— 自定义映射resultMap

9、自定义映射resultMap 9.1、resultMap处理字段和属性的映射关系 若字段名和实体类中的属性名不一致&#xff0c;则可以通过resultMap设置自定义映射 resultType 是一个具体的类型。 resultMap 是resultMap的标签。 id 是处理主键和属性的映射关系&#xff1b; result 是处…

FirePower X2 14.0.1 for RAD Studio Alexandria

介绍 FirePower X2 FirePower X2 集成了 RAD Studio 11.0 Alexandria 中的新功能&#xff0c;并预览了我们的新特色组件 TwwDataGrouper。 FirePower X2 还允许您为 Apple 的新 M1 芯片构建应用程序&#xff0c;这样您就可以进一步利用 M1 芯片来提高本机应用程序的性能&#x…

set和map的基本使用

目录 关联式容器 要点分析 键值对 pair介绍 set 模板参数列表&#xff1a; set的构造&#xff1a; 常用接口 操作 multiset map map的构造 插入 make_pair map的迭代器 operator[] multimap multimap中为什么没有重载operator[] 关联式容器 关联式容器也是用…

(五十六)针对主键之外的字段建立的二级索引,又是如何运作的?

上一次我们已经给大家彻底讲透了聚簇索引这个东西&#xff0c;其实聚簇索引就是innodb存储引擎默认给我们创建的一套基于主键的索引结构&#xff0c;而且我们表里的数据就是直接放在聚簇索引里的&#xff0c;作为叶子节点的数据页&#xff0c;如下图。 而且我们现在也对基于主键…

日志框架以及如何使用LogBack记录程序

使用日志框架可以记录一个程序运行的过程和详情&#xff0c;同时便捷地存储到文件里面&#xff0c;并且性能和灵活性都比较好。日志的体系结构包括两类日志规范接口&#xff1a;Commons Logging&#xff0c;简称&#xff1a;JCL&#xff1b;Simple Logging Facade for Java&…

JavaScript高级程序设计读书分享之8章——8.2创建对象

JavaScript高级程序设计(第4版)读书分享笔记记录 适用于刚入门前端的同志 创建Object的实例 let person new Object(); person.name "Nicholas"; person.age 29; person.job "Software Engineer"; person.sayName function() { console.log(this…

增长乏力?创造产品和项目需求的6大方法【一杯咖啡谈项目】

我这里所说的创造需求&#xff0c;类似于PMI在《需求管理实践指南》中所写的专业术语“需要评估”&#xff08;needs assessment&#xff09;&#xff0c;这个需要评估&#xff0c;没有写进PMI的《项目管理知识体系指南&#xff08;PMBOK指南&#xff09;》&#xff08;以下称为…

fork()出来一个进程,这个进程的父进程是从哪来的?

基本概念fork() creates a new process by duplicating the calling process. The new process is referred to as the child process. The calling process is referred to as the parent process.fork()是一个系统调用&#xff0c;不是一个函数。详细信息可以&#xff0c;man…

day(22) Echarts和nacos

day(22) Echarts和nacos一、Echarts和nacos1.1 数据展示1.2 查询日期之间的数据二、配置中心2.1 配置中心spring cloud config2.1.1 缺点2.1.2 其他配置中心2.2 nacos2.2.1 pom2.2.2 配置文件2.2.3 Data id是微服务名称2.2.4 优先级2.2.5 动态刷新2.2.6 namespace2.2.7 多配置文…

Symbiosis Nest 共生巢token跨链兑换协议

参考文献&#xff1a; Getting Started with Symbiosis - Symbiosis Documentation Relayers Network | Symbiosis - Symbiosis Documentation Symbiosis V1 vs. V2 - Symbiosis Documentation Symbiosis protocal 基于稳定币的跨链兑换协议. Symbiosis protocol 组成结构…

pyechart绘制多图(三图及以上)的overlap叠加

pyechart github页面&#xff1a;https://github.com/pyecharts/pyecharts 首先要明确多图叠加到一个图的规则&#xff0c;即多个图只能有一个公共的轴&#xff1a; 比如&#xff0c;横坐标含义相同&#xff08;如时间维度&#xff09;或者&#xff0c;纵坐标取值含义相同 文…