1. 程式人生 > 其它 >make menuconfig、Makefile、Kconfig和.config

make menuconfig、Makefile、Kconfig和.config

技術標籤:Linux驅動程式設計

Linux核心原始碼檔案繁多,搞不清Makefile、Kconfig、.config間的關係,不瞭解核心編譯體系,編譯修改核心有問題無從下手,自己寫的驅動不知道怎麼編進核心,不知道怎麼配置核心,這些問題都和Makefile、Kconfig、.config有關,下面簡單談談Makefile、Kconfig和.config。

三者的作用:

1.deconfig 檔案:

一般由平臺廠商提供,核心編譯用做.config的參考,注意:如果,缺少該檔案,無法進行編譯。

檔案位於:/kernel/…/arch/arm/configs/xxx_defconfig

2.kconfig

分佈在各目錄下的Kconfig構成了一個分散式的核心配置資料庫,每個Kconfig分別描述了所屬目錄原始檔相關的核心配置選單。在核心配置make menuconfig(或xconfig等)時,從Kconfig中讀出配置選單,使用者配置完後儲存到.config(在頂層目錄下生成)中。

3.makefile

分佈在各個目錄下,用於整合編譯。

4.config 檔案

在核心編譯時,主Makefile呼叫這個.config,用於或者用於的核心編譯配置。當我們在核心原始碼目錄下輸入make menuconfig時,在出現的選單介面中選擇一項時,它會自動更新.config相應項的值。如果我們沒有選擇,則會在.config問下插入一行註釋(# CONFIG_TOUCHSCREEN_GT9xx is not set)

檔案位於 :kernel/…/out/xxx_defconfig/.config

defconfig----->.config (第二步)

kconfig------->.config---------->makefile(第三步)

三者的語法

Makefile
參考:linux-3.4.2/drivers/Makefile
作用:用來定義哪些內容作為模組編譯,哪些條件編譯等。子目錄Makefile被頂層Makefile包含。

(1)直接編譯
obj-y +=xxx.o
表示由xxx.c或xxx.s編譯得到xxx.o並直接編進核心。

(2)條件編譯
obj-$(CONFIG_HELLO) += xxx.o

根據.config檔案的CONFIG_XXX來決定檔案是否編進核心。

(3)模組編譯
obj-m +=xxx.o
表示xxx作為模組編譯,即執行make modules時才會被編譯。

2、Kconfig
每個config選單項都有型別定義: bool布林型別、 tristate三態(內建、模組、移除)、string字串、 hex十六進位制、integer整型。
作用:決定make menuconfig時展示的選單項,

參考:linux-3.4.2/drivers/LEDs/kconfig:
configLEDS_S3C24XX
tristate"LED Support for Samsung S3C24XX GPIO LEDs"
dependson LEDS_CLASS
dependson ARCH_S3C24XX
help
Thisoption enables support for LEDs connected to GPIO lines
onSamsung S3C24XX series CPUs, such as the S3C2410 and S3C2440.

LEDS_S3C24XX:配置選項的名稱,省略了字首"CONFIG_"

Tristate:
表示該項是否編進核心、編成模組。顯示為< > , 假如選擇編譯成核心模組,則會在.config中生成一個 CONFIG_HELLO_MODULE=m的配置,選擇Y就是直接編進核心,會在.config中生成一個 CONFIG_HELLO_MODULE=y的配置項。Tristate後的字串是make menuconfig時顯示的配置項名稱。

bool:
此型別只能選中或不選中,make menuconfig時顯示為[ ],即無法配置成模組。

dependon:
該選項依賴於另一個選項,只有當依賴項被選中時,當前配置項的提示資訊才會出現,才能設定當前配置項。

select:
反向依賴關係,該選項選中時,同時選中select後面定義的那一項。

help:
幫助資訊。

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

3、.config
參考:linux-3.4.2/.config
通過前倆個檔案的分析,.config的含義已經很清晰:核心編譯參考檔案,檢視裡面內容可以知道哪些驅動被編譯進核心。

配置核心方式有3種(任選其一):
(1)makemenuconfig
(2)makexxx_defconfig
(3)直接修改.config

注意: 如果直接修改.config,不一定會生效,因為有些配置可能存在依賴關係,make時會根據依賴關係,進行規則的檢查,直接修改.config有時無效,所以不推薦直接修改。

make menuconfig流程

轉自這裡

當我們在執行make menuconfig這個命令時,系統到底幫我們做了哪些工作呢?

這裡面一共涉及到了一下幾個檔案我們來一一講解

Linux核心根目錄下的scripts資料夾

arch/$ARCH/Kconfig檔案、各層目錄下的Kconfig檔案

Linux核心根目錄下的makefile檔案、各層目錄下的makefile檔案

Linux核心根目錄下的的.config檔案、arm/$ARCH/下的config檔案

Linux核心根目錄下的 include/generated/autoconf.h檔案

1)scripts資料夾存放的是跟make menuconfig配置介面的圖形繪製相關的檔案,我們作為使用者無需關心這個資料夾的內容

2)當我們執行make menuconfig命令出現上述藍色配置介面以前,系統幫我們做了以下工作:

首先系統會讀取arch/$ARCH/目錄下的Kconfig檔案生成整個配置介面選項(Kconfig是整個linux配置機制的核心),那麼ARCH環境變數的值等於多少呢?

它是由linux核心根目錄下的makefile檔案決定的,在makefile下有此環境變數的定義:

或者通過 make ARCH=arm menuconfig命令來生成配置介面,預設生成的介面是所有引數都是沒有值的

比如教務處進行考試,考試科數可能有外語、語文、數學等科,這裡相當於我們選擇了arm科可進行考試,系統就會讀取arm/arm/kconfig檔案生成配置選項(選擇了arm科的卷子),系統還提供了x86科、milps科等10幾門功課的考試題

3)假設教務處比較“仁慈”,為了怕某些同學做不錯試題,還給我們準備了一份參考答案(預設配置選項),存放在arch/$ARCH/configs下,對於arm科來說就是arch/arm/configs資料夾:
在這裡插入圖片描述
此資料夾中有許多選項,系統會讀取哪個呢?核心預設會讀取linux核心根目錄下.config檔案作為核心的預設選項(試題的參考答案),我們一般會根據開發板的型別從中選取一個與我們開發板最接近的系列到Linux核心根目錄下(選擇一個最接近的參考答案)

#cp arch/arm/configs/s3c2410_defconfig .config

4).config

假設教務處留了一個心眼,他提供的參考答案並不完全正確(.config檔案與我們的板子並不是完全匹配),這時我們可以選擇直接修改.config檔案然後執行make menuconfig命令讀取新的選項

但是一般我們不採取這個方案,我們選擇在配置介面中通過空格、esc、回車選擇某些選項選中或者不選中,最後儲存退出的時候,Linux核心會把新的選項(正確的參考答案)更新到.config中,此時我們可以把.config重新命名為其它檔案儲存起來(當你執行make distclean時系統會把.config檔案刪除),以後我們再配置核心時就不需要再去arch/arm/configs下考取相應的檔案了,省去了重新配置的麻煩,直接將儲存的.config檔案複製為.config即可.