[编译] 10、kconfig 入门指导教程
前言
Kconfig 的作用就是为了让用户配置内核,在 Kconfig 中定义了一些变量,用户通过设置变量的值来选择如何个性化自己的系统内核。其和 makefile 往往需要配合使用,来组织编译大型工程。这里我们从一个 DEMO 讲起,然后介绍 Kconfig 具体语法。
1. 安装 kconfig
yaourt -S kconfig-frontends
2. 克隆一个 demo
➜ git clone https://github.com/skif-web/demo-kbuild.git
➜ demo-kbuild git:(master) ls
getLast.sh KConfig README.md
3. 运行 kconfig
运行 kconfig-mconf KConfig
会弹出交互页面,用户可以做一些选择,然后会在同级目录下自动生成一个 .config
文件,表示用户的选择
4. 源码解析
4.1 选择题目设计模板
下面是选择类型的题目模板:
choice SELECT_DESTINATION # 选择
prompt "Select data destination" # 选项的题干
default DESTINATION_TTY # 默认选项
config SELECT_DESTINATION_TTY # 选项 SELECT_DESTINATION_TTY
bool "show data in console"
config SELECT_DESTINATION_FILE # 选项 SELECT_DESTINATION_FILE
bool "save data to file"
endchoice
对应的 GUI 为:
4.2 填空题目设计模板
下面是填空类型的题目模板:
config SELECT_DESTINATION_FILE_FILENAME # 填空
string "destination file" # 填空的题干
depends on SELECT_DESTINATION_FILE # 这个填空题是否会出现,取决于上面的选择是否选择了 SELECT_DESTINATION_FILE
default "last.log" # 默认填空答案
help
Write destination file with relative or full path
对应的 GUI 为:
4.3 判断题目设计模板
下面是判断类型的题目模板:
config SHOW_ONLY_CURRENT_USER
bool "show data only for current user" # bool 是否选择
default y # 默认选项 yes
help # 帮助内容
script will get data only for currewnt user
对应的 GUI 为:
5. 产物解析
生成的 .config
为:
➜ demo-kbuild git:(master) ✗ cat .config
#
# Automatically generated file; DO NOT EDIT.
# Configuration
#
# CONFIG_SELECT_DESTINATION_TTY is not set
CONFIG_SELECT_DESTINATION_FILE=y
CONFIG_SELECT_DESTINATION_FILE_FILENAME="last.log"
CONFIG_SHOW_ONLY_CURRENT_USER=y
OR
➜ demo-kbuild git:(master) ✗ cat .config
#
# Automatically generated file; DO NOT EDIT.
# Configuration
#
CONFIG_SELECT_DESTINATION_TTY=y
# CONFIG_SELECT_DESTINATION_FILE is not set
# CONFIG_SHOW_ONLY_CURRENT_USER is not set # bool 类型不选会这样显示,而不是 N !!!
6. 产物使用
克隆下来的仓库文件夹下有个 getLast.sh
小脚本,该脚本展示了如何使用 .config
:
➜ demo-kbuild git:(master) ✗ cat getLast.sh
#!/bin/bash
# script running script
workDir=`dirname "$(readlink -f "$0")"`
# future command to run
cmdline="last "
# read config
source $workDir/.config || { echo "ERROR! Unable to read config"; exit 1; }
# if select
if [ "x$CONFIG_SHOW_ONLY_CURRENT_USER" == "xy" ]; then
currentUser=`whoami`
cmdline="$cmdline $currentUser"
fi
# now run command. If destination is file - ise redirect
if [ "x$CONFIG_SELECT_DESTINATION_FILE" == "xy" ]; then
$cmdline > $CONFIG_SELECT_DESTINATION_FILE_FILENAME
else
$cmdline
fi
这个例子非常经典,用 source
加载 .config
,然后用 if [ "x$CONFIG_SHOW_ONLY_CURRENT_USER" == "xy" ]
进行优雅的判断。
7.Kconfig语法简介
!!! 这里直接用园友黄超树的总结《Kconfig语法简介》
每个选项都有其自己的依赖关系。这些依赖关系决定了选项是否是可见的。父选项可见,子选项才能可见。
7.1 单一选项 config
原则:每一个config就是一个选项,最上面跟着控制句柄,下面则是对这个选项的配置,如选项名是什么,依赖什么,选中这个后同时会选择什么。
一个配置选项定义可以是下面的形式:
config MODVERSIONS
bool "Set version information on all module symbols"
depends MODULES
help
Usually, modules have to be recompiled whenever you switch to a new
kernel. ...
"config" ,配置选项。 而它下面的几行定义了该配置选项的属性。
属性可以是该配置选项的类型,输入提示(input prompt),依赖关系,帮助信息和默认值。
配置选项可以用相同的名字定义多次,但每个定义只能有一个输入提示并且类型还不能冲突。
"bool" ,类型定义 :"bool"/"tristate"/"string"/"hex"/"int"
每个配置选项都必须指定类型。有两个基本类型:tristate 和 string,其他类型都是基于这两个基本类型。
类型定义可以用输入提示,所以下面的两个例子是等价的: bool "Networking support"
和
bool
prompt "Networking support"
"depends on", 依赖关系:"depends on"/"requires"
为菜单选项定义依赖关系。如果定义了复杂的逻辑依赖关系系,它们之间用 '&&','||','('与')' 间隔。
依赖关系也可以应用到该菜单中所有的其它选项(同样接受一if表达式),所以下面的两个例子是等价的:
bool "foo" if BAR
default y if BAR
和
depends on BAR
bool "foo"
default y
"select", 反向依赖关系,语法为:**"select" ["if" ]
反向依赖只能用在 boolean 或 tristate 选项上。
当前选项选中后则select后指定的选项自动被选择。
尽管普通的依赖关系可以降低一选项的上限,反向依赖能将这一限制降的更低。
当前菜单选项的值是symbol的最小值。如果symbol被选择了多次,上限就是其中的最大值。
"default", 默认值:"default" ["if" ]
一个配置选项可以有任意多个默认值。如果有多个默认值,那么只有第一个被定义的值是可用的。
默认值并不是只限于应用在定义他们的菜单选项。这就意味着默认值可以定义在任何地方或被更早的定义覆盖。
如果用户没有设置(通过上面的输入提示),配置选项的值就是默认值。如果可以显示输入提示的话,就会把默认值显示给用户,并可以让用户进行修改。
默认值的依赖关系可以用 "if" 添加。(可选项)
7.2 菜单 menu
menu条目用于生成菜单,格式如下:
menu "Floating poing emulation"
config FPE_NWFPE
..............
config FPE_NWFPE_XP
.............
endmenu
menu之后的字符串是菜单名,menu和endmenu之间有很多config条目(待会说介绍config条目),在配置界面上会出现如下字样的菜单,移动光标选中它之后按回车进入,就会看到config条目定义的配置选项。
Floating point emulation --->
[] FPE_NWFPE
[] FPE_NWFPE_XP
7.3 选择框 choice
choice条目将多个类似的配置选项组合在一起,供用户单选或者多选。
choice
prompt "arm system type"
default arch_versatile
config arch_aarc200
...
config arch_integrator
...
endchoice
prompt后面跟的是提示信息,光标选中它后按回车键进入,就可以看到多个config条目定义的配置选项。
条目中定义的变量类型只能有两种:bool和tristate,不能同时有这两种类型的变量。
对于bool类型的choice条目,只能在多个选项中选择一个;
对于tristate类型的choice条目,要么就把多个选项都设为m;要么就像bool类型的choice条目一样,只能选择一个。
7.4 提示文本 comment
comment条目定义了一些帮助信息,它在配置过程中出现在界面的第一行;并且这些帮助信息会出现在配置文件中,格式如下:
comment <prompt>
<comment options>
例如:
menu "floating point emulation"
comment "At least one emultaion must be selected"
...
7.5 引入配置 source
source条目用于读入另一个Kconfig文件,格式如下:
source <promt>
例如:
source "net/Kconfig"
链接
: ** 在本博客的编译系列中,有很多关于自动化构建编译的博文:https://www.cnblogs.com/zjutlitao/category/759821.html **
[编译] 10、kconfig 入门指导教程的更多相关文章
- Redis入门指导
前言 本文提供全网最完整的Redis入门指导教程,下面我们从下载Redis安装包开始,一步一步的学习使用. 下载Redis 官网提供的Redis安装包是服务于Linux的,而我们需要在Window下使 ...
- 全网最完整的Redis入门指导
前言 本文提供全网最完整的Redis入门指导教程,下面我们从下载Redis安装包开始,一步一步的学习使用. 下载Redis 官网提供的Redis安装包是服务于Linux的,而我们需要在Window下使 ...
- 【ZZ】Web开发的入门指导 | 菜鸟教程
Web开发的入门指导 http://www.runoob.com/w3cnote/a-beginners-guide-to-web-development.html
- 新手入门指导:Vue 2.0 的建议学习顺序
起步 1. 扎实的 JavaScript / HTML / CSS 基本功.这是前置条件. 2. 通读官方教程 (guide) 的基础篇.不要用任何构建工具,就只用最简单的 <script> ...
- 2013 duilib入门简明教程 -- 总结 (20)
duilib的入门系列就到尾声了,再次提醒下,Alberl用的duilib版本是SVN上第个版本,时间是2013.08.15~ 这里给出Alberl最后汇总的一个工程,戳我下载,效 ...
- React-Native入门指导之iOS篇 —— 一、准备工作
React-Native 入门指导系列教程目录 一.准备工作 (已完成) 二.项目介绍与调试 三.CSS样式与Flex布局 四.常用UI控件的使用 五.JSX在React-Native中的应用 六.事 ...
- MVC5+EF6 入门完整教程12--灵活控制Action权限
大家久等了. 本篇专题主要讲述MVC中的权限方案. 权限控制是每个系统都必须解决的问题,也是园子里讨论最多的专题之一. 前面的系列文章中我们用到了 SysUser, SysRole, SysUserR ...
- React-Native入门指导之iOS篇
React-Native 入门指导系列教程目录 一.准备工作 (已完成) 二.项目介绍与调试 三.CSS样式与Flex布局 四.常用UI控件的使用 五.JSX在React-Native中的应用 六.事 ...
- HTML入门基础教程相关知识
HTML入门基础教程 html是什么,什么是html通俗解答: html是hypertext markup language的缩写,即超文本标记语言.html是用于创建可从一个平台移植到另一平台的超文 ...
随机推荐
- MetaBase使用iframe内嵌到Vue页面样式优化
Matebase是一个开源,易上手的BI工具,这里不做太多介绍了. 官网地址:https://www.metabase.com/ 解决问题描述: 使用iframe内嵌Metabase公开链接之后,页面 ...
- Linux从头学05-系统启动过程中的几个神秘地址,你知道是什么意思吗?
作 者:道哥,10+年的嵌入式开发老兵. 公众号:[IOT物联网小镇],专注于:C/C++.Linux操作系统.应用程序设计.物联网.单片机和嵌入式开发等领域. 公众号回复[书籍],获取 Linux. ...
- Docker 网络解读
Docker 容器在运行时,会涉及多个容器相互连接,甚至与宿主机上的应用连接的问题.既然需要产生连接,那么就必然要依赖网络. 网络在Docker的技术体系中,是一个不容易搞清楚的要点.因此,希望您读完 ...
- python3中的希尔排序
def shell_sort(alist): n = len(alist) # 初始步长 gap = round(n / 2) while gap > 0: # 按步长进行插入排序 for i ...
- 2019.06.28 MERGE INTO备忘
--保存主表 MERGE INTO dbo.DeliveryReceiving AS t USING @ReceiveMainDt AS s ON t.Id=s.id WHEN MATCHED THE ...
- 文件上传之WAF绕过及相安全防护
文件上传在数据包中可修改的地方 Content-Disposition:一般可更改 name:表单参数值,不能更改 filename:文件名,可以更改 Content-Type:文件 MIME,视情况 ...
- MongoDB 批量插入和循环插入性能测试
一万条数据批量插入和循环插入 循环插入 var startTime = (new Date()).getTime() var db = connect('log') for(var i = 0;i&l ...
- 天梯赛 L2-008 最长对称子串
题目是PTA的天梯赛练习集中的L2-008 https://pintia.cn/problem-sets/994805046380707840/problems/994805067704549376 ...
- Java 执行控制流程
1.带标签的break会中断并跳出标签所指的循环: 2.带标签的continue会中断本次循环,并开始标签所指处循环的下一轮循环.
- Linux命令(三)vim编辑器的常用命令
.subTitle { background: rgba(51, 153, 0, 0.53); border-bottom: 1px solid rgba(0, 102, 0, 1); border- ...