最早接触到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. JavaScript中函数的定义!

    JavaScript中函数的定义! 1 自定义函数(命名函数) function fun() {}; 2 函数表达式(匿名函数) var fun = function () {}; 3 利用 new ...

  2. The OAuth 2.0 Authorization Framework OAuth2.0的核心角色code 扫码登录

    RFC 6749 - The OAuth 2.0 Authorization Framework https://tools.ietf.org/html/rfc6749 The OAuth 2.0 a ...

  3. WPF mvvm 验证,耗时两天的解决方案

    常用类 类名 介绍 ValidationRule 所有自定义验证规则的基类.提供了让用户定义验证规则的入口. ExceptionValidation 表示一个规则,该规则检查在绑定源属性更新过程中引发 ...

  4. P1663 山

    写在前面 简单的二分答案,稍微加点数学计算,很有意思. 算法思路 二分答案可行的原因:答案具有单调性. 这道题目中证明一下:首先无限高显然是能看到任何一个点的,且山的每一条边都是对答案的一个限制,因此 ...

  5. ping、telnet

    ping用来检查网络是否通畅或者网络连接速度的命令 telnet是用来探测指定ip是否开放指定端口 Telnet 一 .关于telnet 对于Telnet的认识,不同的人持有不同的观点,可以把Teln ...

  6. docker基本使用-常用命令

    一. 常用命令 #查看docker服务 docker ps #启动docker服务 systemctl start docker #查看本地镜像 docker images #删除本地镜像 docke ...

  7. (十二)整合 Shiro 框架,实现用户权限管理

    整合 Shiro 框架,实现用户权限管理 1.Shiro简介 1.1 基础概念 1.2 核心角色 1.3 核心理念 2.SpringBoot整合Shiro 2.1 核心依赖 2.2 Shiro核心配置 ...

  8. Spark日志,及设置日志输出级别

    Spark日志,及设置日志输出级别 1.全局应用设置 2.局部应用设置日志输出级别 3.Spark log4j.properties配置详解与实例(摘录于铭霏的记事本) 文章内容来源: 作者:大葱拌豆 ...

  9. isEmpty isBlank 区别

    Sring test="  "; 这个 isblank 返回 true 但是 isEmpty 返回 false   所以: 一般用 isBlank 就可以了 ,是逐个字符检查 pu ...

  10. 设计模式(九)——装饰者模式(io源码分析)

    1 星巴克咖啡订单项目(咖啡馆): 1) 咖啡种类/单品咖啡:Espresso(意大利浓咖啡).ShortBlack.LongBlack(美式咖啡).Decaf(无因咖啡) 2) 调料:Milk.So ...