Linux Kconfig及Makefile學習

來源:互聯網
上載者:User
Linux Kconfig及Makefile學習 (2011-03-01 09:40)

轉載自:http://blog.chinaunix.net/uid-20769502-id-147170.html

核心源碼樹的目錄下都有兩個文檔 Kconfig (2.4版本是Config.in)和Makefile。分布到各目錄的Kconfig構成了一個分布式的核心設定資料庫,每個Kconfig分別描述了所屬目錄來源文件相關的核心配置菜單。在核心配置make menuconfig時,從Kconfig中讀出菜單,使用者選擇後儲存到.config的核心配置文檔中。在核心編譯時間,主Makefile調用這個.config,就知道了使用者的選擇。


上面的內容說明了,Kconfig就是對應著核心的配置菜單。假如要想添加新的驅動到核心的源碼中,能夠修改Kconfig,這樣就能夠選擇這個驅動,假如想使這個驅動被編譯,要修改Makefile。所以,添加新的驅動時需要修改的文檔有兩種(注意不只是兩個)
*Kconfig
*Makefile

---------------------------------------------------------------------------------------------
Kconfig

1.先瞭解一下Kconfig的文法:
一個典型的核心配置菜單如下:
menu "Network device support"
config NETDEVICES
        bool "Enable Net Devices"
        depends on NET
        default y
       help
               This is help desciption。
...
endmenu
包含在menu/endmenu中的內容會成為Network device support的子功能表。每一個子功能表項都是由config來定義的。congfig下方的那些bool、depends on、default、help等為config的屬性,用於定義該功能表項目的類型、依賴項、預設值、協助資訊等。

2. 補充說明一下類型定義部分:
每個config功能表項目都要有類型定義: bool布爾類型、 tristate三態(內建、模組、移除)、string字串、 hex十六進位、 integer整型。
例如:
config HELLO_MODULE
bool "hello test module"
bool 類型的只能選中或不選中,顯示為[ ]; tristate類型的功能表項目多了編譯成核心模組的選項,顯示為< > , 假如選擇編譯成核心模組,則會在.config中產生一個 CONFIG_HELLO_MODULE=m的配置,假如選擇內建,就是直接編譯成核心影響,就會在.config中產生一個 CONFIG_HELLO_MODULE=y的配置. hex十六進位類型顯示為( )。

3. 目錄層次迭代
在Kconfig中有類似語句:source "drivers/usb/Kconfig"
用來包含(或嵌套)新的Kconfig檔案,這樣便可以使各個目錄管理各自的配置內容,使不必把那些配置都寫在同一個檔案裡,方便修改和管理。

----------------------------------------------------------------------------------------------

Makefile

2.6核心的Makefile分為5個組成部分:
       1. 最頂層的Makefile
       2. 核心的.config設定檔
       3.   在arch/$(ARCH) 目錄下的體繫結構相關的Makefile
       4. 在s目錄下的 Makefile.* 檔案,是一些Makefile的通用規則
       5. 各級目錄下的大概約500個kbuild Makefile檔案

頂層的Makefile檔案讀取 .config檔案的內容,並總體上負責build核心和模組。Arch Makefile則提供補充體繫結構相關的資訊。 s目錄下的Makefile檔案包含了所有用來根據kbuild Makefile 構建核心所需的定義和規則。


Kbuild Makefile
對於Makefiles的不同組成部分,有一些不同的文法規則。針對的對象也不同,對於大部分核心模組或裝置驅動的開發人員和使用者來說,最常接觸到的就是各層目錄下基於kbuild架構的kbuild Makefile檔案。Kbuild 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目錄列入向下迭代的目標中。

----------------------------------------------------------------------------------------------

模組的編譯

編譯模組的時候,你可以將模組放在代碼樹中,用Make modules的方式來編譯你的模組
此時Makefile內容很簡單,例如:obj-$(CONFIG_EXT2) += ext2.o 即可。

也可以將模組相關檔案目錄放在代碼樹以外的位置,用如下命令來編譯模組:
make -C <path to kernel src> M=$PWD modules

‘-C’指定代碼樹的位置,M=$PWD 或 M=`PWD` 告訴kbuild回到目前的目錄來執行build操作。
當然,我們也可以為其寫一個Makefile,這裡介紹一個教通用的Makefile(2.6版本):

# Makefile2.6
ifneq ($(KERNELRELEASE),)
#kbuild syntax. dependency relationshsip of files and target modules are listed here.

obj-m := hello.o
hello-objs := hello.o  
else
PWD := $(shell pwd)
KDIR := /lib/modules/$(shell uname -r)/build
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions
endif

此例子驅動目錄叫做hello,實際中需要將下面的hello換成自己的目錄名稱。其中代碼樹路徑是自動擷取的。之後在目錄下直接執行make命令即可,不再用敲上面一大長串命令。

----------------------------------------------------------------------------------------------

在添加新驅動時,需要建立Kconfig、Makefile檔案,且需要修改父目錄Kconfig、Makefile這兩個檔案以便將自己的驅動包含進去。例子見:為Android核心添加新驅動,並添加到menuconfig菜單【實踐簡記】

在linux2.6.x/Documentation/kbuild目錄下有周詳的介紹有關kconfig、makefile的知識。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.