前言
Kconfig 的作用就是為了讓使用者配置核心,在 Kconfig 中定義了一些變數,使用者通過設定變數的值來選擇如何個性化自己的系統核心。其和 makefile 往往需要配合使用,來組織編譯大型工程。這裡我們從一個 DEMO 講起,然後介紹 Kconfig 具體語法。
1. 安裝 kconfig
yaourt -S kconfig-frontends
2. 克隆一個 demo
➜ git clone https://github.com/skif-web/demo-kbuild.git
➜ demo-kbuild git:(master) ls
getLast.sh KConfig README.md
3. 執行 kconfig
執行 kconfig-mconf KConfig
會彈出互動頁面,使用者可以做一些選擇,然後會在同級目錄下自動生成一個 .config
檔案,表示使用者的選擇
4. 原始碼解析
4.1 選擇題目設計模板
下面是選擇型別的題目模板:
choice SELECT_DESTINATION # 選擇
prompt "Select data destination" # 選項的題幹
default DESTINATION_TTY # 預設選項
config SELECT_DESTINATION_TTY # 選項 SELECT_DESTINATION_TTY
bool "show data in console"
config SELECT_DESTINATION_FILE # 選項 SELECT_DESTINATION_FILE
bool "save data to file"
endchoice
對應的 GUI 為:
4.2 填空題目設計模板
下面是填空型別的題目模板:
config SELECT_DESTINATION_FILE_FILENAME # 填空
string "destination file" # 填空的題幹
depends on SELECT_DESTINATION_FILE # 這個填空題是否會出現,取決於上面的選擇是否選擇了 SELECT_DESTINATION_FILE
default "last.log" # 預設填空答案
help
Write destination file with relative or full path
對應的 GUI 為:
4.3 判斷題目設計模板
下面是判斷型別的題目模板:
config SHOW_ONLY_CURRENT_USER
bool "show data only for current user" # bool 是否選擇
default y # 預設選項 yes
help # 幫助內容
script will get data only for currewnt user
對應的 GUI 為:
5. 產物解析
生成的 .config
為:
➜ demo-kbuild git:(master) ✗ cat .config
#
# Automatically generated file; DO NOT EDIT.
# Configuration
#
# CONFIG_SELECT_DESTINATION_TTY is not set
CONFIG_SELECT_DESTINATION_FILE=y
CONFIG_SELECT_DESTINATION_FILE_FILENAME="last.log"
CONFIG_SHOW_ONLY_CURRENT_USER=y
OR
➜ demo-kbuild git:(master) ✗ cat .config
#
# Automatically generated file; DO NOT EDIT.
# Configuration
#
CONFIG_SELECT_DESTINATION_TTY=y
# CONFIG_SELECT_DESTINATION_FILE is not set
# CONFIG_SHOW_ONLY_CURRENT_USER is not set # bool 型別不選會這樣顯示,而不是 N !!!
6. 產物使用
克隆下來的倉庫資料夾下有個 getLast.sh
小指令碼,該指令碼展示瞭如何使用 .config
:
➜ demo-kbuild git:(master) ✗ cat getLast.sh
#!/bin/bash
# script running script
workDir=`dirname "$(readlink -f "$0")"`
# future command to run
cmdline="last "
# read config
source $workDir/.config || { echo "ERROR! Unable to read config"; exit 1; }
# if select
if [ "x$CONFIG_SHOW_ONLY_CURRENT_USER" == "xy" ]; then
currentUser=`whoami`
cmdline="$cmdline $currentUser"
fi
# now run command. If destination is file - ise redirect
if [ "x$CONFIG_SELECT_DESTINATION_FILE" == "xy" ]; then
$cmdline > $CONFIG_SELECT_DESTINATION_FILE_FILENAME
else
$cmdline
fi
這個例子非常經典,用 source
載入 .config
,然後用 if [ "x$CONFIG_SHOW_ONLY_CURRENT_USER" == "xy" ]
進行優雅的判斷。
7.Kconfig語法簡介
!!! 這裡直接用園友黃超樹的總結《Kconfig語法簡介》
每個選項都有其自己的依賴關係。這些依賴關係決定了選項是否是可見的。父選項可見,子選項才能可見。
7.1 單一選項 config
原則:每一個config就是一個選項,最上面跟著控制控制程式碼,下面則是對這個選項的配置,如選項名是什麼,依賴什麼,選中這個後同時會選擇什麼。
一個配置選項定義可以是下面的形式:
config MODVERSIONS
bool "Set version information on all module symbols"
depends MODULES
help
Usually, modules have to be recompiled whenever you switch to a new
kernel. ...
-
"config" ,配置選項。 而它下面的幾行定義了該配置選項的屬性。
屬性可以是該配置選項的型別,輸入提示(input prompt),依賴關係,幫助資訊和預設值。
配置選項可以用相同的名字定義多次,但每個定義只能有一個輸入提示並且型別還不能衝突。
-
"bool" ,型別定義 :"bool"/"tristate"/"string"/"hex"/"int"
每個配置選項都必須指定型別。有兩個基本型別:tristate 和 string,其他型別都是基於這兩個基本型別。
型別定義可以用輸入提示,所以下面的兩個例子是等價的: bool "Networking support" 和 bool prompt "Networking support"
-
"depends on", 依賴關係:"depends on"/"requires"
為選單選項定義依賴關係。如果定義了複雜的邏輯依賴關係系,它們之間用 '&&','||','('與')' 間隔。
依賴關係也可以應用到該選單中所有的其它選項(同樣接受一if表示式),所以下面的兩個例子是等價的:
bool "foo" if BAR default y if BAR 和 depends on BAR bool "foo" default y
-
"select", 反向依賴關係,語法為:**"select"
["if" ] 反向依賴只能用在 boolean 或 tristate 選項上。
當前選項選中後則select後指定的選項自動被選擇。
儘管普通的依賴關係可以降低一選項的上限,反向依賴能將這一限制降的更低。
當前選單選項的值是symbol的最小值。如果symbol被選擇了多次,上限就是其中的最大值。
-
"default", 預設值:"default"
["if" ] 一個配置選項可以有任意多個預設值。如果有多個預設值,那麼只有第一個被定義的值是可用的。
預設值並不是只限於應用在定義他們的選單選項。這就意味著預設值可以定義在任何地方或被更早的定義覆蓋。
如果使用者沒有設定(通過上面的輸入提示),配置選項的值就是預設值。如果可以顯示輸入提示的話,就會把預設值顯示給使用者,並可以讓使用者進行修改。
預設值的依賴關係可以用 "if" 新增。(可選項)
7.2 選單 menu
menu條目用於生成選單,格式如下:
menu "Floating poing emulation"
config FPE_NWFPE
..............
config FPE_NWFPE_XP
.............
endmenu
menu之後的字串是選單名,menu和endmenu之間有很多config條目(待會說介紹config條目),在配置介面上會出現如下字樣的選單,移動游標選中它之後按回車進入,就會看到config條目定義的配置選項。
Floating point emulation --->
[] FPE_NWFPE
[] FPE_NWFPE_XP
7.3 選擇框 choice
choice條目將多個類似的配置選項組合在一起,供使用者單選或者多選。
choice
prompt "arm system type"
default arch_versatile
config arch_aarc200
...
config arch_integrator
...
endchoice
prompt後面跟的是提示資訊,游標選中它後按Enter鍵進入,就可以看到多個config條目定義的配置選項。
條目中定義的變數型別只能有兩種:bool和tristate,不能同時有這兩種型別的變數。
對於bool型別的choice條目,只能在多個選項中選擇一個;
對於tristate型別的choice條目,要麼就把多個選項都設為m;要麼就像bool型別的choice條目一樣,只能選擇一個。
7.4 提示文字 comment
comment條目定義了一些幫助資訊,它在配置過程中出現在介面的第一行;並且這些幫助資訊會出現在配置檔案中,格式如下:
comment <prompt>
<comment options>
例如:
menu "floating point emulation"
comment "At least one emultaion must be selected"
...
7.5 引入配置 source
source條目用於讀入另一個Kconfig檔案,格式如下:
source <promt>
例如:
source "net/Kconfig"
連結
: ** 在本部落格的編譯系列中,有很多關於自動化構建編譯的博文:https://www.cnblogs.com/zjutlitao/category/759821.html **