天天看點

[編譯] 10、kconfig 入門指導教程

目錄

  • 前言
  • 1. 安裝 kconfig
  • 2. 克隆一個 demo
  • 3. 運作 kconfig
  • 4. 源碼解析
    • 4.1 選擇題目設計模闆
    • 4.2 填空題目設計模闆
    • 4.3 判斷題目設計模闆
  • 5. 産物解析
  • 6. 産物使用
  • 7.Kconfig文法簡介
    • 7.1 單一選項 config
    • 7.2 菜單 menu
    • 7.3 選擇框 choice
    • 7.4 提示文本 comment
    • 7.5 引入配置 source
  • 連結

Kconfig 的作用就是為了讓使用者配置核心,在 Kconfig 中定義了一些變量,使用者通過設定變量的值來選擇如何個性化自己的系統核心。其和 makefile 往往需要配合使用,來組織編譯大型工程。這裡我們從一個 DEMO 講起,然後介紹 Kconfig 具體文法。

yaourt -S kconfig-frontends
           

➜  git clone https://github.com/skif-web/demo-kbuild.git
➜  demo-kbuild git:(master) ls
getLast.sh  KConfig  README.md
           

運作

kconfig-mconf KConfig

會彈出互動頁面,使用者可以做一些選擇,然後會在同級目錄下自動生成一個

.config

檔案,表示使用者的選擇

下面是選擇類型的題目模闆:

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 為:

下面是填空類型的題目模闆:

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
           

下面是判斷類型的題目模闆:

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	
           

生成的

.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 !!!
           

克隆下來的倉庫檔案夾下有個

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" ]

進行優雅的判斷。

!!! 這裡直接用園友黃超樹的總結《Kconfig文法簡介》

每個選項都有其自己的依賴關系。這些依賴關系決定了選項是否是可見的。父選項可見,子選項才能可見。

原則:每一個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" 添加。(可選項)

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
           

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條目一樣,隻能選擇一個。

comment條目定義了一些幫助資訊,它在配置過程中出現在界面的第一行;并且這些幫助資訊會出現在配置檔案中,格式如下:

comment <prompt>
<comment options>
           

例如:

menu "floating point emulation"
comment "At least one emultaion must be selected"
...
           

source條目用于讀入另一個Kconfig檔案,格式如下:

source <promt>
           

例如:

source "net/Kconfig"
           

  • [1]. kconfig 源
  • [2]. using kconfig for own projects
  • [3]. 對自己的項目使用kconfig
  • [4]. Kconfig文法簡介

: ** 在本部落格的編譯系列中,有很多關于自動化建構編譯的博文:https://www.cnblogs.com/zjutlitao/category/759821.html **