Linux Kbuild文檔編程
V 0.1架構
tanggeliang@dvnchina.com函數
2008-10-30工具
目錄ui
Linux
內核配置方式1.1
概述
Linux內核源代碼組織了一個配置系統,該配置系統能夠生成內核配置菜單,方便內核配置。配置系統主要包含Makefile、Kconfig和配置工具,能夠生成配置界面。其中,配置界面是經過配置工具來生成的,配置工具經過Makefile編譯執行,配置界面中的選項則是經過各級的Kconfig(老版本也稱Config.in)和Makefile(老版本也稱Kbuild)文件定義。
Linux內核配置系統也被移植到其它軟件(如Busybox、glibc、uclibc等)中,來提供一樣的配置界面以方便有選擇性的配置。
1.2
內核配置工具
Linux內核配置命令主要有:make config、make menuconfig、make xconfig和make gconfig,分別是字符界面、ncurses光標菜單、QT圖形窗口和GTK圖形窗口的配置界面。字符界面配置方式須要回答每個選項提示,逐個回答進行配置並不方便,而光標和圖形配置界面界面友好,方便實用。
make config是徹底命令行的配置方式,make menuconfig依賴於ncurses庫,make xconfig依賴於QT圖形庫,make gconfig依賴於GTK圖形庫。
不一樣的內核配置方式,分別經過不一樣的配置工具來完成。scripts目錄下提供了各類內核配置工具,表1是這些工具的說明。
表1 內核配置工具說明
配置工具 |
Makefile相關目標 |
依賴的程序 |
conf |
config defconfig oldconfig … |
conf.c、zconf.tab.c |
mconf |
menuconfig |
mconf.c、zconf.tab.c |
qconf |
xconfig |
qconf.c、kconfig_load.c、zconf.tab.c |
gconf |
gconfig |
gconf.c、kconfig_load.c、zconf.tab.c |
其中zconf.tab.c程序實現瞭解析Kconfig文件和內核配置主要函數。Zconf.tab.c程序還直接包括了下列一些C程序,這樣各類配置功能都包含在zconf.tab.o目標文件中了。
其中,lex.zconf.c實現lex語法解析器,
util.c實現配置工具,
confdata.c實現.config等相關數據文件保存,
expr.c實現表達式函數,
symbol.c實現變量處理函數,
menu.c實現菜單控制函數。
1.3
內核配置方式
在頂層的Makefile中,能夠查找到以下幾行定義的規則:
這就是生成內核配置界面的命令規則,它也定義了執行的目標和依賴的前提條件,還有要執行的命令。這條規則定義的目標爲config %config,通配符%意味着能夠包括config、menuconfig、xconfig、gconfig等。依賴的前提條件是scripts_basic outputmakefile,這些在Makefile中也是規則定義,主要用來編譯生成配置工具。這條規則執行的命令就是執行scripts/kconfig/Makefile制定的規則。
根據配置工具的不一樣,內核有不一樣的配置方式。有命令行方式,還有圖形界面方式。表2是各類內核配置方法的說明。
表2 內核配置方法的說明
配置方法 |
功能 |
config |
經過命令行程序更新當前配置 |
menuconfig |
經過菜單程序更新當前配置 |
xconfig |
經過QT圖形界面更新當前配置 |
gconfig |
經過GTK圖形界面更新當前配置 |
oldconfig |
經過已經提供的.config文件更新當前配置 |
Randconfig |
對全部的選項隨機配置 |
Defconfig |
對全部的選項缺省配置 |
allmodconfig |
對全部的選項儘量選擇「m」 |
allyesconfig |
對全部的選項儘量選擇「y」 |
allnoconfig |
對全部的選項儘量選擇「n」的最小配置 |
這些內核配置方式是在scripts/kconfig/Makefile中經過規則定義的。從這個Makefile中,能夠找到下面一些規則定義。若是把變量或者通配符帶進去,就能夠明白要執行的操做。
這裏的ARCH以arm爲例來講明。
執行命令:scripts/kconfig/qconf arch/arm/Kconfig,使用QT圖形庫生成配置界面,arch/arm/Kconfig是菜單的主配置文件,每種配置方式都須要。
執行命令:scripts/kconfig/qconf arch/arm/Kconfig,使用GTK圖形庫生成配置界面。
執行命令:scripts/kconfig/mconf arch/arm/Kconfig,使用lxdialog工具,生成光標配置菜單。
執行命令:scripts/kconfig/conf (-o/s) arch/arm/Kconfig,徹底命令行的內核配置方式。使用「-o」選項,直接讀取已經存在的.config文件,要求肯定內核新的配置項。使用「-s」選項,直接讀取已經存在的.config文件,提示但不要求確認內核新的配置項。
經過上述各類方式均可以完成配置內核的工做,在頂層目錄下生成.config文件。這個.config文件保存大量的內核配置項,.config會自動轉換成include/linux/autoconf.h頭文件。在include/linux/config.h文件中,將包含使用include/linux/autoconf.h頭文件。
2. Kconfig
linux在2.6版本之後將配置文件由原來的config.in改成Kconfig,對於Kconfig的語法在內核源代碼/Documentation/kbuild/kconfig-language.txt中作了詳細的說明。
2.1 Kconfig
的樹狀關係
Kconfig的配置選項是以樹的形式組織的,以下所示所示:
每一個選項都有其本身的依賴關係。這些依賴關係決定了選項是不是可見的。父選項可見,子選項才能可見。
arch/$(ARCH)/Kconfig文件是主Kconfig文件,跟體系結構有關係。主Kconfig文件調用其餘目錄的Kconfig文件,其餘的Kconfig文件又調用各級子目錄的配置文件,成樹狀關係。
2.2
菜單選項
多數選項定義了一個配置選項,其它選項起輔助組織做用。一個配置選項定義能夠是下面的形式:
每行都是以關鍵字開始,並能夠接多個參數。"config" 爲定義了一新的配置選項。下面的幾行定義了該配置選項的屬性。屬性能夠是該配置選項的類型,輸入提示(input prompt),依賴關係,幫助信息和默認值。一個配置選項能夠用相同的名字定義屢次,但每一個定義只能有一個輸入提示而且類型還不能衝突。
2.3
菜單屬性
一個菜單選項能夠有多個屬性,這些屬性受到語法的限制。每一個配置選項都必須指定類型。類型定義包括:"bool"、"tristate"、"string"、"hex"、"int"共五種。其中有兩個基本類型:tristate 和 string,其餘類型都是基於這兩個基本類型。內核菜單屬性說明表3所示。
表3 內核菜單屬性說明
屬性 |
語法 |
說明 |
輸入提示 |
"prompt" ["if" ] |
每一個菜單選項最多隻能有一個顯示給用戶的輸入提示。能夠用"if" 來表示該提示的依賴關係,固然這是可選的。 |
默認值 |
"default" ["if" ] |
一個配置選項能夠有任意多個默認值。若是有多個默認值,那麼只有第一個被定義的值是可用的。默認值並非只限於應用在定義他們的菜單選項。這就意味着默認值能夠定義在任何地方或被更早的定義覆蓋。若是用戶沒有設置(經過上面的輸入提示),配置選項的值就是默認值。若是能夠顯示輸入提示的話,就會把默認值顯示給用戶,並可讓用戶進行修改。默認值的依賴關係能夠用 "if" 添加。 |
依賴關係 |
"depends on" /"requires" |
爲一菜單選項定義依賴關係。若是定義了多個依賴關係,它們之間用 '&&' 間隔。依賴關係也能夠應用到該菜單中全部的其它選項(一樣接受一if表達式)。 |
反向依賴關係 |
"select" ["if" ] |
儘管普通的依賴關係能夠下降一選項的上限,反向依賴能將這一限制降的更低。當前菜單選項的值是symbol的最小值。若是symbol被選擇了屢次,上限就是其中的最大值。反向依賴只能用在 boolean 或 tristate 選項上。 |
數據範圍 |
"range" ["if" ] |
爲int和hex類型的選項設置能夠接受輸入值範圍。用戶只能輸入大於等於第一個symbol,小於等於第二個symbol的值。 |
幫助信息 |
"help" or "---help---" |
定義一幫助信息。幫助信息的結束就由縮進的水平決定的,這也就意味着信息是在第一個比幫助信息開始行的縮進小的行結束。"---help---" 和 "help" 在實現的做用上沒有區別,"---help---" 有助於將文件中的配置邏輯與給開發人員的提示分開。 |
2.4
菜單依賴關係
依賴關係決定了菜單選項是否可見,也能夠減小tristate的輸入範圍。tristate邏輯比boolean邏輯在表達式中用更多的狀態(state)來表示模塊的狀態。依賴關係表達式的語法如表4所示,表達式是以優先級的降序列出的。
表4 菜單依賴關係語法說明
表達式 |
結果說明 |
::= |
將symbol賦給表達式。boolean和tristate類型的symbol直接賦給表達式。全部其它類型的symbol都賦 'n'。 |
'=' |
若是兩個symbol相等,返回'y',不然爲'n'。 |
'!=' |
若是兩個symbol相等,返回'n',不然爲'y'。 |
'(' ')' |
返回表達式的值。用於改變優先級。 |
'!' |
返回 (2-/expr/) 的結果。 |
'&&' |
返回 min(/expr/,/expr/) 的結果。 |
'||' |
返回 max(/expr/,/expr/) 的結果。 |
一個表達式的值能夠是'n','m'或'y'(或者是計算的結果 0,1,2)。當表達式的值爲'm'或'y'的時候,菜單項纔是可見的。
symbol有兩種類型:不可變的和可變的。不可變的symbol是最普通的,由'config'語句定義,徹底由數字、字母和下劃線組成(alphanumeric characters or underscores)。
不可變的symbol只是表達式的一部分。常常用單引號或雙引號括起來。在引號中,可使用任何字符,使用引號要用轉義字符'\'。
2.5
菜單結構
菜單在樹中的位置可由兩種方法決定。
第一種能夠是這樣:
全部的在"menu" ... "endmenu" 之間都是"Network device support"的子菜單。全部的子菜單選項都繼承了父菜單的依賴關係,好比,"NET"的依賴關係就被加到了配置選項NETDEVICES的依賴列表中。
第二種是經過分析依賴關係生成菜單的結構。若是菜單選項在必定程度上依賴於前面的選項,它就能成爲該選項的子菜單。首先,前面的(父)選項必須是依賴列表中的一部分而且它們中必須有知足下面兩個條件的選項:若是父選項爲'n',子選項必須不可見;若是父選項可見,子選項才能可見。
MODVERSIONS 直接依賴 MODULES,這就意味着若是MODULES不爲'n',該選項纔可見。換句話說,當MODULES可見時,選項纔可見(MODULES的(空)依賴關係也是選項依賴關係的一部分)。
2.6 Kconfig
語法
配置文件描述了菜單選項,每行都是以一關鍵字開頭(除了幫助信息)。菜單的關鍵字如表5所示。其中菜單開頭的關鍵字有:config、menuconfig、choice/endchoice、comment、menu/endmenu。它們也能夠結束一個菜單選項,另外還有if/endif、source也能夠結束菜單選項。
表5 Kconfig菜單關鍵字說明
關鍵字 |
語法 |
說明 |
config |
"config" |
定義了一配置選項 而且能夠接受任何前面介紹的屬性。 |
menuconfig |
"menuconfig" |
此關鍵字和前面的關鍵字很類似,但它在前面的基礎上要求全部的子選項做爲獨立的行顯示。 |
choices |
"choice" "endchoice" |
該關鍵字定義了一組選擇項,而且選項能夠是前面描述的任何屬性。儘管boolean只容許選擇一個配置選項,tristate能夠抒多個配置選項設爲'm',但選項只能是boolean或tristate類型。這能夠在一個硬件有多個驅動的狀況下使用,最終只有一個驅動被編譯進/加載到內核,,但全部的驅動均可以編譯成模塊。選項能夠接受的另外一個選項是"optional",這樣選項就被設置爲'n',沒有被選中的。 |
comment |
"comment" |
這定義了在配置過程當中顯示給用戶的註釋,該註釋還將寫進輸出文件中。惟一可用的可選項是依賴關係。 |
menu |
"menu" "endmenu" |
這裏定義了一個菜單,詳細信息請看前面的"菜單結構"。惟一可用的可選項是依賴關係。 |
if |
"if" "endif" |
這裏定義了if結構。依賴關係被加到全部在if ... endif 中的菜單選項中。 |
source |
「source」 |
讀取指定的配置文件。讀取的文件也會解析生成菜單。 |
3. Kbuild Makefile
Linux內核源代碼是經過Makefile組織編譯的,Linux2.6內核Makefile的許多特性和2.4內核差異很大,在內核目錄的documention/kbuild/makefiles.txt中有詳細的說明。
3.1 Makefile
的組織結構
Linux內核的Makefile分爲5個部分,如表6所示:
表6 Makefile的5個部分
Makefile |
頂層Makefile |
.config |
內核配置文件 |
arch/$(ARCH)/Makefile |
具體架構的Makefile |
scripts/Makefile.* |
通用的規則等。面向全部的Kbuild Makefiles。 |
kbuild Makefiles |
內核源代碼中大約有500個這樣的文件 |
頂層Makefile閱讀的.config文件,而該文件是由內核配置程序生成的。
頂層Makefile負責製做:vmlinux(內核文件)與模塊(任何模塊文件)。製做的過程主要是
經過遞歸向下訪問子目錄的形式完成。並根據內核配置文件肯定訪問哪些子目錄。頂層Makefile要原封不動的包含一具體架構的Makefile,其名字相似於arch/$(ARCH)/Makefile。該架構Makefile向頂層Makefile提供其架構的特別信息。
每個子目錄都有一個Kbuild Makefile文件,用來執行從其上層目錄傳遞下來的命令。
Kbuild Makefile從.config文件中提取信息,生成Kbuild完成內核編譯所需的文件列表。
scripts/Makefile.*包含了全部的定義、規則等信息。這些文件被用來編譯基於kbuild
Makefile的內核。
3.2 Makefile
語言
內核的Makefile使用的是GNU Make。該Makefile只使用GNU Make已註明的功能,並使用了許多GNU 的擴展功能。
GNU Make支持基本的顯示處理過程的函數。內核Makefile 使用了一種相似小說的方式,顯示"if"語句的構造、處理過程。
GNU Make 有2個賦值操做符,":="和"="。":=",將對右邊的表達式求值,並將所求的值賦給左邊。"="更像是一個公式定義,只是將右邊的值簡單的賦值給左邊,當左邊的表達式被使用時,才求值。
有時使用"="是正確的。可是,通常狀況下,推薦使用":="。
3.3 Kbuild
變量
頂層Makefile輸出如下變量:
(1)VERSION、PATCHLEVEL、SUBLEVEL和EXTRAVERSION
這些變量定義了當前內核的版本號。只有不多一部分Makefile會直接用到這些變量;可以使用 $(KERNELRELEASE)代替。$(VERSION),$(PATCHLEVEL),和$(SUBLEVEL)定義了最初使用的三個數字的版本號,好比"2""4"和"0"。這三個值通常是數字。$(EXTRAVERSION) 爲了補丁定義了更小的版本號。通常是非數字的字符串,好比"-pre4" ,或就空着。
(2)KERNELRELEASE
$(KERNELRELEASE) 是一個字符串,相似"2.4.0-pre4",用於安裝目錄的命名或顯示當前的版本號。一部分架構Makefile使用該變量。
(3)ARCH
該變量定義了目標架構,好比"i386","arm" 或"sparc"。有些Kbuild Makefile根據 $(ARCH) 決定編譯哪些文件。
默認狀況下,頂層Makefile將其設置爲本機架構。若是是跨平臺編譯,用戶能夠用下面的命令覆蓋該值:
make ARCH=m68k ...
(4)INSTALL_PATH
該變量爲架構Makefile定義了安裝內核鏡像與 System.map 文件的目錄。主要用來指明架構特殊的安裝路徑。
(5)INSTALL_MOD_PATH和MODLIB
$(INSTALL_MOD_PATH) 爲了安裝模塊,給 $(MODLIB) 聲明瞭前綴。該變量不能在Makefile中定義,但能夠由用戶傳給Makefile。
$(MODLIB) 具體的模塊安裝的路徑。頂層Makefile將$(MODLIB)定義爲
$(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE)。用戶能夠經過命令行參數的形式將其覆蓋。
(6)INSTALL_MOD_STRIP
若是該變量有定義,模塊在安裝以前,會被剝出符號表。若是INSTALL_MOD_STRIP 爲 "1",就使用默認選項 --strip-debug。不然,INSTALL_MOD_STRIP 將做爲命令 strip的選項使用。
3.4 Kbuild Makefile
的定義
大部份內核中的Makefile都是使用Kbuild組織結構的Kbuild Makefile。這章介紹了
Kbuild Makefile的語法。
Kbuild文件傾向於"Makefile"這個名字,"Kbuild"也是能夠用的。但若是"Makefile"
"Kbuild"同時出現的話,使用的將會是"Kbuild"文件。
3.4.1 目標定義
目標定義是Kbuild Makefile的主要部分,也是核心部分。主要是定義了要編
譯的文件,全部的選項,以及到哪些子目錄去執行遞歸操做。
最簡單的Kbuild makefile 只包含一行,如:
該例子告訴Kbuild在這目錄裏,有一個名爲foo.o的目標文件。foo.o將從foo.c或foo.S文件編譯獲得。
若是foo.o要編譯成一模塊,那就要用obj-m了。所採用的形式以下:
$(CONFIG_FOO)能夠爲y(編譯進內核) 或m(編譯成模塊)。若是CONFIG_FOO不是y和m,那麼該文件就不會被編譯聯接了。
3.4.2 編譯進內核 - obj-y
Kbuild Makefile 規定全部編譯進內核的目標文件都存在$(obj-y)列表中。而這些列表依賴內核的配置。
Kbuild編譯全部的$(obj-y)文件。而後,調用"$(LD) -r"將它們合併到一個build-in.o文件中。稍後,該build-in.o會被其父Makefile聯接進vmlinux中。
$(obj-y)中的文件是有順序的。列表中有重複項是能夠的:當第一個文件被聯接到built-in.o中後,其他文件就被忽略了。聯接也是有順序的,那是由於有些函數(module_init()/__initcall)將會在啓動時按照他們出現的順序進行調用。因此,記住改變聯接的順序可能改變你SCSI控制器的檢測順序,從而致使你的硬盤數據損害。
舉例說明obj-y:
3.4.3 編譯可裝載模塊 - obj-m
$(obj-m) 列舉出了哪些文件要編譯成可裝載模塊。
一個模塊能夠由一個文件或多個文件編譯而成。若是是一個源文件,Kbuild Makefile只需簡單的將其加到$(obj-m)中去就能夠了。例如:
注意:此例中 $(CONFIG_ISDN_PPP_BSDCOMP) 的值爲'm'
若是內核模塊是由多個源文件編譯而成,那你就要採用上面那個例子同樣的方法去聲明你所要編譯的模塊。Kbuild須要知道你所編譯的模塊是基於哪些文件,因此你須要經過變量$(<module_name>-objs)來告訴它。例如:
在這個例子中,模塊名將是isdn.o,Kbuild將編譯在$(isdn-objs)中列出的全部文件,而後使用"$(LD) -r"生成isdn.o。
Kbuild可以識別用於組成目標文件的後綴-objs和後綴-y。這就讓Kbuild Makefile能夠經過使用 CONFIG_ 符號來判斷該對象是不是用來組合對象的。例如:
在這個例子中,若是 $(CONFIG_EXT2_FS_XATTR) 是 'y',xattr.o將是複合對象ext2.o的一部分。
注意:固然,當你要將其編譯進內核時,上面的語法一樣適用。因此,若是你的CONFIG_EXT2_FS=y,那Kbuild會按你所指望的那樣,生成ext2.o文件,而後將其聯接到built-in.o中。
3.4.4目標庫文件 - lib-y
在obj-*中所列文件是用來編譯模塊或者是聯接到特定目錄中的built-in.o。一樣,也能夠列出一些將被包含在lib.a庫中的文件。在 lib-y 中所列出的文件用來組成該目錄下的一個庫文件。在obj-y與lib-y中同時列出的文件,由於都是能夠訪問的,因此該文件是不會被包含在庫文件中的。一樣的狀況,lib-m中的文件就要包含在lib.a庫文件中。
注意,一個Kbuild makefile能夠同時列出要編譯進內核的文件與要編譯成庫的文件。因此,在一個目錄裏能夠同時存在built-in.o與lib.a兩個文件。例如:
這將由 checksum.o 和delay.o 兩個文件建立一個庫文件 lib.a。爲了讓Kbuild真正認識到這裏要有一個庫文件lib.a要建立,其所在的目錄要加到libs-y列表中。
3.4.5遞歸向下訪問目錄
一個Makefile只對編譯所在目錄的對象負責。在子目錄中的文件的編譯要由其所在的子目錄的Makefile來管理。只要你讓Kbuild知道它應該遞歸操做,那麼該系統就會在其子目錄中自動的調用 make 遞歸操做。
這就是obj-y和obj-m的做用。好比ext2被放的一個單獨的目錄下,在fs目錄下的Makefile會告訴Kbuild使用下面的賦值進行向下遞歸操做。
若是 CONFIG_EXT2_FS 被設置爲 'y'(編譯進內核)或是'm'(編譯成模塊),相應的 obj- 變量就會被設置,而且Kbuild就會遞歸向下訪問 ext2 目錄。Kbuild只是用這些信息來決定它是否須要訪問該目錄,而具體怎麼編譯由該目錄中的Makefile來決定。將 CONFIG_ 變量設置成目錄名是一個好的編程習慣。這讓Kbuild在徹底忽略那些相應的CONFIG_ 值不是'y'和'm'的目錄。
3.4.6編輯標誌
編輯標記包括:EXTRA_CFLAGS,、EXTRA_AFLAGS、EXTRA_LDFLAGS、EXTRA_ARFLAG。全部的EXTRA_變量只在所定義的Kbuild Makefile中起做用。EXTRA_變量能夠在Kbuild Makefile中全部命令中使用。
$(EXTRA_CFLAGS) 是用 $(CC) 編譯C源文件時的選項。例如:
該變量是必須的,由於頂層Makefile擁有變量 $(CFLAGS) 並用來做爲整個源代碼樹的編譯選項。
$(EXTRA_AFLAGS) 也是一個針對每一個目錄的選項,只不過它是用來編譯彙編源代碼的。例如:
$(EXTRA_LDFLAGS)和$(EXTRA_ARFLAGS)分別與$(LD)和$(AR)相似,只不過它們是針對每一個目錄的。例如:
CFLAGS_$@, AFLSGA_$@
CFLAGS_$@ 和 AFLAGS_$@ 只能在當前Kbuild Makefile中的命令中使用。
$(CFLAGS_$@) 是 $(CC) 針對每一個文件的選項。$@ 代表了具體操做的文件。例如:
以上三行分別設置了aha152x.o,gdth.o 和 seagate.o的編輯選項。
$(AFLAGS_$@) 也相似,只不是是針對彙編語言的。例如:
3.4.7依賴跟蹤
Kbuild 跟蹤在如下方面依賴:
1) 全部要參與編譯的文件(全部的.c 和.h文件)
2) 在參與編譯文件中所要使用的 CONFIG_ 選項
3) 用於編譯目標的命令行
所以,若是你改變了 $(CC) 的選項,全部受影響的文件都要從新編譯。
3.4.8特殊規則
特殊規則就是那Kbuild架構不能提供所要求的支持時,所使用的規則。一個典型的例子就是在構建過程當中生成的頭文件。另外一個例子就是那些須要採用特殊規則來準備啓動鏡像。
特殊規則的寫法與普通Make規則同樣。Kbuild並不在Makefile所在的目錄執行,因此全部的特殊規則都要提供參與編譯的文件和目標文件的相對路徑。
在定義特殊規則時,要使用如下兩個變量:$(src)和$(obj)。$(src) 代表Makefile所在目錄的相對路徑。常常在定位源代碼樹中的文件時,使用該變量。$(obj) 代表目標文件所要存儲目錄的相對路徑。常常在定位所生成的文件時,使用該變量。例如:
這就是一個特殊規則,遵照着make所要求的普通語法。
4.
一個使用linux kbuild
實現可配置編譯的例子
我編寫了一個使用Linux kbuild機制實現可配置編譯的小例子,工程名爲print-example。包括以下以下幾個目錄:
其中scripts、Makefile、Makefile.flags是從busybox-1.9.0複製過來的。
4.1
運行print
運行make menuconfig命令彈出配置菜單以下:
進入Print Configure選項選擇配置項:
這裏選擇代印信息1和2,保存退出配置界面。
運行make命令編譯程序,生成print可執行文件,運行print結果以下:
運行make clean編譯產生文件。
4.2
實現print
4.2.1 主目錄Makefile
主目錄Makefile修改部分代碼以下:
使用core-y時是使用的靜態連接目標文件obj-y,使用libs-y時是使用庫目標文件lib-y,各個子目錄的Makefile應該相應的使用obj-y或lib-y。
4.2.2主目錄Kconfig
主目錄Kconfig代碼以下:
它給出了主菜單的配置選項,並有source關鍵字加入子目錄的Kconfig文件。
4.2.3 main文件夾
main文件夾下共兩個文件:
其中,main.c代碼以下:
頭文件autoconf.h是在編譯過程當中生成的。
Makefile代碼以下:
4.2.4 printfun文件夾
printfun文件夾下有六個文件:
其中,printx.c(print1.c, print2.c, print3.c, print4.c)代碼以下:
Makefile代碼以下:
Kconfig代碼以下:
4.2.5 include目錄
include目錄下只有一個文件print.h,代碼以下:
參考文獻
【1】孫紀坤 配置編譯內核
【2】linux kernel /Documentation/kbuild/kconfig-language.txt
【3】2.6Kconfig語法
【4】linux kernel /Documentation/kbuild/makefile.txt
【5】linux2.6內核Makefile詳解