.config 和 kconfig以及 makefile的关系
?當我們編寫完一個驅動后,我們要把它以模塊形式編譯或者直接編譯進內核時,需要修改相關文件,其中最重要的便是kconfig ,makefile。主要是分析一下三者之間的關系,然后就其語法簡要的談一下。當我們在內核源碼目錄下執行make (或者make menuconfig等命令)命令時,實際上是根據makefile 來進行編譯的。我在mini2440開發板上編寫了一個按鍵控制led燈的驅動。文件名為buttons_leds_zhao.c屬于字符驅動。因此在/driver/char/目錄下的makefile部分最后添加一行
obj-$(CONFIG_BUTTONS_LEDS_ZHAO)????? +=?buttons_leds_zhao.o
如下:
obj-y += mem.o random.o tty_io.o n_tty.o tty_ioctl.o?tty_ldisc.o tty_buffer.o tty_port.o
obj-$(CONFIG_BFIN_JTAG_COMM)??? += bfin_jtag_comm.o
obj-$(CONFIG_CONSOLE_TRANSLATIONS) += consolemap.o?consolemap_deftbl.o
obj-$(CONFIG_HW_CONSOLE) += vt.o defkeymap.o
obj-$(CONFIG_AUDIT) += tty_audit.o
obj-$(CONFIG_BUTTONS_LEDS_ZHAO) ?+= buttons_leds_zhao.o
其中第一行obj-y? 中的y表示編譯進內核,而obj-$(CONFIG_LEGACY_PTYS)? 中CONFIG_LEGACY_PTYS則表示一個變量,類似于我們C語言中的變量,用$( )來表示,它一般可以取三種值y ,m ,n.y表示編譯進內核,而m則表示以模塊的方式進行編譯,n表示不編譯進內核。obj-y??? += 等號后面的.o后綴文件則是由該目錄下的對應名稱的.c文件編譯而來。
而上面CONFIG_LEGACY_PTYS變量的取值則是通過.config文件來集中賦值的。.config部分內容如下
# Character devices?
#?
CONFIG_VT=y
CONFIG_CONSOLE_TRANSLATIONS=y
CONFIG_VT_CONSOLE=y
CONFIG_HW_CONSOLE=y
# CONFIG_VT_HW_CONSOLE_BINDING is not set
# CONFIG_DEVKMEM is not set
CONFIG_MINI2440_HELLO_MODULE=m
CONFIG_BUTTONS_LEDS_ZHAO=m
CONFIG_LEDS_MINI2440=m
CONFIG_MINI2440_BUTTONS=m
CONFIG_MINI2440_BUZZER=y
CONFIG_MINI2440_ADC=y
# CONFIG_SERIAL_NONSTANDARD is not set
???? 從上面幾行我們可以看到,在makefile里面的變量都是在.config中賦值的。當我們在源代碼目錄下輸入make命令時,都是默認從.config中讀入。因此,在輸入make之前,用ls? -a 查看一下是否有該文件。對于只包含幾個文件的工程來說,手動寫.config和makefile并不是一件很難的事情,但如果是一個包含有幾百個文件的項目來說,則是一件比較困難的事情。可以用autoconf來自動生成.config,automake來制作makefile。看起來問題是解決的,但實際上,這種做法缺乏一定的靈活性,不能實現按需定制的要求。如果要添加或刪掉某個驅動,將要在.config文件中找到相應的項進行修改。非常的不方便。因此,便出現了kconfig。
當我們在內核源碼目錄下輸入make menuconfig時,出現如下內容:
.config - Linux Kernel v2.6.32.2 Configuration?
──────────────────────────────────────────────────────────────────────────────────────────────────
┌──────────────────────────────── Linux Kernel Configuration ─────────────────────────────────┐?
│? Arrow keys navigate the menu.? <Enter> selects submenus --->.? Highlighted letters are???? │?
│? hotkeys.? Pressing <Y> includes, <N> excludes, <M> modularizes features.? Press <Esc><Esc> │?
│? to exit, <?> for Help, </> for Search.? Legend: [*] built-in? [ ] excluded? <M> module???? │?
│? < > module capable???????????????????????????????????????????????????????????????????????? │?
│ ┌─────────────────────────────────────────────────────────────────────────────────────────┐ │?
│ │???????????? General setup? --->???????????????????????????????????????????????????????? │ │?
│ │???????? [*] Enable loadable module support? --->??????????????????????????????????????? │ │?
│ │???????? -*- Enable the block layer? --->??????????????????????????????????????????????? │ │?
│ │???????????? System Type? --->?????????????????????????????????????????????????????????? │ │?
│ │???????????? Bus support? --->?????????????????????????????????????????????????????????? │ │?
│ │???????????? Kernel Features? --->?????????????????????????????????????????????????????? │ │?
│ │???????????? Boot options? --->????????????????????????????????????????????????????????? │ │?
│ │???????????? CPU Power Management? --->????????????????????????????????????????????????? │ │?
│ │???????????? Floating point emulation? --->????????????????????????????????????????????? │ │?
│ │???????????? Userspace binary formats? --->????????????????????????????????????????????? │ │?
│ │???????????? Power management options? --->????????????????????????????????????????????? │ │?
│ │???????? [*] Networking support? --->??????????????????????????????????????????????????? │ │?
│ │???????????? Device Drivers? --->??????????????????????????????????????????????????????? │ │?
│ │???????????? File systems? --->????????????????????????????????????????????????????????? │ │?
│ └─────────┴(+)────────────────────────────────────────────────────────────────────────────┘ │?
├─────────────────────────────────────────────────────────────────────────────────────────────┤
│????????????????????????????? <Select>??? < Exit >??? < Help >?????????????????????????????? │?
└─────────────────────────────────────────────────────────────────────────────────────────────┘
????????????? 它是通過讀取在內核源碼目錄下的Kconfig文件來配置的。在/drivers/char/下的目錄kconfig部分內容如下:
config DEVKMEM?
??????? bool "/dev/kmem virtual device support"?
??????? default y?
??????? help?
????????? Say Y here if you want to support the /dev/kmem device. The?
????????? /dev/kmem device is rarely used, but can be used for certain?
????????? kind of kernel debugging operations.?
????????? When in doubt, say "N".
config MINI2440_HELLO_MODULE?
??????? tristate "Mini2440 module sample"?
??????? depends on MACH_MINI2440?
??????? default m if MACH_MINI2440?
??????? help?
????????? Mini2440 module sample.
config BUTTONS_LEDS_ZHAO?
??????? tristate "Mini2440 button? and leds sample"?
??????? depends on MACH_MINI2440?
??????? default m if MACH_MINI2440?
??????? help?
????????? Mini2440? button and leds? module sample.
其具體語法格式說明如下:
config關鍵字是一個新的配置選項的入口???? 其后的選項MINI2440_HELLO_MODULE省略了CONFIG。完整的表示為CONFIG_MINI2440_HELLO_MODULE,也即是當我們將該選項設置成y時,它將自動的將.config的CONFIG_MINI2440_HELLO_MODULE=m改寫成CONFIG_MINI2440_HELLO_MODULE=y。
緊接著的是菜單的屬性 最主要的有2種tristate ,boolean 。tristate表示三態:編譯進內核(y),編譯成模塊(m),不編譯(n)。boolean 主要有兩種y或ndepend則表示依賴項? default缺省的編譯選項 m表示默認該文件表示以模塊方式編譯。后面的help是幫助信息,當我們選中help菜單時就可以看見,它不是必需的。隨著操作系統升級,編譯選項
達到幾千個。對于一般人來說,要搞清每一個選項是很困難的,一般很多選項都是默認的。
??????? 總的來說,三者之間的關系如下:當我們在內核源碼目錄下輸入makemenuconfig時,在出現的菜單界面中選擇一項時,它會自動跟新.config相應項的值。如果我們沒有選擇,則會在.config問下插入一行注釋。類似于# CONFIG_SERIAL_NONSTANDARD is not set,當我們輸入make時,根據makefile文件來編譯,makefile文件中的變量值則由.config來進行賦值操作。僅僅只在kconfig中添加選項,只會在菜單界面中顯示,即使此時選擇y或m,也不會編譯文件。還需要在makefile文件中按照規定添加相應行才能進行編譯。簡單圖解如下:
???????????
kconfig------->.config---------->makefile
總結
以上是生活随笔為你收集整理的.config 和 kconfig以及 makefile的关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 日本厂商称创造全球首款智慧笔记本 网友:
- 下一篇: 支付宝和微信的区别,以及各自的优缺点