kernel——make menuconfig的實現原理【轉】


轉自:https://blog.csdn.net/hpr1992/article/details/41048693

1、系統移植可以分為配置系統和編譯系統兩大塊,其中通過命令makemenuconfig進行圖形化界面配置的步驟為配置系統。

2、內核源碼包中,不同的目錄收集不同的代碼塊,要通過配置系統將“有用”的代碼塊“挑選”出來,以便給后續的編譯系統編譯。


要弄清make menuconfig命令的實現原理,通過以下問題的答案就可以知道。

一、“配置菜單界面”是如何出來的?

執行make menuconfig的時候,會執行頂層的Makefile,

[cpp] view plain copy

    %config: scripts_basic outputmakefile FORCE  
        $(Q)mkdir -p include/linux include/config  
        $(Q)$(MAKE) $(build)=scripts/kconfig $@  


注意:$(build) =scripts/kconfig,build是編譯規則,$(build) =scripts/kconfig實質是:-f scripts/kconfig/Makefile

則:$(Q)$(MAKE) $(build)=scripts/kconfig $@ ==》make -f scripts/kconfig/Makefile  menuconfig

-f:指定執行某個Makefile文件,表示到scripts/kconfig目錄下Makefile文件中,生成目標menuconfig


接下來,scripts/kconfig/Makefile找到目標所在的代碼:

[cpp] view plain copy

    menuconfig: $(obj)/mconf  
        $< $(Kconfig)  

obj          := $(CURDIR)

Kconfig            :=arch/$(SRCARCH)/Kconfig

SRCARCH := $(ARCH)

而ARCH變量在頂層目錄的Makefile中早已賦值arm

所以:
[cpp] view plain copy

    menuconfig: scripts/kconfig/mconf  
          scripts/kconfig/mconf  arch/arm/Kconfig  

當我們執行命令make menuconfig時,(1)先創建兩個二級目錄include /linux 和 include/config,(2)接着

把scripts/kconfig/里面的可執行文件mconf運行起來,有能力的話可以詳看scripts/kconfig/mconf.c,根據文件arch/arm/kconfig內容,顯示出一個菜單界面。其實,mconf運行起來,首先是“畫出”菜單界面(顯示內容則根據各級目錄的Kconfig文件),然后查看當前目錄有沒有存在.config文件,若沒有,則按照默認顯示到菜單里面;若存在.config,則會把它讀出來存到內存某塊區域,在逐行逐行解析它的內容,再把讀出的內容更新到菜單。

最后會保存在.config文件(當前目錄中)。


二、kconfig文件的語法分析?

kconfig的總入口是arch/arm/kconfig,不是源碼頂層的kconfig,入口一定是根據某款平台的。

概括起來,kconfig的用法有三種:

(1)添加一個菜單選項,菜單選項不是代表某種功能,只有進去菜單里面,才能選擇功能屬性,意義不大。

如添加一個helloworld菜單。


格式:

menu “xxxxxx”
……

……
endmenu


(2)定義一個功能屬性選項,一個功能屬性對應一塊代碼。定義的功能屬性最好放在菜單選項里面。

如直接添加一個功能屬性printf hello

格式:

config HAVE_PWM     

config  XXX (XXX是宏) 
bool (二態,0或1,后面帶提示內容,幾乎都有)
default  y                 (y默認是選中的,n默認則是不選)
select  宏1                ( 要是當前的功能屬性選上,則宏1代表的功能屬性一定自動選上,用戶不能修改。 )  
depend on 宏 2        ( 當前功能屬性依賴於宏2的功能屬性,若宏2功能屬性沒有選上,則當前功能選項不能顯示出來。)
help  幫助信息
xxxxxxx


(3)導入別的目錄的Kconfig

source “xxx/xxx/kconfig”
可以這樣用法:

menu “xxxxxx”

config HAVE_PWM

bool

source “xxx/xxx/kconfig”

endmenu

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM