linux kernel menuconfig kconfig makefile

news2024/11/24 9:12:14

概述


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_ITEM1
    bool
    prompt "demonstate item1 for bool learning"

config KCONFIG_DEMO_ITEM2
    string
    prompt "demonstate item2 for string learning"

config KCONFIG_DEMO_ITEM3
    hex
    prompt "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可以认为是上一节 config 中的升级版。首先它自己也是一个正常的配置项,通过自己的配置值来决定另外一组配置项是否作为子菜单的形式显示出来并供用户配置。

menuconfig KCONFIG_DEMO_MENUCONFIG1
    bool
    prompt "menuconfig learning"

if KCONFIG_DEMO_MENUCONFIG1

config MENUCONFIG_SUBITEM1
    bool
    prompt "menuconfig subitem1"

config MENUCONFIG_SUBITEM2
    bool
    prompt "menuconfig subitem2"

endif
  • 第一行通过menuconfig配置了一个bool类型的配置项。

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

在这里插入图片描述

 在这里插入图片描述

 

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

语法:

menu "menu learning"

config MENU_SUBITEM1
        bool
        prompt "subitem1"

config MENU_SUBITEM2
        bool
        prompt "subitem2"

config MENU_SUBITEM3
        bool
        prompt "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 
        bool
        prompt "choice learning"

config CHOICE_ITEM1
        bool
        prompt "choice1"

config CHOICE_ITEM2
        bool
        prompt "choice2"

config CHOICE_ITEM3
        bool
        prompt "choice3"
endchoice

make menuconfig如下:

在这里插入图片描述

 

if与depends on模块

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

config MY_CONFIG1
        bool
        prompt "my config1"

config MY_CONFIG2
        bool
        prompt "my config2" if MY_CONFIG1

config MY_CONFIG3
        bool
        prompt "my config3"
        depends on MY_CONFIG2

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

在这里插入图片描述

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

config KCONFIG_DEMO_ITEM1
    bool
    prompt "demonstate item1 for bool learning"

config KCONFIG_DEMO_ITEM2
    string
    prompt "demonstate item2 for string learning"

config KCONFIG_DEMO_ITEM3
    hex
    prompt "demonstate item3 for hex learning"

menuconfig KCONFIG_DEMO_MENUCONFIG1
    bool
    prompt "menuconfig learning"

if KCONFIG_DEMO_MENUCONFIG1

config MENUCONFIG_SUBITEM1
    bool
    prompt "menuconfig subitem1"

config MENUCONFIG_SUBITEM2
    bool
    prompt "menuconfig subitem2"

endif

menu "menu learning"

config MENU_SUBITEM1
        bool
        prompt "subitem1"

config MENU_SUBITEM2
        bool
        prompt "subitem2"

config MENU_SUBITEM3
        bool
        prompt "subitem3"

endmenu



choice 
        bool
        prompt "choice learning"

config CHOICE_ITEM1
        bool
        prompt "choice1"

config CHOICE_ITEM2
        bool
        prompt "choice2"

config CHOICE_ITEM3
        bool
        prompt "choice3"
endchoice


config MY_CONFIG1
        bool
        prompt "my config1"

config MY_CONFIG2
        bool
        prompt "my config2" if MY_CONFIG1

config MY_CONFIG3
        bool
        prompt "my config3"
        depends on MY_CONFIG2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/540387.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot 数据库操作Druid和HikariDataSource

目录 Spring Boot 数据库操作 应用实例-需求 创建测试数据库和表 进行数据库开发, 在pom.xml 引入data-jdbc starter 参考官方文档 需要在pom.xml 指定导入数据库驱动 在application.yml 配置操作数据源的信息 创建bean\Furn.java 测试结果 整合Druid 到…

六、easyUI中的window(窗口)组件

1.window(窗口)组件的概述 窗口控件是一个浮动和可拖拽的面板,它可以用作应用程序窗口。默认情况下,窗口可以移动,调整大小和关闭。它的内容也可以被定义为静态HTML或要么通过Ajax动态加载 2.window(窗口&…

MySQL-备份+日志:介质故障与数据库恢复

MySQL-备份日志:介质故障与数据库恢复 第1关:备份与恢复任务描述相关知识MySQL的恢复机制MySQL的备份与恢复工具编程要求代码参考 第2关 备份日志:介质故障的发生与数据库的恢复任务描述相关知识编程要求测试说明代码参考 第1关:备…

《分布式微服务电商源码》-项目简介

1.常见的电商模式 市面上有 5 种常见的电商模式 B2B、B2C、C2B、C2C、O2O 1.1.B2B 模式 B2B(Business to Business),是指商家和商家建立的商业关系,如阿里巴巴. 1.2.B2C 模式 B2C(Business to Consumer) 就是我们经常看到的供应商直接把商品买个用户&a…

057:cesium设置纯颜色材质

第057个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置纯颜色的材质,颜色的表达方式可以参考这篇文章 Cesium七种方法设置颜色 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共87行)相关API参考:专…

用友BIP新零售产品发布,与零售企业共创新未来

随着数智化时代的到来,零售企业不断面临着更多的挑战和机遇。为了满足消费者多元化的需求,零售企业需要采用多种方式来提高竞争力,如多渠道销售、线上线下融合、数智化运营、个性化营销和无缝化体验等。用友BIP新零售为零售企业提供了数智化转…

Jenkins的持续集成与持续部署

系统总体架构 Gitlab Gitlab是一款主要用于代码管理的工具,相较于GitHub,可以自己搭建服务器,这可以避免因为网络速度慢导致部署效率低下,同时,自己搭建服务器,安全性更高。Jenkins Jenkins主要用于管理版本…

改图片分辨率:提升图像质量的关键步骤

无论您是一名摄影师、设计师,还是一个爱好者,改变图片分辨率都是必不可少的工作。在本文中,我们将介绍改图片分辨率的作用以及它在哪些场景下使用。 改图片分辨率介绍 图片分辨率是指图像中所包含的像素数量,通常以“每英寸像素…

threejs 相机OrbitControls常用方法及属性

相机控件OrbitControls 通过OrbitControls可以对三维场景进行缩放、平移、旋转,本质上改变的不是场景,而是相机的参数,相机的位置角度不同,同一个场景的渲染效果是不一样,比如相机围绕着一个场景旋转,就像…

有哪些工具软件一旦用了就离不开?

💖前言 目前,随着科技的快速发展,电脑已经进入了许许多多人的生活 ,在平日的学习、工作和生活里,我们会用的各种各样的强大软件。市面上除了某些大公司开发在强大软件,还有各路大神开发具有某些功能的强大…

nodejs+vue网上课程在线教学网站平台a53y0

(1) vue引入elementui 1.使用npm安装element-ui npm i element-ui -S 2.在main.js中导入使用vue import element-ui/lib/theme-chalk/index.css //别忘了导入样式 import ElementUI from element-ui Vue.use(ElementUI) 后端:java(springbootssm)/python/php/node…

MySQL入门到精通——运维篇(基础篇——进阶篇——运维篇)本文以MySQL8.0版本以上为例

文章目录 前言MySQL——运维篇一、日志1.日志-错误日志2.日志-二进制日志3.日志-查询日志4.日志-慢查询日志 二、主从复制1.主从复制-概述2.主从复制-原理3.主从复制-搭建3.1.主从复制-搭建-主库配置3.2.主从复制-搭建-从库配置3.2.主从复制-搭建-测试 三、分库分表1.分库分表-…

Nacos简介和安装

1.Nacos简介 1.1.为什么叫Nacos 前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service。 1.2.是什么 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos: Dynamic Naming and Configuration ServiceNacos就是注册中心&am…

Fiddler 到底能做什么?一篇文章给你详细介绍

Fiddler是检查 Http 流量的最流行的工具之一。此工具可帮助我们非常轻松地测试 REST API / SOAP Web 请求。 题主的问题:Fiddler 到底能做什么。仔细思考,其实有两层意思: 第一层:Fiddler工具的应用范围 第二层:Fiddl…

手搓哈希表

手搓哈希 哈希概念哈希冲突为什么会有哈希冲突的产生?常见的哈希函数 如何解决哈希冲突?闭散列闭散列的简单模拟实现插入查找删除 总代码开散列开散列的模拟实现插入删除查找 存在的问题迭代器 开散列总的代码 哈希概念 顺序结构以及平衡树中,元素关键码…

在研制带处理器的电子产品时,如何提高抗干扰能力和电磁兼容性?

一、下面的一些系统要特别注意抗电磁干扰 1、微控制器时钟频率特别高,总线周期特别快的系统。 2、系统含有大功率,大电流驱动电路,如产生火花的继电器,大电流开关等。 3、含微弱模拟信号电路以及高精度A/D变换电路的系统。 二、…

GPU物理位置查询:从nvidia编号到物理位置

supermicro AS -4125GS-TNRT 服务器GPU出现问题,有几张GPU速度较慢。需要确定其物理位置,具体流程如下: 1 GPU编号与BUS_ID对应关系 使用nvidia-smi即可查看,如下所示:![在这里插入图片描述](https://img-blog.csdnimg.cn/3807d…

分布式锁解决方案_基于Redisson实现的分布式锁实现

Redisson介绍: https://github.com/redisson/redisson/wiki Redisson - 是一个高级的分布式协调Redis客服端,能帮助用户在分布式环境中轻松实现一些Java的对象,Redisson、Jedis、Lettuce是三个不同的操作 Redis 的客户端,Jedis、…

常见的8种用户需求评估方法

1、人性法 在评估用户需求时,需要判断这个需求所实现的功能,是否符合人性,与哪几种人性相匹配,如果非常匹配则值得做。当然并不是需求反应的人性越多越好,需要根据团队实际资源做到极致。 如格林人性法则包括&#xff…

【已解决】Arduino编译错误error: ordered comparison of pointer with integer zero的解决方法

在使用Arduino的资源库对STM32编程时,出现: error: ordered comparison of pointer with integer zero (byte* {aka unsigned char*} and int) 编译错误的解决方法。 Arduino因其开源和易用性,丰富的三方资源,受到很多人的喜欢…