當我們執行make menuconfig
時,系統到底幫我們做了什麼?
這裏面一共涉及到了以下幾個文件,下面我們逐個的講解:
-
Linux內核根目錄下的
scripts
文件夾 -
arch/$ARCH/Kconfig
文件、各層目錄下的Kconfig
文件 -
Linux內核根目錄下的
makefile
文件、各層目錄下的makefile
文件 -
Linux內核根目錄下的的
.config
文件、arch/$ARCH/
下的.config
文件 -
Linux內核根目錄下的
include/generated/autoconf.h
文件
一、scripts
文件夾下存放的是跟make menuconfig
配置界面的圖形繪製相關的文件,我們作爲使用者無需關心這個文件夾的內容
二、當我們執行make menuconfig
命令出現藍色配置界面以前,系統幫我們做了以下工作:
- 系統會讀取
arch/$ARCH/
目錄下的Kconfig
文件生成整個配置界面選項(Kconfig
是整個linux
配置機制的核心)
那麼ARCH
環境變量的值等於多少呢?它是由linux內核
根目錄下的makefile
文件決定的,在makefile
下有此環境變量的定義:
或者通過 make ARCH=arm menuconfig
命令來生成配置界面,默認生成的界面是所有參數都是沒有值的.
比如教務處進行考試,考試科數可能有外語、語文、數學等科,這裏相當於我們選擇了arm科
可進行考試,系統就會讀取arch/arm/Kconfig
文件生成配置選項。系統還提供了x86科
、mips科
等很多門功課的考試題。
三、假設教務處比較“仁慈”,還給我們準備了一份參考答案(默認配置選項),存放在arch/$ARCH/configs
下,對於arm科
來說就是arch/arm/configs
文件夾:
此文件夾中有許多選項,系統會讀取哪個呢?
內核默認會讀取linux內核根目錄下.config
文件作爲內核的默認選項(試題的參考答案),我們一般會根據開發板的類型從中選取一個與我們開發板最接近的系列到Linux內核根目錄下(選擇一個最接近的參考答案)
cp arch/arm/configs/s3c2410_defconfig .config
四、config
假設教務處留了一個心眼,他提供的參考答案並不完全正確(.config
文件與我們的板子並不是完全匹配),這時我們可以選擇直接修改.config
文件然後執行make menuconfig
命令讀取新的選項。
但是一般我們不採取這個方案,我們選擇在配置界面中通過空格
、Esc
、回車
選擇某些選項選中或者不選中,最後保存退出的時候,Linux內核會把新的選項(正確的參考答案)更新到.config
中,此時我們可以把.config
重命名爲其它文件保存起來(當你執行make distclean
時系統會把.config
文件刪除),以後我們再配置內核時就不需要再去arch/arm/configs
下考取相應的文件了,省去了重新配置的麻煩,直接將保存的.config
文件複製爲.config
即可。
五、經過以上的步驟,我們就可以正確的讀取、配置我們需要的界面了
那麼他們如何跟makefile文件建立編譯關係呢?
當你保存make menuconfig
選項時,系統除了會自動更新.config
外,還會將所有的選項以宏的形式保存在Linux內核根目錄下的 include/generated/autoconf.h
文件下
內核中的源代碼都會包含以上.h
文件,根據宏的定義情況進行條件編譯。當我們需要對一個文件有選擇是否編譯的功能時,還需要修改對應的makefile
文件,例如:
我們選擇是否要編譯s3c2410_ts.c
這個文件時,makefile
會根據CONFIG_TOUCHSCREEN_S3C2410
來決定是編譯此文件,此宏是在Kconfig
文件中定義,當我們配置完成後,會出現在.config
及autoconf.h
中。至此,以上列舉出來的文件我們都已經提到了。
六、總結
最後我們會發現,整個linux內核配置過程中,留給用戶的接口其實只有各層Kconfig
、makefile
文件以及對應的源文件
。比如我們如果想要給內核增加一個功能,並且通過make menuconfig
控制其生成過程:
- 首先需要做的工作是:修改對應目錄下的
Kconfig
文件,按照Kconfig
語法增加對應的選項 - 其次執行
make menuconfig
選擇編譯進內核或者不編譯進內核,或者編譯爲模塊,.config
文件和autoconf.h
文件會自動生成; - 最後修改對應目錄下的
makefile
文件完成編譯選項的添加 - 最後的最後執行
make zImage
命令進行編譯