何為Kconfig 它的作用是什么
內(nèi)核源碼編譯過程
- 遍歷每個(gè)源碼目錄(或配置指定的源碼目錄)Makefile
- 每個(gè)目錄的Makefile 會根據(jù)Kconfig來定制要編譯對象
- 回到頂層目錄的Makeifle執(zhí)行編譯
那么我們就得出各個(gè)文件的作用:
Kconfig ---> (每個(gè)源碼目錄下)提供選項(xiàng)
.config ---> (源碼頂層目錄下)保存選擇結(jié)果
Makefile---> (每個(gè)源碼目錄下)根據(jù).config中的內(nèi)容來告知編譯系統(tǒng)如何編譯
說到底,,Kconfig就是配置哪些文件編譯,那些文件不用編譯,。后期linux內(nèi)核都做出了如下的圖形界面,,但由于要進(jìn)行Linux內(nèi)核驅(qū)動開發(fā),需要向?qū)Ⅱ?qū)動的代碼添加到Makefile中一起編譯,,所以Kconfig的一些語法也該了解,,于是有了這篇文章,。
基本使用方法
我們以簡單的單選項(xiàng)為案例來演示
假比,,我們做好了一個(gè)驅(qū)動,需要將選項(xiàng)加入到內(nèi)核的編譯選項(xiàng)中,,可以按以下步驟操作:
第一步 配置Kconfig
在driver目錄下新建一個(gè)目錄
mkdir driver/test
進(jìn)入test目錄,,創(chuàng)建Kconfig文件
這里定義了一個(gè)TEST的句柄,Kconfig可以通過這個(gè)句柄來控制Makefile中是否編譯,,”Test driver”是顯示在終端的名稱,。
具體的語法在Kconfig語法簡介中介紹。
第二步 配置Makefile
在同樣的目錄中,,新建一個(gè)Makefile
Obj-$(CONFIG_選項(xiàng)名) += xxx.o
/*當(dāng)CONFIG_選項(xiàng)名=y時(shí),,表示對應(yīng)目錄下的xxx.c將被編譯進(jìn)內(nèi)核
當(dāng)CONFIG_選項(xiàng)名=m時(shí)對應(yīng)目錄下的xxx.c將被編譯成模塊*/
第三步 配置上層目錄的Makefile與Kconfig
在上一層目錄的Kconfig中
表示將test文件夾中的Kconfig加入搜尋目錄
在上一層目錄的Makefile中
結(jié)果,運(yùn)行根目錄的.config查看結(jié)果
Kconfig語法簡介
單一選項(xiàng)
總體原則:每一個(gè)config就是一個(gè)選項(xiàng),,最上面跟著控制句柄,,下面則是對這個(gè)選項(xiàng)的配置,如選項(xiàng)名是什么,,依賴什么,,選中這個(gè)后同時(shí)會選擇什么。
config CPU_S5PC100
bool "選項(xiàng)名"
select S5P_EXT_INT
select SAMSUNG_DMADEV
help
Enable S5PC100 CPU support
config —> 選項(xiàng)
CPU_S5PC100 —>句柄,,可用于控制Makefile 選擇編譯方式
bool —>選擇可能:TRUE選中,、FALSE不選 選中則編譯,不選中則不編譯,。
如果后面沒有字符串名稱,,則表示其不會出現(xiàn)在選擇軟件列表中
select —> 當(dāng)前選項(xiàng)選中后則select后指定的選項(xiàng)自動被選擇
depends on ARM || BLACKFIN || MIPS || COLDFIRE
depend on 依賴,后面的四個(gè)選擇其中至少一個(gè)被選擇,,這個(gè)選項(xiàng)才能被選
config DM9000
tristate "DM9000 support"
tristate —> 選中并編譯進(jìn)內(nèi)核,、不選編譯成模塊
運(yùn)行結(jié)果:< M > test
選項(xiàng)為數(shù)字
config ARM_DMA_IOMMU_ALIGNMENT
int "Maximum PAGE_SIZE order of alignment for DMA IOMMU buffers" ---->該選項(xiàng)是一個(gè)整型值
range 4 9 ---->該選項(xiàng)的范圍值
default 8 ---->該選項(xiàng)的默認(rèn)值
help
DMA mapping framework by default aligns all buffers to the smallest
...
4-8為這個(gè)數(shù)字的范圍,,運(yùn)行結(jié)果
這里的defult其實(shí)也可以用在bool中
config STACKTRACE_SUPPORT
bool --->該選項(xiàng)可以選中或不選,且不會出現(xiàn)在選擇列表中
default y ---->表示缺省情況是選中
if..endif
if ARCH_S5PC100 --->如果ARCH_S5PC100選項(xiàng)選中了,,則在endif范圍內(nèi)的選項(xiàng)才會被選
config CPU_S5PC100
bool "選項(xiàng)名"
select S5P_EXT_INT
select SAMSUNG_DMADEV
help
Enable S5PC100 CPU support
endif
舉個(gè)例子,,如果CPU沒有選擇使用多核CPU,則不會出現(xiàn)CPU個(gè)數(shù)的選項(xiàng),。
choice多個(gè)選項(xiàng)
choice --->表示選擇列表
prompt "Default I/O scheduler" //主目錄名字
default DEFAULT_CFQ //默認(rèn)CFQ
help
Select the I/O scheduler which will be used by default for all
block devices.
config DEFAULT_DEADLINE
bool "Deadline" if IOSCHED_DEADLINE=y
config DEFAULT_CFQ
bool "CFQ" if IOSCHED_CFQ=y
config DEFAULT_NOOP
bool "No-op"
endchoice
menu與menuconfig
menu的用法
menu "Boot options" ----> menu表示該選項(xiàng)是不可選的菜單,,其后是在選擇列表的菜單名
config USE_OF
bool "Flattened Device Tree support"
select IRQ_DOMAIN
select OF
select OF_EARLY_FLATTREE
help
Include support for flattened device tree machine descriptions.
....
endmenu ----> menu菜單結(jié)束
menu指的是不可編輯的menu,而menuconfig則是帶選項(xiàng)的menu
menu和choice的區(qū)別
menu 可以多選 choice 是單項(xiàng)選擇題
menuconfig的用法
menuconfig MODULES ---> menuconfig表示MODULE是一個(gè)可選菜單,,其選中后是CONFIG_MODULES
bool "菜單名"
if MODULES
...
endif # MODULES
說到底,,menconfig 就是一個(gè)帶選項(xiàng)的菜單,在下面需要用bool判斷一下,,選擇成立后,,進(jìn)入if …endif 中間得空間。
|