Kconfig 详述

Kconfig

简介

Kconfig 严格来讲是一种编程语言,它拥有自己的语法及结构。正是这些语法和结构组成了menuconfig在用户眼前不同的表现形式。

  • Kconfig 文件用于定义各种配置选项,例如是否启用某个设备驱动、特定的文件系统支持、网络协议等。
  • 每个选项都有一个唯一的标识符和一个描述,描述清楚了该选项的作用和影响。
  • Kconfig 允许定义选项之间的依赖关系和冲突关系。例如,某个功能可能依赖于另一个功能或硬件支持,Kconfig 可以确保这些依赖关系在配置时得到正确处理。
  • 使用条件语句和选项依赖,Kconfig 可以根据不同的硬件平台或用户需求,动态地决定编译哪些部分的内核。
  • Kconfig 文件通常分布在 Linux 内核源代码树的不同目录中,每个目录下的 Kconfig 文件负责配置该目录下的特定功能或模块。
  • 每个 Kconfig 文件由一系列配置语句组成,包括 configmenuconfigchoicebooltristate 等命令,用于定义选项、菜单、选择项和选项的数据类型。

Kconfig 菜单结构

配置文件内是一组按树结构组织的配置选项集合。

+- 菜单块
|  +- 菜单条目1 (选项(config)、菜单(menu)、菜单结束(endmenu)、菜单选择(choice))
|  +- 菜单条目2 (选项(config)、菜单(menu)、菜单结束(endmenu)、菜单选择(choice))
|  +- ...

具体案例如下:

menu "Network device support"depends on NETconfig NETDEVICES...endmenu

菜单条目

Kconfig 文件由多个菜单条目组成,这些条目可以包含配置选项(config)、菜单(menu)、注释(comment)、菜单选择(choice)等

单个配置选项定义示例如下:

config MODVERSIONSbool "Set version information on all module symbols"depends on MODULEShelpUsually, modules have to be recompiled whenever you switch to a new kernel.

每一行以关键词开始,并可以跟随多个参数。“config”开始一个新的配置条目。接下来的行定义了该配置选项的属性。属性可以包括配置选项的类型、输入提示、依赖关系、帮助文本和默认值。

可以在多个地方定义同一个配置选项,但每个定义只能有一个输入提示,并且所有定义中的选项类型必须一致。
配置选项可以多次定义同一名称
1、你可以在不同的 Kconfig 文件或同一个文件的不同位置,重复定义一个配置选项,只要它们的名称相同。
2、这种重复定义通常是为了在不同的上下文中提供不同的选项描述或依赖关系。
但每个定义只能有一个输入提示
1、虽然你可以多次定义同一个配置选项,但在每个定义中,这个选项只能有一个输入提示。
2、输入提示是配置界面上显示给用户的描述文本,用于说明该选项的功能。
且类型不能冲突
1、每个配置选项的类型(例如 boolintstring 等)在所有定义中必须一致,不能有冲突。
2、这意味着你不能在一个地方定义 config MODVERSIONSbool 类型,然后在另一个地方定义它为 int 类型。

Kconfig 语法

配置文件描述了一系列菜单条目,每行以一个关键字开头(帮助文本除外)。以下关键字会结束一个菜单条目:

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

前五个关键字也用于递归定义菜单条目。

config

config <symbol>
<config options>

定义一个配置符号 <symbol>,并接受任何条目属性作为选项。

menuconfig

menuconfig <symbol>
<config options>

类似于上述的简单配置条目,但它还向前端提供一个提示,即所有子选项应显示为单独的选项列表。为了确保所有子选项都显示在 menuconfig 条目下而不是外部,需要确保 <config options> 列表中的每个条目都依赖于 menuconfig 符号。这可以通过以下两种构造之一实现:

  1. menuconfig M
    if Mconfig C1config C2
    endif
    
  2. menuconfig M
    config C1depends on M
    config C2depends on M
    

在以下示例 (3) 和 (4) 中,虽然 C1 和 C2 仍然依赖于 M,但它们将不再出现在 menuconfig M 之下,因为 C0 不依赖于 M:

  1. menuconfig Mconfig C0
    if Mconfig C1config C2
    endif
    
  2. menuconfig M
    config C0
    config C1depends on M
    config C2depends on M
    

choices

choice
<choice options>
<choice block>
endchoice

定义一个选择组,并接受上述任何属性作为选项。一个选择组只允许选择一个配置条目。

comment

comment <prompt>
<comment options> # 只能是依赖项

定义一个注释,在配置过程中显示给用户,并回显到输出文件中。唯一可以添加的属性是依赖项。

menu

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

定义一个菜单块,参见上文的“菜单结构”部分了解更多信息。唯一可能的选项是依赖项和“可视选项”属性。

菜单依赖

先看下文:

menu "Network device support"depends on NETconfig NETDEVICES...endmenu

所有在menu...endmenu块中的条目成为 Network device support 的子菜单。所有子条目继承菜单条目的依赖关系,例如,这意味着 NET 依赖关系被添加到配置选项 NETDEVICES 的依赖列表中(NETDEVICES 也依赖 NET)。

if

if <expr>
<if block> # 菜单条目
endif

定义一个 if 块。依赖表达式 <expr> 将附加到所有包含的菜单条目。

source

source <path>

读取指定的配置文件(Kconfig 文件)。该文件总是被解析。

mainmenu

mainmenu <prompt>

如果配置程序选择使用它,则设置配置程序的标题栏。它应放置在配置的顶部,在任何其他语句之前。

# 单行注释

在源文件行中的任意位置,未引用的 # 字符表示源文件注释的开始。该行的其余部分为注释。

条目属性

配置类型

类型定义:bool / tristate / string / hex / int

基本类型只有两种:tristate(三态)string,其他类型基于这两种类型。

输入提示

输入提示定义语法:prompt <expr> [if <expr> ],每个菜单条目最多可以有一个提示,用于显示给用户。可选地,可以通过“if”添加仅适用于该提示的依赖关系。

也可以在类型定义后选择接受一个输入提示,以下两个对输入提示的定义是等价的:

方式一:
bool "Networking support"方式二:
bool
prompt "Networking support"
默认取值

默认取值定义语法:default <expr> [if <expr>]

一个配置选项可以有任意数量的默认值。如果多个默认值可见,则只有第一个定义的默认值生效。默认值不限于其定义的菜单条目。这意味着默认值可以在其他地方定义或被更早的定义覆盖。只有当用户没有通过上述输入提示设置其他值时,默认值才会分配给配置符号。如果输入提示可见,默认值会呈现给用户,用户可以覆盖它。可选地,可以通过“if”添加仅适用于该默认值的依赖关系。

依赖关系

依赖关系定义语法:depends on <expr>

如果定义了多个依赖关系, 需要使用&&||来连接。

因为依赖关系也接受if表达式,所以以下两个例子是等价的:

bool "foo" if BAR
default y if BAR
depends on BAR
bool "foo"
default y
反向依赖

反向依赖定义语法:select <symbol> [if <expr>]

反向依赖关系的意思,即当前配置选项被选中,则 <symbol> 就会被选中。

数值范围

数值范围定义语法:range <symbol1> <symbol2> [if <expr>]

这将限制 int 和 hex 符号的可能输入值范围。用户只能输入[symbol1, symbol2]范围内的值(大于等于第一个符号且小于等于第二个符号)。

帮助文本

帮助文本定义语法:help <message>

可视选项

限制菜单显示语法:visible if <expr>

此属性仅适用于菜单块,如果条件为假,则不向用户显示菜单块(其中包含的符号仍然可以被其他符号选择)。

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

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

相关文章

速记Java八股文——Java 虚拟机篇

前言 分类汇总 10 常见的 Java 虚拟机篇 经典后端面试题&#xff0c;并对题目进行了精炼总结&#xff0c;旨在帮助大家高效记忆&#xff0c;在面试中游刃有余&#xff0c;不至于陷入词穷的窘境。 Java 虚拟机篇 调优命令有哪些&#xff1f; jps&#xff1a;列出当前用户的Java…

【算法】道格拉斯

一、引言 道格拉斯算法是一种用于曲线拟合的数学方法&#xff0c;特别是在处理曲线插值问题时非常有用。道格拉斯-普克算法&#xff08;Douglas-Peucker Algorithm&#xff09;&#xff0c;简称D-P算法&#xff0c;是一种用于简化多边形或折线的高效算法&#xff0c;由David Do…

01 Python环境安装

1.进入官网选择合适的版本&#xff0c;进行下载。Welcome to Python.org&#xff0c;提供了支持不同操作系统的安装包&#xff0c;目前最新版本为Python3.12&#xff0c;但在学习阶段一般不推荐大家使用最新版本的软件&#xff0c;因为对于其他软件需要该环境时&#xff0c;还不…

超13万律师使用的工具,启信宝推出“司法大数据”功能

合合信息旗下的启信宝&#xff0c;作为行业领先的商业查询APP&#xff0c;依托其3亿企业及机构的实时动态数据&#xff0c;涵盖工商、股权、司法、知识产权等多维度信息&#xff0c;推出了“司法大数据”功能。 随着大数据、人工智能技术的发展&#xff0c;律师行业已转型为开…

python——joblib进行缓存记忆化-对计算结果缓存

问题场景 在前端多选框需要选取多个数据进行后端计算。 传入后端是多个数据包的对应路径。 这些数据包需要按一定顺序运行&#xff0c;通过一个Bag(path).get_start_time() 可以获得一个float时间值进行排序&#xff0c;但由于数据包的特性&#xff0c;这一操作很占用性能和时…

Antd Vue3中 下拉框漂浮脱离bug

查阅资料后找到解决方法&#xff1a; <a-select :getPopupContainer"(triggerNode) > { return triggerNode.parentNode || document.body } " ><a-select-option v-for"(item, index) in List" :key"index" :value"item.id&q…

pkix报错

pkix报错 ----> aliehs-service-log‖2024-03-08 16:19:46.952‖http-nio-8030-exec-6‖com.aliehs.utils.CommonUtil.doGet‖ doGet Exception, url:https://e.ali.com/cgi-bin/token?grant_typeclient_credential&appidwx44e047da3a4ada49&secret1dc98a6babf3fd…

格尔支持websocket配置方案

1.格尔配置策略为反向代理&#xff0c;应用侧需要配置为wss协议 2.客户端浏览器设置(80版本)&#xff0c;弹窗“您的连接不是私密连接”&#xff0c;点击继续前往也是该页面&#xff0c;在快捷方式&#xff0c;目标后面加上--ignore-certificate-errors --allow-running-insec…

物联网服务器搭建及部署详细说明:掌握 Node.js、MongoDB、Socket.IO 和 JWT 的实用指南

关键知识点目录 1. 环境准备 1.1 硬件要求 1.2 软件要求 2. 搭建步骤 3. 数据处理与存储 3.1 数据存储 3.2 数据实时处理 3.2.1 安装 Socket.IO 3.2.2 修改服务器代码 4. 安全性 4.1 身份验证与授权 4.2 加密通信 4.2.1 生成自签名证书&#xff08;开发环境&#…

uniapp+vue微信小程序项目中实现手机号授权登录

效果图: 实现方式: <button open-type="getPhoneNumber" class="btn-normal" @getphonenumber="getPhoneNumber">手机号授权登录</button> open-type 有效值 值说明平台差异说明getPhoneNumber获取用户手机号,可以从@getphone…

LeetCode Hot100 将有序数组转换为二叉搜索树

给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡 二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1a;[0,-10,5,null,-3,null,9] 也将被视为正确…

在react中使用wangeditor富文本

官方文档 wangeditor5在线文档 依赖安装&#xff08;react框架&#xff09; yarn add wangeditor/editor # 或者 npm install wangeditor/editor --saveyarn add wangeditor/editor-for-react # 或者 npm install wangeditor/editor-for-react --save在React 中使用wangEditor …

编写java程序,自动监控程度,dump内存文件

步骤 1&#xff1a;编写 Java 程序 首先&#xff0c;编写一个 Java 程序&#xff0c;当内存使用达到 11GB 时生成 heap dump 文件&#xff0c;并以日期命名。将以下代码保存为 MemoryMonitor.java 文件&#xff1a; import com.sun.management.HotSpotDiagnosticMXBean; impo…

SpringBoot整合jasypt加密和解密yml配置文件

使用场景 在微服务架构中&#xff0c;配置管理是一个重要的问题。通常&#xff0c;我们会在配置文件中存放一些敏感信息&#xff0c;如数据库连接字符串、API 密钥等。这些敏感信息如果明文存储在配置文件中&#xff0c;存在较大的安全隐患。为了提高安全性&#xff0c;我们需…

Linux安装与配置

下载VMware 首先我们需要下载一个叫VMware的软件&#xff1a; 进入官方下载&#xff0c;地址&#xff1a;https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html选择与自己电脑版本适配的VMware版本【 输入许可证密钥 MC60H-DWHD5-H80U9-6V85…

Python | “IndexError: tuple index out of range” 【已解决】

Python | “IndexError: tuple index out of range” 【已解决】 IndexError: tuple index out of range 深度解析与实战指南 在Python编程中&#xff0c;IndexError: tuple index out of range是一个常见的错误&#xff0c;它发生在尝试访问元组&#xff08;或其他可索引的数…

前端canvas——贝塞尔曲线

曲线之美&#xff0c;不在于曲线本身&#xff0c;而在于用的人。 所以就有了这期贝塞尔曲线。 新规矩&#xff0c;先上个GIT。 效果图 开局一张图&#xff0c;代码全靠编。 代码 画骨 先想着怎么画一个心形吧&#xff0c;等你想好了&#xff0c;就知道怎么画了。 首先就还…

iPhone 中阅读器模式是什么?怎么开启该模式?

什么是阅读器模式&#xff1f;这是一个浏览器功能&#xff0c;可以为用户提供简洁、干净的阅读界面。当你在 Safari 浏览器中启用阅读器模式时&#xff0c;网页上的广告、侧边栏和其他不相关的元素将被移除&#xff0c;仅保留主要的文字内容和相关图片。这使得用户可以专注于阅…

前端开发的十字路口,薪的出口会是AI吗?

前言 在数字化转型的浪潮中&#xff0c;前端开发一直扮演着至关重要的角色&#xff0c;它连接着用户与产品之间的桥梁。然而&#xff0c;随着技术的不断进步和社会经济环境的变化&#xff0c;前端开发领域也面临着前所未有的挑战和机遇。 前端开发的困境 前端开发领域的竞争…

Vue3多语言实现

1.首先安装i18n npm install vue-i18n 2.在项目下创建lang目录并创建en.ts,i18n1.ts,zh.ts en.ts export default {message: {home: home,appTitle:aa 3D Smart Measure}, Menus: {Measuer: Measure,},GlueMeasure: {Title: Camera 3D Glue Measure,}} zh.ts export …