Linux/Android Kconfig Makefile defconfig 和 .config关系
點擊打開鏈接
在進行Android?L-》M升級時遇到打印:
Root cause is probably that a dependancy declared in Kconfig is not respected
or config was added in Kconfig but value not explicitly added to defconfig.
Recommanded method to generate defconfig is menuconfig tool instead of manual edit.
找了好多資料,上面的提示就是移植的時候將很多config配置項弄錯了,有的沒有定義的配置項弄到***defconfig中去了。
簡單概要:
Makefile和Kconfig存在系統中的多個子目錄中, Kconfig是定義配置項,Makefile是建立配置項生成法則。
.config存在根目錄中,一般通過menuconfig生成。一般在/arm/configs/xxxxxx_defconfig目錄下的文件是系統默認配置,android編譯的時候會將這個文件生成.config文件,同時編譯系統會根據各個Kconfig的配置項生成一個.config.old文件,如果這兩個文件不沖突則編譯繼續進行,否則提示上面的錯誤。
所以,可以根據生成的 .config(在kernel根目錄下)來修改xxxdefconfig文件,或者修改Kconfig中某些項的默認值或者定義規則。
在linux中和編譯有關的配置文件有:
makefile:
Kconfig:
.config:全局的配置文件,由它決定makefile來編譯哪些文件,一般是自動生成。?
在實際判斷使用哪些配置選項時,不會直接修改.config文件,而且通過使用圖形化界面(menuconfig)來配置內核,并把配置的結果保存成.config文件。
在編譯內核時,就根據makefile和.config選擇編譯哪些文件。
每個開發平臺都有一個可供參考的配置文件,如arch/arm/configs/xxxxxx_defconfig目錄下的文件,都是硬件廠商提供的,針對硬件平臺的配置文件。
當我們執行make menuconfig就會讀取源碼目錄下所有Kconfig內容,并生成界面中的選項菜單
關于kconfig的語法,在內核的開發文檔中有詳細的介紹,具體可以參看\Documentation\kbuild\kconfig-language.txt
Kconfig語法
?menu/endmenu???? 生成一個菜單,以endmenu結束
?menuconfig?????? 定義一個配置選項,在這個選項下面還有一個子菜單
?config?????????? 定義一個配置選項
?choice/endchoice 定義一個選擇項
?source?????????? 調用子目錄下的Kconfig,生成一個子菜單
?
?菜單屬性:
?bool???? y/n:?
?tristate y/n/M: M表示編譯成模塊
?string
?hex
?int
?
?配置選項之間的依賴關系:
?depend on:某選項依賴于另外一個選項生成
?select?? :反向依賴關系,該選項選中時,同時選中select后面定義的那一項
?requie
?默認值: default(默認y/n/m等值)
?輸入提示:prompt
?幫助信息:help
?
?Makefile
1.頂層的Makefile文檔讀取 .config文檔的內容,并總體上負責build內核和模塊。
2.Arch Makefile則提供補充體系結構相關的信息。?
3.scripts目錄下的Makefile文檔包含了任何用來根據kbuild Makefile 構建內核所需的定義和規則。
??????????? 其中.config的內容是在make menuconfig的時候,通過Kconfig文檔配置的結果,在/Documentation/kbuild目錄下有詳細的介紹有關kernel makefile的知識。
舉個例子:
假設想把G-sensor LSM303D驅動code加載到工程中,配置內核時該怎么辦呢?
1:將您寫的lsm303d.c 文檔添加到/driver/misc/ 目錄下。
2:修改/driver/misc/ 目錄下的kconfig文檔:
[html] view plain copy
??? config SENSORS_LSM303D ?
??????????? tristate "LSM303 sensor driver" ?
??????????? depends on I2C=y ?
??????????? help ?
????????????? Say yes here to support the sensor ?
3:修改該目錄下makefile文檔。
添加code:
[html] view plain copy
??? obj-$(CONFIG_SENSORS_LSM303D)?? += lsm303d.o ?
從上述分析知道CONFIG_SENSORS_LSM303D 是從.config 中讀出的。
4.配置kernel下configs/XXXX_defconfig文件
添加code:
[html] view plain copy
??? CONFIG_SENSORS_LSM303D=y ?
當您編譯內核時,將會讀取.config文檔,當發現CONFIG_SENSORS_LSM303D=y,系統在調用/driver/misc下的makefile 時,將會把 lsm303d.o 加入到內核中。即可達到您的目的。
總結
以上是生活随笔為你收集整理的Linux/Android Kconfig Makefile defconfig 和 .config关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是menuconfig和menuco
- 下一篇: 用shell写了一个自动编译代码的脚本