天天看點

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

摘要:本文介紹了Kconfig的基礎知識,和鴻蒙輕核心的圖形化配置及進階的使用方法。

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

Kconfig語言定義了一套完整的規則來表述配置項及配置項間的關系,詳細内容可以參考Linux官方文檔Kconfig Language,此處不贅述。鴻蒙輕核心使用的是Python的開源三方庫kconfiglib(menuconfig隻是其提供的指令之一,相關指令還有genconfig, savedefconfig等等),官方首頁為https://pypi.org/project/kconfiglib。

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

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

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

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

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

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

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

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

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

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。

上文,我們知道了make menuconfig支援參數,我們詳細看下代碼。檔案位置在kernel/liteos_a/Makefile,代碼片段如下:

如果指定了CONFIG參數,則使用使用者指定的産品配置檔案。如果開啟了TEE,則使用TEE版本的産品配置檔案。如果開啟了RELEASE,則使用release版本産品配置檔案,否則使用debug版本的産品配置檔案。

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

可以看出,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配置。指令如下:

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

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>

我們知道在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檔案中會使用這些環境變量。

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

在執行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/board/*/Kconfig.liteos_m.shields"用于配置擴充闆資訊,使用*通配符比對所有的擴充闆,可以将所有擴充闆配置資訊都加載進來。設計者認為不同單闆廠商的擴充闆可以相容使用吧。還比較有意思的是,Kconfig檔案采用liteos_m.shields作為字尾,一方面指明核心類型,又指明是擴充闆的配置。fnlink的擴充闆設定路徑為device\board\fnlink\Kconfig.liteos_m.shields,其内容如下。可以看到又進一步包含shields目錄下面Kconfig.liteos_m.shields。

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

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

檔案"../../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了解下公司開發闆預設配置項資訊。預設配置項資訊不會在配置界面上進行展示。

檔案"../../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時已經确認,這裡的配置在界面上隻起到展示作用,開發者并不能進行選擇配置,這塊預計後續會繼續優化。

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

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

在"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中的路徑通配符*隻通配了一級目錄。

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

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