Linux下menuconfig與Kconfig基礎知識概要

2021-06-30


 

 一、簡介

 

menuconfig是Linux平臺用於管理代碼工程、模塊及功能的實用工具。上至決定某一程序模塊是否編譯,下到某一行具體的代碼是否需要編譯以及某個項的值在本次編譯時該是什麼都可由menuconfig來定義。

 

menuconfig的使用方式通常是在編譯系統之前在系統源代碼根目錄下執行 make menuconfig 命令從而打開一個圖形化配置界面,再通過對各項的值按需配置從而達到影響系統編譯結果的目的。一個典型的 menuconfig 配置界面如下圖所示:

 

 

menuconfig 配置後的結果將會保存在對應模塊根目錄下的 .config 文件中。如kernel源碼根目錄或應用程序源碼根目錄。Linux在編譯系統鏡像時會加載這些 .config 文件中的配置項來決定編譯結果。

 

menuconfig 其實只能算是一個“前端”,用於支撐它、決定它擁有什麼配置項的“後端”則被稱爲 Kconfig。

 

Kconfig 嚴格來講是一種編程語言,它擁有自己的語法及結構。正是這些語法和結構組成了menuconfig在用戶眼前不同的表現形式。

 

不過幸好,Kconfig這門“編程語言”的內容很少,通常只需花上半個小時就能掌握大半了。而這篇博文主要也是在介紹Kconfig的知識。

 

總得來說,menuconfig是Linux平臺基於Kconfig用於管控代碼實用工具。

 

 

二、常用的Kconfig語法

 

Kconfig的語法及代碼結構非常簡單。本博文只介紹Kconfig中常用的幾個知識點。更詳盡的內容可以參閱Linux官方提供的幫助文檔。這份文檔們於內核源碼目錄下的 ./Document/kbuild/kconfig-language.txt 。本文也已將此文檔作爲附件貼在文末了。

 

所謂 Kconfig,其實就是一個位於要被控制的程序模塊源碼目錄下的文件名爲 Kconfig 的普通的文本文件而已。

 

Kconfig文件在Linux系統中的數量是不確定的。我們既可以將所有配置項寫在一個Kconfig文件上,又可以分模塊分功能將它們分別寫在不同的Kconfig文件中。一般來講,都是在各個程序或模塊的根目錄下創建一個Kconfig用於記錄所有配置該程序/模塊的配置項。然後再在其父級目錄的Kconfig中通過 souce code_demo/Kconfig 的形式將其引入到menuconfig系統中去。

 

Kconfig常用的幾個知識點有以下五個:

1、config模塊

2、menuconfig模塊

3、menu模塊

4、choice模塊

5、if 與 depends on 模塊

 

2.1、config模塊

config模塊是Kconfig最基礎最重要的知識點。一個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開頭,後跟一個空格字符,然後就是用雙引號包圍的文字提示語。作用就是在menuconfig圖形界面中作爲配置項的提示語。如下圖所示:

 

 其它選項這裏暫且不管。

 

下面我們嘗試編寫一個包含了 config 內容的Kconfig。

 

在目錄menu_demo下新建一個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文件加載進來:

#
# For a description of the syntax of this configuration file,
# see scripts/kbuild/config-language.txt.
#
mainmenu "Users Configuration"

# menu "Applications Settings"

source "menu_demo/Kconfig"

 

然後在系統源碼根目錄下執行 make menuconfig 後即可看到我們剛添加進去的幾個配置項了,如下圖所示:

 

 

如果配置項是 bool、tristate 類型,則通過空格鍵來切換它們的選項值。其它類型值則通過回車鍵打開輸入框來鍵入對應的值完成配置。

 

這裏我們將第一項選上,第二項隨意輸入一個字符串,第三項留空,然後一路退出menuconfig並保存,可以看到.config文件關於我們新增的配置項的內容如下所示:

root@ubuntu:~/workspace/rtl8197/rtl819x# head -n 20 users/.config
#
# Automatically generated make config: don't edit
# RLX Linux builder
# Wed Jun 30 21:20:58 2021
#
CONFIG_KCONFIG_DEMO_ITEM1=y
CONFIG_KCONFIG_DEMO_ITEM2="hello world"
CONFIG_KCONFIG_DEMO_ITEM3=

 

此即爲最基礎的配置方式。

 

 

2.2、menuconfig模塊

menuconfig可以認爲是上一節 config 中的升級版。

 

首先它自己也是一個正常的配置項,通過自己的配置值來決定另外一組配置項是否作爲子菜單的形式顯示出來並供用戶配置。具體語法如下所示:

 1 menuconfig KCONFIG_DEMO_MENUCONFIG1
 2     bool
 3     prompt "menuconfig learning"
 4 
 5 if KCONFIG_DEMO_MENUCONFIG1
 6 
 7 config MENUCONFIG_SUBITEM1
 8     bool
 9     prompt "menuconfig subitem1"
10 
11 config MENUCONFIG_SUBITEM2
12     bool
13     prompt "menuconfig subitem2"
14 
15 endif

第一行通過menuconfig配置了一個bool類型的配置項。第五行的if語句暫且不深究,只需要知道它的作用是當第一行的配置項被選中時會將if/endif之內的配置項作爲 KCONFIG_DEMO_MENUCONFIG1 項的子配置項顯示即可。

 

此配置項在menuconfig中的顯示效果及其菜單內部的顯示效果如下面兩張圖所示:

 

 

此時我們選中menuconfig配置項,其子菜單內部的效果如下圖所示:

 

 

2.3、menu模塊

如果說上一節的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

對應的menuconfig顯示效果如下圖所示:

 

 

menu項在.config中會將菜單提示語作爲註釋一併寫入,如下所示:

root@ubuntu:~/workspace/rtl8197/rtl819x# head -n 20 users/.config
#
# Automatically generated make config: don't edit
# RLX Linux builder
# Wed Jun 30 21:45:28 2021
#

#
# menu learning
#
CONFIG_MENU_SUBITEM1=y
# CONFIG_MENU_SUBITEM2 is not set
# CONFIG_MENU_SUBITEM3 is not set

 

 

2.4、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

在menuconfig中的顯示效果如下圖所示:

 

 

 

2.5、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

此配置項表示當第一個配置項爲y時,就可以配置第二個配置項,當第二個配置項爲y時,才能夠配置第三個配置項。其效果如下圖所示:

 

選中第一項,效果如下圖所示:

 

選中第二項,效果如下圖所示:

 

 

 

2.6、其它知識點

1、

配置項提示語其實可以和類型合併在一起從而省略 prompt 關鍵字。以下示例中的兩個配置效果是等價的:

config KCONFIG_DEMO_ITEM1
    bool
    prompt "demonstate item1"

config KCONFIG_DEMO_ITEM2
    bool "demonstate item2"

 

2、

配置項的其它選項中可以通過 default 關鍵字來配置選項的默認值,如:

config MY_CONFIG1
        bool "my config1"
        default y

 

3、

Kconfig中還有一個模塊被稱爲 comment,其作用就是單純的爲在其之後的配置項添加註釋說明。並且會將說明內容一併寫進 .config 文件中。具體效果與上面 2.3 節menu模塊的註釋一樣。其語法如下所示:

comment "I am a comment"

config MY_CONFIG1
        bool
        prompt "my config1"

config MY_CONFIG2
        bool
        prompt "my config2" if MY_CONFIG1

comment "I'm a comment2"

config MY_CONFIG3
        bool
        prompt "my config3" 
        depends on MY_CONFIG2

 

在menuconfig中的效果如下圖所示:

 

在.config中的效果如下所示:

root@ubuntu:~/workspace/rtl8197/rtl819x# head -n20 users/.config
#
# Automatically generated make config: don't edit
# RLX Linux builder
# Wed Jun 30 22:03:01 2021
#

#
# I am a comment
#
CONFIG_MY_CONFIG1=y
CONFIG_MY_CONFIG2=y

#
# I'm a comment2
#
# CONFIG_MY_CONFIG3 is not set

 

4、

在配置項的其它選項中還有一個 help 關鍵字。它的作用是爲配置項添加一個更詳細的說明文檔。用戶在menuconfig圖形配置界面通過 ? 鍵來喚出詳細文檔的展示。

 

其語法如下所示:

config MY_CONFIG1
        bool
        prompt "my config1"
        help
        I am a help document.
        This document can be a long length

 

在menuconfig界面,將光標移動到my config1項上,然後通過 ? 鍵來喚出此幫助文檔的展示窗口,如下圖所示:

 

 

 

以上即是menuconfig與Kconfig中最常用的知識點的簡要介紹了。更多完整詳盡的知識請參閱附件貼出的官方文檔。

 


官方文檔下載鏈接: https://files.cnblogs.com/files/chorm590/kconfig-language.zip

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章