概述

menuconfig是Linux平台用于管理代码工程、模块及功能的实用工具。

menuconfig的使用方式通常是在编译系统之前在系统源代码根目录下执行make menuconfig命令从而打开一个图形化配置界面,再通过对各项的值按需配置从而达到影响系统编译结果的目的。

Nuttx的menuconfig配置界面如下图所示:

menuconfig配置后的结果将会保存在对应模块根目录下的 .config 文件中。在编译时会加载.config文件中的配置项来决定编译结果。

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

总得来说,menuconfig是Linux平台基于Kconfig用于管控代码实用工具。

常用的Kconfig语法

Kconfig,其实就是一个位于要被控制的程序模块源码目录下的文件名为 Kconfig 的普通的文本文件而已。一般来讲,都是在各个程序或模块的根目录下创建一个Kconfig用于记录所有配置该程序/模块的配置项。

然后再在其父级目录的Kconfig中通过souce code/Kconfig的形式将其引入到menuconfig系统中去。

Kconfig常用的几个知识点有以下五个:

  • config模块
  • menuconfig模块
  • menu模块
  • choice模块
  • if 与 depends on 模块

config模块

config 配置项名配置项类型配置项提示语其它选项
  • 配置项名表示最终保存在 .config 文件中的键值对项的键名,通常用全大写和单词之间以下划线隔开的形式书写。
  • 配置项类型就是基础类型,可选的类型有:bool、tristate、string、hex、int。
  • bool 表示布尔型在.config中以 y 和 n 表示。
  • tristate是三态类型,通常用在内核驱动控制中。在.config中以 y 、n和m表示。y表示将驱动编译进内核镜像,n表示不编译,m表示将驱动编译为ko形式。
  • string是普通字符串类型,直接将在menuconfig图形界面中用户输入的值原样保存在.config中。
  • hex是十六进制形式,只能输入0~F的内容。
  • int是十进制整数形式,只能输入数字。
  • 配置项提示语以prompt开头,后跟一个空格字符,然后就是用双引号包围的文字提示语。

如下定义在Nuttx根目录下创建menu-config/Kconfig:

config KCONFIG_DEMO_ITEM1boolprompt "demonstate item1 for bool learning"config KCONFIG_DEMO_ITEM2stringprompt "demonstate item2 for string learning"config KCONFIG_DEMO_ITEM3hexprompt "demonstate item3 for hex learning"

然后再其跟目录下的Kconfig中将此Kconfig文件加载进来:

# menu "Applications Settings"
source "menu-config/Kconfig"

然后执行make menuconfig

最后就多出来三行:

CONFIG_KCONFIG_DEMO_ITEM1=y
CONFIG_KCONFIG_DEMO_ITEM2="demo"
CONFIG_KCONFIG_DEMO_ITEM3=0xEF

menuconfig模块

menuconfig可以认为是上一节 config 中的升级版。首先它自己也是一个正常的配置项,通过自己的配置值来决定另外一组配置项是否作为子菜单的形式显示出来并供用户配置。

menuconfig KCONFIG_DEMO_MENUCONFIG1boolprompt "menuconfig learning"if KCONFIG_DEMO_MENUCONFIG1config MENUCONFIG_SUBITEM1boolprompt "menuconfig subitem1"config MENUCONFIG_SUBITEM2boolprompt "menuconfig subitem2"endif
  • 第一行通过menuconfig配置了一个bool类型的配置项。

  • 如果选中了menuconfig learning,就会出现下面第二张图的自选项,否则是没有的:


menu模块

如果说上一节的menuconfig是一个带了菜单功能的配置项,那么这个 menu 是一个纯粹的菜单项了。menu本身不可配置,只是用来标记其内部可能拥有子配置项。

语法:

menu "menu learning"config MENU_SUBITEM1boolprompt "subitem1"config MENU_SUBITEM2boolprompt "subitem2"config MENU_SUBITEM3boolprompt "subitem3"endmenu

同样添加这段代码到menu-config/Kconfig文件,执行menu config:

进入子选项:

menu项在.config中会将菜单提示语作为注释一并写入,前面几个部分在.config中的代码如下所示:

CONFIG_KCONFIG_DEMO_ITEM1=y
CONFIG_KCONFIG_DEMO_ITEM2="demo"
CONFIG_KCONFIG_DEMO_ITEM3=0xEF
CONFIG_KCONFIG_DEMO_MENUCONFIG1=y
# CONFIG_MENUCONFIG_SUBITEM1 is not set
# CONFIG_MENUCONFIG_SUBITEM2 is not set#
# menu learning
#
CONFIG_MENU_SUBITEM1=y
CONFIG_MENU_SUBITEM2=y
# CONFIG_MENU_SUBITEM3 is not set

choice模块

choice是单选模块。具体语法如下所示:

choice boolprompt "choice learning"config CHOICE_ITEM1boolprompt "choice1"config CHOICE_ITEM2boolprompt "choice2"config CHOICE_ITEM3boolprompt "choice3"
endchoice

make menuconfig如下:

if与depends on模块

if 与 depends on 模块都属于 config 配置项中的”其它选项“。它们的作用是等价的,都是根据指定的配置项是否被配置来决定本配置项的显示与否。

config MY_CONFIG1boolprompt "my config1"config MY_CONFIG2boolprompt "my config2" if MY_CONFIG1config MY_CONFIG3boolprompt "my config3"depends on MY_CONFIG2

选中my config1后出现my config2,选中my config2后出现my config3:

最后,完整的Kconfig文件内容如下:

config KCONFIG_DEMO_ITEM1boolprompt "demonstate item1 for bool learning"config KCONFIG_DEMO_ITEM2stringprompt "demonstate item2 for string learning"config KCONFIG_DEMO_ITEM3hexprompt "demonstate item3 for hex learning"menuconfig KCONFIG_DEMO_MENUCONFIG1boolprompt "menuconfig learning"if KCONFIG_DEMO_MENUCONFIG1config MENUCONFIG_SUBITEM1boolprompt "menuconfig subitem1"config MENUCONFIG_SUBITEM2boolprompt "menuconfig subitem2"endifmenu "menu learning"config MENU_SUBITEM1boolprompt "subitem1"config MENU_SUBITEM2boolprompt "subitem2"config MENU_SUBITEM3boolprompt "subitem3"endmenuchoice boolprompt "choice learning"config CHOICE_ITEM1boolprompt "choice1"config CHOICE_ITEM2boolprompt "choice2"config CHOICE_ITEM3boolprompt "choice3"
endchoiceconfig MY_CONFIG1boolprompt "my config1"config MY_CONFIG2boolprompt "my config2" if MY_CONFIG1config MY_CONFIG3boolprompt "my config3"depends on MY_CONFIG2

参考

Linux下menuconfig与Kconfig基础知识概

menuconfig与Kconfig入门学习相关推荐

  1. RT-Thread 入门学习笔记 - 解决RT_ASSERT失效的问题

    RT-Thread 入门学习笔记 - menuconfig Kconfig的使用 RT-Thread 入门学习笔记 - 熟悉动态内存申请与释放 RT-Thread 入门学习笔记 - 查看线程栈的地址 ...

  2. menuconfig和Kconfig、.config的关系

    以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 1.menuconfig读取Kconfig文件的项目内容 (1)menuconfig软件只负责提供menuconfig工作的一套逻辑: (2 ...

  3. ESP32入门学习笔记

    概述 ESP32-DevKitC V4 是 乐鑫 一款基于 ESP32 的小型开发板,板上模组的绝大部分管脚均已引出,开发人员可根据实际需求,轻松通过跳线连接多种外围器件,或将开发板插在面包板上使用. ...

  4. python速成要多久2019-8-28_2019最全Python入门学习路线,不是我吹,绝对是最全

    近几年Python的受欢迎程度可谓是扶摇直上,当然了学习的人也是愈来愈多.一些学习Python的小白在学习初期,总希望能够得到一份Python学习路线图,小编经过多方汇总为大家汇总了一份Python学 ...

  5. MAYA 2022基础入门学习教程

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,48.0 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.41 GB |时长:4.5小时 包含 ...

  6. 3dmax Vray建筑可视化入门学习教程

    面向初学者的3Ds Max Vray最佳Archviz可视化课程 从安装到最终图像的一切都将从头开始教授,不需要任何经验 大小解压后:3.25G 时长4h 6m 1280X720 MP4 语言:英语+ ...

  7. Blender 3.0基础入门学习教程 Introduction to Blender 3.0

    成为Blender通才,通过这个基于项目的循序渐进课程学习所有主题的基础知识. 你会学到什么 教程获取:Blender 3.0基础入门学习教程 Introduction to Blender 3.0- ...

  8. Maya游戏角色绑定入门学习教程 Game Character Rigging for Beginners in Maya

    准备好开始为游戏制作自己的角色动画了吗? 你会学到什么 了解Maya的界面 优化并准备好你的模型,为游戏做准备 了解关节以及如何使用它们来构建健壮的角色骨骼,以便在任何游戏引擎中制作动画 了解IK和F ...

  9. 三维地形制作软件 World Machine 基础入门学习教程

    <World Machine课程>涵盖了你需要的一切,让你有一个坚实的基础来构建自己的高质量的电影或视频游戏地形. 你会学到什么 为渲染或游戏开发创建高分辨率.高细节的地形. 基于Worl ...

最新文章

  1. Nat. Mach. Intell. | 人工智能的透明度和可重复性
  2. css float left right 中间空间城数据无法显示
  3. led灯条串联图_飞利浦32寸LED液晶显示器故障维修记
  4. java的静态变量怎么赋值_java static变量可以赋值吗?
  5. java获取服务端mask_Java代码获取服务器所装office版本
  6. 梯度消失和梯度爆炸_梯度消失梯度爆炸-Gradient Clip
  7. WSDM2022 | 数据困境: 我们究竟有多了解推荐系统数据集?(附视频、论文及代码)...
  8. 计算机基础与c语言试题及答案,2017年9月计算机二级C语言基础试题及答案
  9. 有道云笔记Markdown图片链接解决办法
  10. comboxedit不可输入_javafx combobox在edit状态下无法选择
  11. 干货分享|Compare essay的写作方法
  12. java判断移动端和pc端_Java判断PC端还是移动端
  13. element tabs 的基础类型下划线不显示
  14. 美颜换妆之BeautyGAN
  15. java aes ecb_java使用AES加密解密 AES-128-ECB加密
  16. 5G网络的NSA与SA
  17. OpenCV for Python之图像RIO与泛洪填充
  18. Apollo星火计划学习笔记——第七讲自动驾驶规划技术原理1
  19. python外星人入侵游戏代码大全-Python外星人入侵游戏编程完整版
  20. 使用junction为itunes备份目录创建硬链接

热门文章

  1. Linux FTP搭建及其使用
  2. 6377. 【NOIP2019模拟2019.10.05】幽曲[埋骨于弘川]
  3. matlab2010a在mbuild时找不到vs2010的解决办法
  4. 我是如何从桌面维护转到Linux系统运维
  5. react-grid-layout 使用说明
  6. WADL:REST对WSDL的诠释
  7. —不积硅步,无以至千里
  8. 选择恐惧症福音!教你三种思维方式,像计算机一样做出最优决策
  9. SMART触摸屏可以连接哪些PLC以及可以连接几台PLC?
  10. Android自定义schema,android hybird 实现:自定义schema