您的位置:首页 > 运维架构 > Linux

Linux/Android Kconfig Makefile defconfig 和 .config关系

2016-04-01 14:07 537 查看
在进行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 加入到内核中。即可达到您的目的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: