本文目录

  • 1. Kconfig介绍
  • 2. KConfig的菜单项
    • 2.1 config 菜单项
      • 2.1.1 config 语法格式
    • 2.2 menuconfig 菜单项
      • 2.2.1 menuconfig 语法格式
    • 2.3 mainmenu菜单项
      • 2.3.1 maimenu 语法格式
    • 2.4 choice/endchoice菜单项
      • 2.4.1 choice/endchoice语法格式
    • 2.5 menu/endmenu菜单项
      • 2.5.1 menu/endmenu 语法格式
    • 2.6 comment 菜单项
      • 2.6.1 comment 语法格式
    • 2.7 if/endif 菜单项
      • 2.7.1 if/endif 语法格式
    • 2.8 source 菜单项
      • 2.8.1 source 语法格式
  • 3 菜单项属性
    • 3.1 输入提示(input prompt)
    • 3.2 默认值(default)
    • 3.3 菜单依赖项(depend on)
    • 3.4 反向依赖(select)
    • 3.5 帮助信息 help
    • 3.6 限制菜单显示(visble if)
    • 3.7 数值范围(range min max)
  • 4 Kconfig和.config文件和Makefile三者的关联

1. Kconfig介绍

  1. 语法文档位置:linux源码目录Documentation/kbuild/kconfig-language.txt。
  2. 语法例程:uboot源码下的Kconfig文件。

在项目开发中我们通常需要对一个工程根据不同的需求进行配置、裁剪。通常做法是专门定义一个config_xxx.h的文件,然后再在文件中使用#define CONFIG_XX_XX等宏进行配置和裁剪。但是这种配置不太直观化,而且当一个工程由很多模块组成时,人为的去维护这个文件效率也较低。为此linux使用了KConfig来组织并生成配置文件。

KConfig文件一般使用menuconfig命令可视化配置,配置完成后被保存为.config文件。然后又将.config文件转化成xxx.h文件。这样c语言就可以识别使用了。

大多数内核配置选项都对应Kconfig中的一个菜单。每行都是以关键字开始,并可以有多个参数。

  • KConfig语法使用菜单项作为基本组成单位。每个菜单项都有自己的相关属性(菜单项属性)。菜单项之间可以嵌套。
  • 使用#作为注释符.

2. KConfig的菜单项

Kconfig配置文件描述了一系列的菜单入口。除了帮助信息之外,每一行都以一个关键字开始,这些关键字如下:config、menuconfig、choice/endchoice、comment、menu/endmenu、if/endif等。前五个关键字都定义了一个菜单选项,if/endif是一个条件选项。KConfig中按菜单项的性质可以分为下面几种菜单项:

2.1 config 菜单项

  • config菜单项: 定义一个配置选项。可以接受所有的菜单项属性。是语法中最常用的一个菜单项。
  • config关键字定义一个新的配置选项,之后几行定义该配置选项的属性。

2.1.1 config 语法格式

//格式
"config" <symbol><config options>
//eg:
config TARGET_SMDKC100bool "Support smdkc100 board"select  OF_CONTROL

2.2 menuconfig 菜单项

  • menuconfig菜单项:定义一个配置选项类似config菜单项。它常常配合if块使用。只有menuconfig菜单项选中时,才会展现if中的配置选项。

2.2.1 menuconfig 语法格式

//格式
"menuconfig" < symbol >< config  options>
//eg:
menuconfig EXPERTbool “Configure standard U-Boot features (expertusers)”default yhelp This option allows cartain base U-Boot options  and settings to be disabled or tweaked. This is for specializedenvironments which can tolerate a "non-standard" U- Boot,Use this only if you really know what you are doing.
...
endmenu

2.3 mainmenu菜单项

  • mainmenu菜单项:这将设置配置程序的标题栏,如果配置程序选择使用它。它应该放在配置的顶部,在任何其他语句之前。

2.3.1 maimenu 语法格式

//格式
"mainmenu" info< config options>
//eg:
mainmenu "U-boot $(UBOOTVERSION) Configuration"

2.4 choice/endchoice菜单项

  • choice/endchoice菜单项:选择器,选择菜单定义一组选项。此选项的类型只能是boolean或tristate型。在一个硬件有多个驱动的情况下可以使用choice菜单,使用choice菜单可以实现最终只有一个驱动被编译进内核中。choice菜单可以接受的另一个选项是optional,这个选项被设置为N,表示没有被选中。

2.4.1 choice/endchoice语法格式

//格式
"choice" [symbol]<choice options><choice block>
"endchoice"
//eg
choiceprompt "S5PC1XX board select"optional
config TARGET_SMDKC100bool "Support smdkc100 board"select  OF_CONTROL
endchoice

2.5 menu/endmenu菜单项

  • menu/endmenu菜单项:定义一个菜单块

2.5.1 menu/endmenu 语法格式

//格式"menu" <prompt><menu options><menu block>"endmenu"
//eg:
menu "ARM architecture"depends on ARM
config SYS_ARCHdefault "arm"
...
endmenu

2.6 comment 菜单项

  • comment菜单项: 添加注释,注释菜单定义了配置过程中显示给用户的注释。此注释也可以被输出到文件中以被查看。
  • 在注释中唯一可以定义的属性是依赖关系,其它的属性不可以定义。

2.6.1 comment 语法格式

//格式
comment <prompt>
<comment options>
//eg:
comment "Compiler: $(CC_VERSION_TEXT)"

2.7 if/endif 菜单项

  • if/endif菜单项:定义一个if条件判断块

2.7.1 if/endif 语法格式

//格式
"if" <expr><if block>
"endif"
if ARCH_S5PC1XXchoiceprompte "S5PC1XX board select"optional
config TARGET_SMDKC100bool "Support smdkc100 board"select OF_CONTROL
endchoice config SYS_SOCdefault  "s5pc1xx"
source "board/samsung/smdkc100/Kconfig"endif

2.8 source 菜单项

  • source菜单项: 将其他的Kconfig文件加入到此位置,并解析显示

2.8.1 source 语法格式

//格式
"source" <prompt>
//eg:
source "./xxx/Kconfig"
source "board/samsung/smdkc100/Kconfig"

3 菜单项属性

  • 属性可以有类型、输入提示(input/prompt)、依赖关系、帮助信息和默认值等。可以出现两个相同的配置选项,但每个选项只能有一个输入提示并且类型还不能冲突。
  • 每个配置选项都必须指定一种类型,包括bool、tristate、string、hex和int,其中tristate和string是两种基本的类型,其它类型都是基于这两种类型的。
  • 类型定义后面紧跟输入提示,这些提示将显示在配置菜单中。

每个菜单项必须选择一种类型定义:

  • bool:二值量。取值为y或者n(对应真要么假)。意思是这个配置项只能被2种选择。
  • int:十进制整型数
  • hex:十六进制整型数
  • tristate:三态量。取值为y:选中;n:不选中;m: 编译成模块(意思是三态——3种状态,对应Y、N、M三种选择方式, 意思就是这个配置项可以被三种选择。)
  • string:字符串

3.1 输入提示(input prompt)

  • 输入提示(input prompt):每个菜单项最多只有一个输入提示。可以使用“if”添加仅针对此提示的可选依赖项。
  • 输入提示的一般语法如下:

prompt < prompt > [“if” < expr >]

其中prompt是关键字,表示一个输入提示。< prompt >是一个提示信息。可选项if用来表示该提示的依赖关系。

3.2 默认值(default)

  • 默认值(default):当depends on的值有效时,下面的default也会成立,将相应的选项选上,有三种选项,分别对应y,n,m。在用户没有对其设置时它使用默认值。配置选项可以有任意数量的默认值。默认值不局限于定义它们的菜单项。这意味着默认值可以在其他地方定义,也可以由以前的定义覆盖。
  • 默认值的语法如下:

default < expr > [if < expr >]

一个配置选项可以有多个默认值,但是只有第一个默认值是有效的。只有config选项才能配置默认值。

3.3 菜单依赖项(depend on)

  • depends on(菜单项依赖):这个菜单项所依赖的菜单项,只有所依赖的菜单项被选中,当前的菜单项才会出现。

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

  • depends项会导致make menuconfig的时候找不到一些配置项。所以在menuconfig中如果找不到一个选项,但是这个选项在Kconfig中却是有的,则可能的原因就是这个配置项依赖的一个配置项是不成立的。depends依赖的配置项可以是多个,还可以有逻辑运算。这种时候只要依赖项目运算式子的结果为真则依赖就成立。

  • 依赖关系如下:

depends on < expr >

如果定义了多个依赖关系,那么可以用"&&"来连接,表示与的关系。依赖关系可以应用到菜单的所有其它选择中。
depends能够限定一个config选项的能力,即如果A依赖于B,则在B被配置为Y的情况下,A可以为Y、M、N;在B被配置为M的情况下,A可以为M、N;在B被配置为N的情况下,A只能为N,表示禁用该功能。

3.4 反向依赖(select)

  • select(反向依赖)::表示当epends on的值有效时,下面的select也会成立,将相应的内容选上。 他只能用在bool、tristate类型的菜单项中。

3.5 帮助信息 help

  • 帮助信息:help或者"—help—"帮助信息,解释这个配置项的含义,以及如何去配置他。
  • 帮助信息的语法如下:

help (或者–help–)
begin

end

可以用"help"或者"–help–"定义帮助信息。帮助信息可以在开发人员配置内核时给出提示。

3.6 限制菜单显示(visble if)

  • visible if (限制菜单显示):此属性仅适用于菜单块,如果条件为false,则菜单块不会显示给用户(但包含在其中的符号仍然可以由其他符号选择)。“可见”的默认值为真。

3.7 数值范围(range min max)

  • range min max(数值范围):限制int、hex类型的范围。大于等于min并且小于等于max

4 Kconfig和.config文件和Makefile三者的关联

  • 配置项被配置成Y、N、M会影响“.config”(.config 受XX_defconfig文件影响)文件中的CONFIG_XXX变量的配置值。
  • “.config”中的配置值(=y、=m、没有)会影响最终的编译链接过程
    (1)如果=y则会被编入(built-in);
    (2)如果=m会被单独连接成一个”.ko”模块;
    (3)如果没有则对应的代码不会被编译。
  • 那么这是怎么实现的?都是通过makefile实现的
    如makefile中:obj-$(CONFIG_DM9000) += dm9000.o,
    (1)如果CONFIG_DM9000变量值为y,则obj += dm9000.o,因此dm9000.c会被编译;
    (2)如果CONFIG_DM9000变量未定义,则dm9000.c不会被编译。
    (3)如果CONFIG_DM9000变量的值为m则会被连接成“.ko”模块。

Kconfig使用介绍相关推荐

  1. kconfig常用语法,入门必看

    kconfig 1. kconfig简单介绍 Kconfig用来配置内核,它就是各种配置界面的源文件,内核的配置工具读取各个Kconfig文件,生成配置界面供开发人员配置内核,最后生成配置文件.con ...

  2. Linux内核配置——Kconfig文件

    1.1.Kconfig文件内容 menuconfig NETDEVICESdefault y if UMLdepends on NETbool "Network device support ...

  3. linux内核kconfig objs,linux内核中Kconfig和Makefile 详解

    内核源码树的目录下都有两个文档 Kconfig (2.4版本是Config.in)和Makefile.分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录 ...

  4. Linux内核移植之二:Kconfig分析

    内容来自 韦东山<嵌入式Linux应用开发完全手册> 在内核日录下执行"make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-&quo ...

  5. Linux内核的整体架构介绍

    1. 前言 本文是"Linux内核分析"系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统.之后,会介绍Linux内核源文件的 ...

  6. 【转】Kconfig,Makefile 和 .config

    原文网址:http://blog.csdn.net/nxh_love/article/details/11846861 最新在做Sensor驱动移植的时候,发现了Android driver 中有Kc ...

  7. Linux/Android Kconfig Makefile defconfig 和 .config关系

    点击打开链接 在进行Android L->M升级时遇到打印: Root cause is probably that a dependancy declared in Kconfig is no ...

  8. Android驱动中的Kconfig文件与Makefile文件

    内核源码树的目录下都有两个文档Kconfig(2.4版本是Config.in)和Makefile.分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文 ...

  9. 6-uboot relocation介绍

    [uboot] (番外篇)uboot relocation介绍 2016年11月05日 21:29:22 阅读数:1844 以下例子都以project X项目tiny210(s5pv210平台,arm ...

  10. linux kernel的virtual kernel memory layout介绍(aarch64)

    相关文件: memory.h pgtable.h fixmap.h page.h 1.重要的配置 我们就以VA_BITS=48,PAGE_SIZE=4k来介绍 (1).(VA_BITS) (arch/ ...

最新文章

  1. linux查看当前的工作目录,Linux-查看当前工作目录(pwd)
  2. 移动端html模板卡片列表效果,移动手机Material Design风格信息卡片UI设计
  3. 数字化转型,赋能新零售解决方案介绍
  4. RNN-LSTM循环神经网络-03Tensorflow进阶实现
  5. ESP32又有新玩法了,启明云端把它带入到冷门行业--测试治具
  6. 良心之作----centos6.5下安装svn客户端报错
  7. 入门基础-VC网络编程入门
  8. 王道计算机网络 网络层整理 超详细版
  9. 云栖专辑| 阿里毕玄:程序员的成长路线
  10. 哪里可以学3D次世代角色建模?具体学什么东西?
  11. 《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·002【SQL介绍、数据库的CRUD操作(DDL语句)】
  12. erp沙盘采购总监的心得_经验分享 让ERP系统操作少走冤枉路
  13. automake连载--Linux下使用autoconfig automake进阶
  14. 【预测模型】基于BP神经网络实短时交通流预测matlab代码
  15. 推荐姊妹篇:搜索中的深度匹配模型
  16. 水仙花数n位c语言程序,水仙花数C语言的
  17. suse linux raid驱动,安装SuSE使用嵌入式SATA控制器用常见设备使用情况的megaSR swraid驱动程序...
  18. WPF界面美化(整体作用到控件),一步步教你使用FirstFloor.ModernUI
  19. Darknet - 模型 (.weights) 重命名
  20. 简单了解ACL与NAT!

热门文章

  1. redis视频教程 java_Redis高级运用视频教程
  2. 苹果怎么使用计算机,苹果系统电脑怎么用_超详细mac新手教程-win7之家
  3. 服务器IO测试(Iozone使用)
  4. qlistview 自定义控件_qlistview使用自定义模型的复选框
  5. windows11彻底关闭Microsoft Defender 安装注册机
  6. 多种企业常用网管软件介绍及配置说明(带视频)
  7. 红米k20pro短接9008_拆解红米Redmi K20Pro,内部结果一目了然
  8. 阿里P8工程师强烈推荐,60本工程师必备读本
  9. 龙威PS305D维修案例收集
  10. Remote-SSH 安装教程