linux之.config,makefile,kconfig

1.頂層

頂層的Makefile文檔讀取內核配置文件.config文檔的內容.遞歸向下訪問子目錄的形式完成build內核和模塊的工作。
.config文件的內容是在makemenuconfig的時候,通過Kconfig文檔配置的結果.arch/$(ARCH)/Makefile則提供補充體
繫結構相關的信息;
2.內核中的kconfig
每個Kconfig分別描述了所屬目錄源文件相關的內核配置菜單。
Kconfig 語法結構 
每個菜單項都有一個關鍵字標識,最常見的就是config。
語法:
config symbol
options
symbol就是新的菜單項,options是在這個新的菜單項下的屬性和選項
其中options部分有:
(1)類型定義:
每個config菜單項都要有類型定義,bool:布爾類型,tristate三態:內建、模塊、移除, string:字符串,hex:十六進制, integer:整型
例如 configHELLO_MODULE
bool"hello testmodule"
bool類型的只能選中或不選中,tristate類型的菜單項多了編譯成內核模塊的選項,假如選擇編譯成內核模塊,則會在.config中生成一個
CONFIG_HELLO_MODULE=m的配置,假如選擇內建,就是直接編譯成內核影響,就會在.config中生成一個CONFIG_HELLO_MODULE=y的配置.
(2)依賴型定義dependson或requires
指此菜單的出現是否依賴於另一個定義
configHELLO_MODULE
bool"hello testmodule"
dependsonARCH_PXA
這個例子表明HELLO_MODULE這個菜單項只對XScale處理器有效,即只有在選擇了ARCH_PXA,該菜單纔可見(可配置)。
(3)幫助性定義
只是增加幫助用關鍵字help或---help--
3.makefile的內容
(1)目標定義
目標定義就是用來定義哪些內容要做爲模塊編譯,哪些要編譯鏈接進內核。如:
obj-y += foo.o
表示要由foo.c或者foo.s文件編譯得到foo.o並鏈接進內核,而obj-m則表示該文件要作爲模塊編譯。 
除了y,m以外的obj-x形式的目標都不會被編譯。而更常見的做法是根據.config文件的CONFIG_ 
變量來決定文件的編譯方式(該變量如何起作用見文末另一篇文章的鏈接),如:
obj-$(CONFIG_EXT2) += ext2.o
除了obj-形式的目標以外,還有lib-y library庫,hostprogs-y 主機程序等目標,但是基本都應用在特定的目錄和場合下。
(2)多文件模塊的定義 
最簡單的kbuild Makefile如上一節一句話的形式就夠了,如果一個模塊由多個文件組成,那麼稍微複雜一些,採用模塊名加 –objs後綴或者 –y後綴的形式來定義模塊的組成文件。如以下例子:
obj-$(CONFIG_EXT2) += ext2.o
ext2-y := balloc.o bitmap.o
或者寫成如-objs的形式:
obj-$(CONFIG_EXT2) += ext2.o
ext2-objs := balloc.o bitmap.o
模塊的名字爲ext2,如果CONFIG_EXT2的值是m,由balloc.o和bitmap.o兩個目標文件最終鏈接生成ext2.o 直至ext2.ko文件,如果CONFIG_EXT2的值是y,生成的 ext2.o將被鏈接進built-in.o最終鏈接進內核。
(3)目錄層次的迭代
如下例:
obj-$(CONFIG_EXT2) += ext2/
如果CONFIG_EXT2 的值爲y或m,kbuild將會將ext2目錄列入向下迭代的目標中。
4.多文件makefile和kconfig
#CONFIG_ECAT_DRV爲m時編譯爲模塊,爲y時編進內核 ecat.o爲最終鏈接的目標文件
obj-$(CONFIG_ECAT_DRV) += ecat.o 
#-objs指定依賴的多個.o文件 這些文件都對應相應的.c文件
ecat-objs := ecateoe.o eoeappl.o mcihw.o ecatslv.o mailbox.o ecatappl.o ecat2440.o 
本地Kconfig
#建立一個本地子目錄。“”爲顯示的目錄名字 
menu "ecat driver here" 
depends on NET #依賴於上層的某個開關 
config ECAT_DRV #配置變量名,必須和Makefile中的變量後半段一樣 
bool "ecat driver" #bool量, 顯示的名字 
---help--- #下面爲要顯示的幫助文字 
This is test for ecat. 
endmenu #本地子目錄結束 
上層Makefile
*#添加下面這一句 
obj-$(CONFIG_ECAT_DRV) += ecat/ #打開下一級目錄編譯 
上層Kconfig
*#添加下面這一句 
source "driver/xxx/ecat/Kconfig" 
#導入子文件夾中的Kconfig文件,可以爲相對路徑 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章