Kconfig文件說明


Kconfig的格式

下面截取/drivers/net下的Kconfig文件中的部分內容:

# Network device configuration
menuconfig NETDEVICES
        default y if UML
        depends on NET
        bool "Network device support"
        ---help---
          You can say N here if you don't intend to connect your Linux box to any other computer at all.
……
config DM9000
        tristate "DM9000 support"
        depends on ARM || BLACKFIN || MIPS
        select CRC32
        select MII
        ---help---
          Support for DM9000 chipset.

          To compile this driver as a module, choose M here.  The module will be called dm9000.
……
source "drivers/net/arcnet/Kconfig"
source "drivers/net/phy/Kconfig"

Kconfig按照一定的格式來書寫,menuconfig程序可以識別這種格式,然后從中提取出有效信息組成menuconfig中的菜單項。將來在做驅動移植等工作時,有時需要自己添加Kconfig中的一個配置項來將某個設備驅動添加到內核的配置項目中,這時候就需要對Kconfig的配置項格式有所了解,否則就不會添加。

menuconfig:表示菜單(本身屬於一個菜單中的項目,但是他又有子菜單項目)、config表示菜單中的一個配置項(本身並沒有子菜單下的項目)。一個menuconfig后面跟着的所有config項就是這個menuconfig的子菜單。這就是Kconfig中表示的目錄關系。

NETDEVICES:menuconfig或者config后面空格隔開的大寫字母表示的類似於 NETDEVICES 的就是這個配置項的配置項名字,這個字符串前面添加CONFIG_后就構成了“.config”文件中的配置項名字。

source:內核源碼目錄樹中每一個Kconfig都會用source引入其所有子目錄下的Kconfig,從而保證了所有的Kconfig項目都被包含進menuconfig中。這個也說明了:如果你自己在linux內核中添加了一個文件夾,一定要在這個文件夾下創建一個Kconfig文件,然后在這個文件夾的上一層目錄的Kconfig中source引入這個文件夾下的Kconfig文件。

tristate:意思是三態(3種狀態,對應Y、N、M三種選擇方式),意思就是這個配置項可以被三種選擇。

bool:是要么真要么假(對應Y和N)。意思是這個配置項只能被2種選擇。

depends:意思是本配置項依賴於另一個配置項。如果那個依賴的配置項為Y或者M,則本配置項才有意義;如果依賴的哪個配置項本身被設置為N,則本配置項根本沒有意義。depends項會導致make menuconfig的時候找不到一些配置項。所以在menuconfig中如果找不到一個選項,但是這個選項在Kconfig中卻是有的,則可能的原因就是這個配置項依賴的一個配置項是不成立的。depends依賴的配置項可以是多個,還可以有邏輯運算。這種時候只要依賴項目運算式子的結果為真則依賴就成立。

select:表示depends on的值有效時,下面的select也會成立,將相應的內容選上。

default:表示depends on的值有效時,下面的default也會成立,將相應的選項選上,有三種選項,分別對應y,n,m。

help:幫助信息,解釋這個配置項的含義,以及如何去配置他。

 

Kconfig和.config文件和Makefile三者的關聯

配置項被配置成Y、N、M會影響“.config”文件中的CONFIG_XXX變量的配置值。“.config”中的配置值(=y、=m、沒有)會影響最終的編譯鏈接過程。如果=y則會被編入(built-in),如果=m會被單獨連接成一個”.ko”模塊,如果沒有則對應的代碼不會被編譯。那么這是怎么實現的?都是通過makefile實現的。

如makefile中:obj-$(CONFIG_DM9000) += dm9000.o, 
如果CONFIG_DM9000變量值為y,則obj += dm9000.o,因此dm9000.c會被編譯;如果CONFIG_DM9000變量未定義,則dm9000.c不會被編譯。如果CONFIG_DM9000變量的值為m則會被連接成“.ko”模塊


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM