帶你熟悉鴻蒙輕核心Kconfig使用指南

華為雲開發者社群發表於2021-12-28
摘要:本文介紹了Kconfig的基礎知識,和鴻蒙輕核心的圖形化配置及進階的使用方法。

本文分享自華為雲社群《鴻蒙輕核心Kconfig使用筆記》,作者: zhushy。

1、 Kconfig簡介

Kconfig語言定義了一套完整的規則來表述配置項及配置項間的關係,詳細內容可以參考Linux官方文件Kconfig Language,此處不贅述。鴻蒙輕核心使用的是Python的開源三方庫kconfiglib(menuconfig只是其提供的命令之一,相關命令還有genconfig, savedefconfig等等),官方主頁為

1.1 Kconfig和.config檔案

Kconfig是配置項的描述檔案,支援設定配置項及其預設值,依賴關係等等,比如kernel\liteos_a\Kconfig,該檔案還會繼續依賴各個模組的Kconfig檔案。

產品配置檔案,如vendor\hisilicon\hispark_taurus\kernel_configs\debug.config,提供配置項及在產品中這些配置項的設定值,可能和核心配置項的預設取值不一致,屬於產品對核心配置項的定製。這些配置檔案在BUILD.gn或makefile檔案中使用。

另外還會生成一個C語言標頭檔案,提供配置項的巨集定義版,在C語言程式中使用。

1.2 操作簡介

下載OpenHarmony原始碼後,使用hb set設定產品解決方案後,然後在kernel/liteos_m或liteos_a目錄下執行make help可獲得一個總體的幫助說明,如下圖所示:

帶你熟悉鴻蒙輕核心Kconfig使用指南

其中與Kconfig有關的為xxconfig類目標,這類目標通過args接收額外的引數,比如:

make menuconfig args="--help"

通過args="–help"就可以瞭解xxconfig類命令的使用詳細說明。

支援的引數有檔案型別FSTYPE,版本類別TEE、RELEASE等版本,預設為DEBUG版本。還支援通過CONFIG引數指定產品配置檔案路徑,該引數優先順序較高。

注意:OpenHarmony支援使用ninja+gn來編譯構建,核心使用的kconfig配置工具依舊使用makefile進行維護的。

2、 配置核心

liteos_a核心使用Kconfig方式進行配置,在核心目錄kernel/liteos_a下執行make menuconfig等命令即可。liteos_m核心類似,以liteos_a為例進行講解。

需要注意:在操作前,需要使用hb set設定產品,否則會提示:The selected product (None) is not a liteos_a kernel type product. Stop。

2.1 支援的引數

上文,我們知道了make menuconfig支援引數,我們詳細看下程式碼。檔案位置在kernel/liteos_a/Makefile,程式碼片段如下:
如果指定了CONFIG引數,則使用使用者指定的產品配置檔案。如果開啟了TEE,則使用TEE版本的產品配置檔案。如果開啟了RELEASE,則使用release版本產品配置檔案,否則使用debug版本的產品配置檔案。

ifeq ($(TEE:1=y),y)
tee = _tee
endif
ifeq ($(RELEASE:1=y),y)
CONFIG ?= $(PRODUCT_PATH)/kernel_configs/release$(tee).config
else
CONFIG ?= $(PRODUCT_PATH)/kernel_configs/debug$(tee).config
endif

KCONFIG_CONFIG ?= $(CONFIG)

2.2 menuconfig核心配置

使用make menuconfig進行核心配置,Makefile原始碼片段如下:

update_config menuconfig:
    $(HIDE)test -f "$(CONFIG)" && cp -v "$(CONFIG)" .config && menuconfig $(args) && savedefconfig --out "$(CONFIG)"

可以看出,update_config和menuconfig這2個target效果相同,一般使用make menuconfig即可。執行的操作包含如下3個:

  • 判斷產品配置檔案是否存在,如果存在則把配置檔案複製到核心根目錄並命名為.config
  • 展示menuconfig使用者配置介面,供開發者進行核心配置
  • 儲存最小配置到產品產品檔案,可以使用make savedefconfig args="–help"檢視命令的解釋。

設定產品後,要修改產品的.config配置,目前可以在核心目錄下執行make menuconfig,沒有make引數的情況下該命令預設會自動找到你hb set時所選擇的產品的debug.config配置進行menuconfig配置,如果想要修改產品的release.config配置則可以使用引數RELEASE=1。前提是產品有預置release.config配置。同樣的,可以使用引數TEE=1來修改產品的tee版本的.config配置。命令如下:

make update_config RELEASE=1
make update_config TEE=1

另外,如果想手動指定產品配置,而不是自動使用hb set時所選擇的產品的配置,則可以使用CONFIG=/path/to/the/xx.config引數,如:

make update_config CONFIG=../../vendor/hisilicon/hispark_aries/config/release.config

3、Kconfig高階語法

Kconfig大部分工程師都瞭解,快速介紹幾個鴻蒙輕核心中使用到的稍微高階的語法。

  • osource

我們知道kconfig使用source來引用其他kconfig檔案,而osource等於optional source,表示可選的,如果osource指定的kconfig檔案不存在,也不報錯。類似,makefile中的include和-include的差異。

  • rsource

rsource等於 relative source,後面引用的kconfig檔案支援相對路徑。路徑相對於包含rsource語句的kconfig而言。

  • orsource

等於osource+rsource。

kconf的幾個命令如下“

  • –oldconfig

基於提供的.config檔案,根據Kconfig檔案修改配置檔案

  • –silentoldconfig

等同於oldconfig,靜默模式,並修改deps依賴即生成標頭檔案。

  • –olddefconfig

等同於silentoldconfig,對於新符號使用預設值

  • –savedefconfig <file>

把當前最小的配置保持到檔案<file>

4、 hb set、Makefile和kconfig的關係

我們知道在make menuconfig 之前,必須使用hb set設定產品解決方案,下面看下具體是如何做到的。

在kernel\liteos_m\Makefile檔案中,有如下makefile片段。⑴處使用makefile foreach命令和shell sed命令迴圈處理hb set輸出的每一行,把“key:value”格式去掉多餘的[OHOS INFO]字元,把空格轉換為下劃線,即轉換的格式為“key=value”,然後轉換為makefile的變數形式。hb env的輸出、shell命令的輸出見下文。

ohos_device_path=/home/zhushy/openharmony/device/board/fnlink/v200zr/liteos_m
⑵處判斷解析hb set獲取的ohos_kernel核心是否等於liteos_m,如果不等於,則說明未使用hb set設定產品解決解決方案,或者設定的不是liteos_m核心。設定liteos_a\linux核心時,不能在kernel\liteos_m目錄下執行make menuconfig。除了ohos_kernel,生成的變數還有ohos_product、ohos_product_path、ohos_device_path、ohos_device_company等等。

⑶處的makefile片段表明,makefile還有make help裡面沒有提到的引數用法。可以使用make PRODUCT_PATH=XX_Device_Path_XXX等命令來替代使用hb set設定的產品解決方案對應的裝置路徑。⑷處將這些設定匯出為環境變數。在kernel\liteos_m\Kconfig檔案中會使用這些環境變數。

  ohos_kernel ?= liteos_m
⑴  $(foreach line,$(shell hb env | sed 's/\[OHOS INFO\]/ohos/g;s/ /_/g;s/:_/=/g' || true),$(eval $(line)))
⑵  ifneq ($(ohos_kernel),liteos_m)
    $(error The selected product ($(ohos_product)) is not a liteos_m kernel type product)
    endif

⑶  ifeq ($(PRODUCT_PATH),)
    PRODUCT_PATH:=$(ohos_product_path)
    endif

    ifeq ($(DEVICE_PATH),)
    DEVICE_PATH:=$(ohos_device_path)
    endif

    ifeq ($(BOARD_COMPANY),)
    BOARD_COMPANY:=$(ohos_device_company)
    endif
    ...
⑷  export BOARD_COMPANY
    export DEVICE_PATH
    export PRODUCT_PATH
hb env的輸出類似如下:
[OHOS INFO] root path: /home/zhushy/openharmony
[OHOS INFO] board: v200zr
[OHOS INFO] kernel: liteos_m
[OHOS INFO] product: iotlink_demo
[OHOS INFO] product path: /home/zhushy/openharmony/vendor/bestechnic/iotlink_demo
[OHOS INFO] device path: /home/zhushy/openharmony/device/board/fnlink/v200zr/liteos_m
[OHOS INFO] device company: fnlink

執行shell命令hb env | sed 's/\[OHOS INFO\]/ohos/g;s/ /_/g;s/:_/=/g'的輸出如下:

ohos_root_path=/home/zhushy/openharmony
ohos_board=v200zr
ohos_kernel=liteos_m
ohos_product=iotlink_demo
ohos_product_path=/home/zhushy/openharmony/vendor/bestechnic/iotlink_demo
ohos_device_path=/home/zhushy/openharmony/device/board/fnlink/v200zr/liteos_m
ohos_device_company=fnlink

5、 晶片、單板、擴充套件板的Kconfig配置

在執行make menuconfig,進入platform配置路徑後,可以看到如下圖所示的配置介面,支援對擴充套件板、單板、晶片系列等配置。總體感覺這塊後續應該還需要繼續優化調整。hb set設定產品解決方案時,已經確定了晶片和開發板,這些也只能在Kconfig介面上展示,是無法配置的。擴充套件板倒是可以繼續選擇。後續等支援的開發板和解決方案豐富起來時,hb set設定和kconfig介面設定需要更好的來協作。比如hb set可以支援一系列開發板和解決方案,具體的選擇哪些開發板和解決方案,可以kconfig介面上來配置,hb set只提供預設值等等。

帶你熟悉鴻蒙輕核心Kconfig使用指南

我們來看下對應的makefile片段,深入瞭解下Kconfig配置的規則。⑴處可以在開發板裝置下提供下配置選項,如device\board\fnlink\v200zr\liteos_m目錄下維護Kconfig檔案提供可定製的配置項。⑵處提供裝置的公司名稱用來定位構建路徑等,這個配置項config SOC_COMPANY只提供string型別、prompt提示、help幫助資訊等屬性。後續在SOC部分的配置裡,如device\soc\bestechnic\Kconfig.liteos_m.soc,繼續提供這個配置項的預設值default資訊。Kconfig裡,執行對同一個config配置項多處出現。

⑶處設定擴充套件板shields、⑷到⑸用於配置開發板資訊,⑹到⑺用於配置晶片族和晶片資訊。下文分別詳細分析。

   # Device Kconfig import
⑴  osource "$(DEVICE_PATH)/Kconfig"

⑵  config SOC_COMPANY
        string "SoC company name to locate soc build path"
        help
        This option specifies the SoC company name, used to locate the build path for soc. This option is set by the
        SoC's Kconfig file, and should be exactly the same with SoC company path, and the user should generally avoid
        modifying it via the menu configuration.

⑶  orsource "../../device/board/*/Kconfig.liteos_m.shields"

⑷  orsource "../../device/board/$(BOARD_COMPANY)/Kconfig.liteos_m.defconfig.boards"

    choice
        prompt "Board Selection"

    orsource "../../device/board/$(BOARD_COMPANY)/Kconfig.liteos_m.boards"

⑸  endchoice

⑹  orsource "../../device/soc/*/Kconfig.liteos_m.defconfig"

    choice
        prompt "SoC Series Selection"

    orsource "../../device/soc/*/Kconfig.liteos_m.series"

    endchoice

⑺  orsource "../../device/soc/*/Kconfig.liteos_m.soc"

5.1 擴充套件板配置

上面的小節中"../../device/board/*/Kconfig.liteos_m.shields"用於配置擴充套件板資訊,使用*萬用字元匹配所有的擴充套件板,可以將所有擴充套件板配置資訊都載入進來。設計者認為不同單板廠商的擴充套件板可以相容使用吧。還比較有意思的是,Kconfig檔案採用liteos_m.shields作為字尾,一方面指明核心型別,又指明是擴充套件板的配置。fnlink的擴充套件板設定路徑為device\board\fnlink\Kconfig.liteos_m.shields,其內容如下。可以看到又進一步包含shields目錄下面Kconfig.liteos_m.shields。

orsource "shields/Kconfig.liteos_m.shields"

檔案device\board\fnlink\shields\Kconfig.liteos_m.shields的內容如下:⑴處為各個開發板的預設配置項取值,介面上不會顯示。⑵處用於展示,並讓開發者介面上選擇需要的開發板。選擇開發板時,對應的一些依賴配置項會被開啟,可以自行參考檔案device\board\fnlink\shields\v200zr-evb-t1\Kconfig.liteos_m.shield。

⑴  orsource "*/Kconfig.liteos_m.defconfig.shield"

    choice
        prompt "shield Selection"

⑵      orsource "*/Kconfig.liteos_m.shield"

    endchoice

下面附上fnlink擴充套件板目錄shields下相關的檔案資訊:

shields
├── BUILD.gn
├── Kconfig.liteos_m.shields
├── v200zr-evb-t0
│   ├── BUILD.gn
│   ├── Kconfig.liteos_m.defconfig.shield
│   ├── Kconfig.liteos_m.shield
└── v200zr-evb-t1
    ├── BUILD.gn
    ├── Kconfig.liteos_m.defconfig.shield
    ├── Kconfig.liteos_m.shield

5.2 開發板配置

檔案"../../device/board/$(BOARD_COMPANY)/Kconfig.liteos_m.defconfig.boards"提供指定公司的開發板的預設配置項資訊,如檔案device\board\fnlink\Kconfig.liteos_m.defconfig.boards內容如下,又進一步引入公司各個開發板的預設配置項資訊,可以具體檢視檔案device\board\fnlink\v200zr\Kconfig.liteos_m.defconfig.board瞭解下公司開發板預設配置項資訊。預設配置項資訊不會在配置介面上進行展示。

orsource "*/Kconfig.liteos_m.defconfig.board"

檔案"../../device/board/$(BOARD_COMPANY)/Kconfig.liteos_m.boards"提供指定公司開發板的配置項資訊,如檔案device\board\fnlink\Kconfig.liteos_m.boards的配置項如下,又進一步引入公司各個開發板的預設配置項資訊,可以具體檢視檔案device\board\fnlink\v200zr\Kconfig.liteos_m.board瞭解下公司開發板配置項資訊。這些配置項用於在介面上供開發者選擇所需的開發板。因為開發板依賴SoC配置項,SoC在hb set時已經確認,這裡的配置在介面上只起到展示作用,開發者並不能進行選擇配置,這塊預計後續會繼續優化。

orsource "*/Kconfig.liteos_m.board"

device\board\fnlink\v200zr\Kconfig.liteos_m.board內容如下:

config BOARD_V200ZR
    bool "select board V200Z-R"
    depends on SOC_BES2600W

5.3 晶片配置

檔案"../../device/soc/*/Kconfig.liteos_m.defconfig"提供晶片系列的預設配置項資訊,如檔案device\soc\bestechnic\Kconfig.liteos_m.defconfig內容如下,又進一步把各個晶片型號的預設配置資訊引入進來,如device\soc\bestechnic\bes2600\Kconfig.liteos_m.defconfig.series。

rsource "*/Kconfig.liteos_m.defconfig.series"

config HALS_COMMUCATION_WIFI_LITE
    bool "WIFI LITE"
    default y

在"SoC Series Selection"Soc系列選擇項中,使用的"../../device/soc/*/Kconfig.liteos_m.series"會把SoC各個系列的配置項引入進來,如device\soc\bestechnic\Kconfig.liteos_m.series,檔案內容如下,會進一步把檔案device\soc\bestechnic\bes2600\Kconfig.liteos_m.series引入進來。細心的同學可能已經注意到,檔案Kconfig.liteos_m.series在目錄bestechnic和目錄bestechnic\bes2600下都有,屬於同名檔案。所以,Kconfig中的路徑萬用字元*只通配了一級目錄。

rsource "*/Kconfig.liteos_m.series"

SoC和SoC Serial的配置項類似,可以自行檢視。

 

點選關注,第一時間瞭解華為雲新鮮技術~

相關文章