http://blog.csdn.net/jianwen_hi/article/details/53398141
何為Kconfig 它的作用是什么
內核源碼編譯過程
- 遍歷每個源碼目錄(或配置指定的源碼目錄)Makefile
- 每個目錄的Makefile 會根據Kconfig來定制要編譯對象
- 回到頂層目錄的Makeifle執行編譯
那么我們就得出各個文件的作用:
Kconfig ---> (每個源碼目錄下)提供選項 .config ---> (源碼頂層目錄下)保存選擇結果 Makefile---> (每個源碼目錄下)根據.config中的內容來告知編譯系統如何編譯
- 1
- 2
- 3
說到底,Kconfig就是配置哪些文件編譯,那些文件不用編譯。后期linux內核都做出了如下的圖形界面,但由於要進行Linux內核驅動開發,需要向將驅動的代碼添加到Makefile中一起編譯,所以Kconfig的一些語法也該了解,於是有了這篇文章。
基本使用方法
我們以簡單的單選項為案例來演示
假比,我們做好了一個驅動,需要將選項加入到內核的編譯選項中,可以按以下步驟操作:
第一步 配置Kconfig
在driver目錄下新建一個目錄
mkdir driver/test
- 1
進入test目錄,創建Kconfig文件
這里定義了一個TEST的句柄,Kconfig可以通過這個句柄來控制Makefile中是否編譯,”Test driver”是顯示在終端的名稱。
具體的語法在Kconfig語法簡介中介紹。
第二步 配置Makefile
在同樣的目錄中,新建一個Makefile
Obj-$(CONFIG_選項名) += xxx.o
/*當CONFIG_選項名=y時,表示對應目錄下的xxx.c將被編譯進內核 當CONFIG_選項名=m時對應目錄下的xxx.c將被編譯成模塊*/
- 1
- 2
- 3
第三步 配置上層目錄的Makefile與Kconfig
在上一層目錄的Kconfig中
表示將test文件夾中的Kconfig加入搜尋目錄
在上一層目錄的Makefile中
結果,運行根目錄的.config查看結果
Kconfig語法簡介
單一選項
總體原則:每一個config就是一個選項,最上面跟着控制句柄,下面則是對這個選項的配置,如選項名是什么,依賴什么,選中這個后同時會選擇什么。
config CPU_S5PC100
bool "選項名" select S5P_EXT_INT select SAMSUNG_DMADEV help Enable S5PC100 CPU support
- 1
- 2
- 3
- 4
- 5
- 6
config —> 選項
CPU_S5PC100 —>句柄,可用於控制Makefile 選擇編譯方式
bool —>選擇可能:TRUE選中、FALSE不選 選中則編譯,不選中則不編譯。
如果后面沒有字符串名稱,則表示其不會出現在選擇軟件列表中
select —> 當前選項選中后則select后指定的選項自動被選擇
depends on ARM || BLACKFIN || MIPS || COLDFIRE
- 1
depend on 依賴,后面的四個選擇其中至少一個被選擇,這個選項才能被選
config DM9000
tristate "DM9000 support"
- 1
- 2
tristate —> 選中並編譯進內核、不選編譯成模塊
運行結果:< M > test
選項為數字
config ARM_DMA_IOMMU_ALIGNMENT
int "Maximum PAGE_SIZE order of alignment for DMA IOMMU buffers" ---->該選項是一個整型值 range 4 9 ---->該選項的范圍值 default 8 ---->該選項的默認值 help DMA mapping framework by default aligns all buffers to the smallest ...
- 1
- 2
- 3
- 4
- 5
- 6
- 7
4-8為這個數字的范圍,運行結果
這里的defult其實也可以用在bool中
config STACKTRACE_SUPPORT bool --->該選項可以選中或不選,且不會出現在選擇列表中 default y ---->表示缺省情況是選中
- 1
- 2
- 3
if..endif
if ARCH_S5PC100 --->如果ARCH_S5PC100選項選中了,則在endif范圍內的選項才會被選 config CPU_S5PC100 bool "選項名" select S5P_EXT_INT select SAMSUNG_DMADEV help Enable S5PC100 CPU support endif
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
舉個例子,如果CPU沒有選擇使用多核CPU,則不會出現CPU個數的選項。
choice多個選項
choice --->表示選擇列表
prompt "Default I/O scheduler" //主目錄名字 default DEFAULT_CFQ //默認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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
menu與menuconfig
menu的用法
menu "Boot options" ----> menu表示該選項是不可選的菜單,其后是在選擇列表的菜單名 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菜單結束
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
menu指的是不可編輯的menu,而menuconfig則是帶選項的menu
menu和choice的區別
menu 可以多選 choice 是單項選擇題
menuconfig的用法
menuconfig MODULES ---> menuconfig表示MODULE是一個可選菜單,其選中后是CONFIG_MODULES
bool "菜單名" if MODULES ... endif # MODULES
- 1
- 2
- 3
- 4
- 5
說到底,menconfig 就是一個帶選項的菜單,在下面需要用bool判斷一下,選擇成立后,進入if …endif 中間得空間。