最早接触到Kconfig是在u-boot的移植过程中。所今天来好好学习一下如何编写一个符合Kconffigde 配置文件。Kbuild或者是Kconfig的中文翻译意思是内核配置/构建系统。他最早出自哪里我不太清楚,但是Linux内核上的应用渐渐的增加了他的曝光度也让我见识到了。他的基本思路就是编辑一些配置字段,其中处理了各个配置之间的依赖和互斥等逻辑从而为一个复杂庞大的软件系统源码移植裁剪提供了优秀的配置工具,主要分为无界面版本和有界面的。使用方式无界面的现在常常被用来使用提供好的配置文件生成符合源码依赖关系的配置文件,而图形配置界面才是常常使用来进行配置裁剪源码系统的工具。图形化界面是靠读取指定的Kconfig文件进行显示渲染和配置并最后生成对应的配置文件,所以这里来学习记录一下Kconfig文件的编码规则。

config

Kconfig用config 定义一个配置项编码形式如下:

config   XXX
type
select xxx
depends on xxx || xxx
default
range
prompt
help

XXX为这个配置名称,在整个配置系统中唯一,如果在多个地方定义这个配置项,实际上配置工具会自动统一不同地方的同名配置的值为同一个,所以最好避免这类使用方式。可以说config定义的配置项时整个kbuild的一个最小配置单元。这里配置项目地下的具体内容描述如下:

type

bool
只有y和n,其后可以跟输入提示,如果没有则图形配置界面上将不会显示出当前配置项。
int
整形数,输入提示同上bool;
hex
十六进制数,输入提示同上bool;和int的区别就是输入数字时生成的内容会自动添加0x在前面
string
字符串 ,输入提示同上bool;
tristate
Linux源码构建特有的配置类型,输入提示同上bool;他的可取值比bool多了一个m,但是有时候不一定支持m值所以这个类型就和bool相同了。

select

表示选择这个选项时会同时自动选择另一个配置项,且当前配置项必须是具备bool类属性的配置项,其次是被select的选项也必须是bool类属性的配置选项。
这里的配置项选项类似于bool,tristate这种配置项。

default

表示这个配置项的默认值。需要根据具体的配置项类型决定。

depends on

表示这个配置选项的启用依赖其他的选项。如果依赖项未启用则界面上不显示出来。

range

作为int和hex类型时配置还可以支持range 属性增加输入的范围限制。输入超出限制时软件会给出提示。

prompt

使用prompt 单独一行书写输入提示信息,也常常用字其他不能直接在配置类型后书写提示字段的类型的配置中。

choice

Kconfig用choice 定义一个配置项包含同类配置项的多选一情况,编码形式如下:

choice
config choice1
bool "choice1"
config choice2
bool "choice2"
config choice3
bool "choice3"
config choice4
bool "choice4"
endchoice

他最后呈现到配置界面就是,罗列出choice下的配置项选择一个使能。当前choice不会生成具体的配置项只会生成所选配置项的配置内容,他存在的意义更像是将多个选项的互斥关系体现出来,更加凸显所配置特定功能的不同配置模式的意味。choice不能嵌套——choice禁止套娃。chioce可以使用上面的config的部分属性关键字如prompt,default,help等,但是有一点choice的子配置项只能是bool或者tristate类型的选项,且选项下的每一个config都不再使用default属性。

menu

Kconfig用menu定义一个子菜单配置项集合编码形式如下:

menu menu_test
comment "This is an memu " config TEST_HEX
hex
prompt "hex test config"
range 0 20
help
None config TEST_INT
int "int test config"
range 0 20
help
None config TEST_BOOL
bool "bool test config"
select TEST_SELECT2
help
None config TEST_STRING2
string "string test config"
default 2
help
None
endmenu

menu是kconfig将一些配置项划分为一个子项功能相关的配置集合的子菜单目录,他同choice一样本身不描述具体的配置。类似UI界面的子菜单,子菜单中的设置也可以拿出来单独配置但就是缺乏分类不方便人使用管理,menu允许嵌套,形成多级子菜单这和常见的系统设置的概念相同。

comment

常用来显示大标题类似的注释内容使用,常常在menu选项下用,最后会以***comment***的形式显示。除了给指定的menu进行注释可以使用comment,他还可以直接卸载配置文件的顶层即不属于任何一个项,类似config一样。

source

实际的工程源码往往都会根据具体的功能或其他方面的考虑分为不同的目录,而开发过程也习惯将对应的配置文件Kconfig也放到指定的源码根目录下。这样只要顶级根目录下的Kconfig使用source引用对应目录下的文件就可以将对象目下的配置导入。注意的是Kconfig是支持递归导入的导入的内容就是类似C代码中的include直接将指定文件的内容贴在source 调用的位置且在运行时就完成了导入内容的展开。

总结

Kbuild工具的出现大大的减轻了大型软件如Linux和u-boot等的移植,因为他帮移植过程处理了一部分依赖和互斥逻辑,这在你对一个系统的软件源码之间依赖关系不是很清楚的时候是很有用的。最后在配合对相应的工具将生成的配置文件转为C代码的头文件,在编译时引用对应的头文件就能对源码进行条件编译了进而完成率移植裁剪。对了Kconfig的源码也是支持注释的,注释使用“#”后面的单行就是注释的内容了。

Kconfig 配置文件编码规则的更多相关文章

  1. 通用的业务编码规则设计实现[转:http://www.cnblogs.com/xqin/p/3708367.html]

    一.背景 每一个企业应用中不可避免的都会涉及到业务编码规则的问题,比如订单管理系统中的订单编号,比如商品管理系统中的商品编码,比如项目管理系统中的项目编码等等,这一系列的编码都需要管理起来,那么它们的 ...

  2. 04Redis入门指南笔记(内部编码规则简介)

    Redis是一个基于内存的数据库,所有的数据都存储在内存中.所以如何优化存储,减少内存空间占用是一个非常重要的话题.精简键名和键值是最直观的减少内存占用的方式,如将键名very.important.p ...

  3. UTF-8编码规则(转)

    from:http://www.cnblogs.com/chenwenbiao/archive/2011/08/11/2134503.html UTF-8是Unicode的一种实现方式,也就是它的字节 ...

  4. 转:从开源项目学习 C 语言基本的编码规则

    从开源项目学习 C 语言基本的编码规则 每个项目都有自己的风格指南:一组有关怎样为那个项目编码约定.一些经理选择基本的编码规则,另一些经理则更偏好非常高级的规则,对许多项目而言则没有特定的编码规则,项 ...

  5. UTF-8编码规则

    UTF-8是Unicode的一种实现方式,也就是它的字节结构有特殊要求,所以我们说一个汉字的范围是0X4E00到0x9FA5,是指unicode值,至于放在utf-8的编码里去就是由三个字节来组织,所 ...

  6. BASE64编码规则及C#实现

    一.编码规则      Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码.它将需要编码的数据拆分成字节数组.以3个字节为一组.按顺序排列24位数据,再把这24位数据分成4组 ...

  7. openssl ans.1编码规则分析及证书密钥编码方式

    1 数据编码格式 openssl的数据编码规则是基于ans.1的,ans.1是什么 ? 先上高大上的解释 ASN.1(Abstract Syntax Notation One), 是一种结构化的描述语 ...

  8. UTF-8编码规则【转】

    hz_chenwenbiao UTF-8编码规则(转) UTF-8是Unicode的一种实现方式,也就是它的字节结构有特殊要求,所以我们说一个汉字的范围是0X4E00到0x9FA5,是指unicode ...

  9. HTML编码规则

    <!DOCTYPE html><!-- 为每一个HTML页面的第一行添加标准模式 --> <html lang="en-us"> <!-- ...

随机推荐

  1. 在vCenter Server中添加ESXi 主机失败的问题

    报错:出现了常规系统错误: Timed out waiting for vpxa to start 报错是这个,我看了下vcenter的版本是6.5,如图右上,这个报错是因为我ESXI主机是6.7的, ...

  2. 研发流程 接口定义&开发&前后端联调 线上日志观察 模型变动

    阿里等大厂的研发流程,进去前先了解一下_我们一起进大厂 - SegmentFault 思否 https://segmentfault.com/a/1190000021831640 接口定义 测试用例评 ...

  3. Graceful restart of a server with active WebSocket

    Graceful restart of a server with active WebSocket Simonwep/graceful-ws: ⛓ Graceful WebSocket wrappe ...

  4. libco hook原理简析

    我们先看一下libco协程库的特性描述 libco的特性 无需侵入业务逻辑,把多进程.多线程服务改造成协程服务,并发能力得到百倍提升; 支持CGI框架,轻松构建web服务(New); 支持gethos ...

  5. JavaScript this 关键字详解

    一.前言 this关键字是JavaScript中最复杂的机制之一.它是一个很特别的关键字,被自动定义在所有函数的作用域中.对于那些没有投入时间学习this机制的JavaScript开发者来说,this ...

  6. 从零搭建TypeScript与React开发环境

    前言 平时进行开发大多数是基于vue-cli或者create-react-app等官方或者公司内部搭建的脚手架.   我们业务仔做的最多就是npm i和npm run dev或者npm start,然 ...

  7. Spring Boot 两种多数据源配置:JdbcTemplate、Spring-data-jpa

    多数据源配置 JdbcTemplate支持 Spring-data-jpa支持 多数据源配置 创建一个Spring配置类,定义两个DataSource用来读取application.propertie ...

  8. trunk

    今天我们一起聊trunk(接vlan之后),一台switch我们用vlan就可以划分vlan(虚拟局域网),但是2台switch该怎么办呢? 实验环境搭建 switch0 : enable //切换到 ...

  9. IP路由__静态路由

    1.静态路由的优缺点: 优点:对于路由器的CPU没有管理性开销,它意味着如果你不使用动态路由选择的话,你可能应该购买更为便宜的路由器.在路由器之间没有带宽占用,它意味着在WAN链接中你可以节省更多的钱 ...

  10. k8s 调度 GPU

    最近公司有项目想在 k8s 集群中运行 GPU 任务,于是研究了一下.下面是部署的步骤. 1. 首先得有一个可以运行的 k8s 集群. 集群部署参考 kubeadm安装k8s 2. 准备 GPU 节点 ...