Makefile .config kconfig的異同

  
  • 博客訪問: 298157
  • 博文數量: 127
  • 博客積分: 1029
  • 博客等級: 准尉
  • 技術積分: 1014
  • 用 戶 組: 普通用戶
  • 註冊時間: 2012-02-13 00:15
文章分類

全部博文(127)

文章存檔

2014年(25)

2013年(45)

2012年(57)

微信關注

IT168企業級官微



微信號:IT168qiye



系統架構師大會



微信號:SACC2013

訂閱

分類: 嵌入式

    當我們編寫完一個驅動後,我們要把它以模塊形式編譯或者直接編譯進內核時,需要修改相關文件,其中最重要的便是kconfig ,makefile。
主要是分析一下三者之間的關係,然後就其語法簡要的談一下。 
    當我們在內核源碼目錄下執行make (或者make menuconfig等命令)命令時,實際上是根據makefile 來進行編譯的。
    在mini2440開發板上編寫了一個按鍵控制led燈的驅動。文件名爲buttons_leds.c屬於字符驅動,因此在/driver/char/目錄下的makefile部分最後添加一行
obj-$(CONFIG_BUTTONS_LEDS)      += buttons_leds.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)    += buttons_leds.o

其中第一行obj-y  中的y表示編譯進內核,而obj-$(CONFIG_BUTTONS_LEDS)  中CONFIG_BUTTONS_LEDS則表示一個變量,類似於我們C語言中的變量,用$( )來表示,它一般可以取三種值y ,m ,n。y表示編譯進內核,而m則表示以模塊的方式進行編譯,n表示不編譯進內核。obj-y    += 等號後面的.o後綴文件則是由該目錄下的對應名稱的.c文件編譯而來。
上面CONFIG_BUTTONS_LEDSS變量的取值則是通過.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=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.  selects submenus --->.  Highlighted letters are  hotkeys.  Pressing includes, excludes, modularizes features.  Press   to exit, for Help, for Search.  Legend: [*] built-in  [ ] excluded  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  --->                                                       │
│ └─────────┴(+)───────────────────────────────│ 
├────────────────────────────────────────────┤ 
│                              

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章