您现在的位置是:首页 >技术教程 >linux kernel menuconfig kconfig makefile网站首页技术教程

linux kernel menuconfig kconfig makefile

南七技校 2024-06-17 11:26:50
简介linux kernel menuconfig kconfig makefile

概述


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

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。