总体概述
配置详解
配置的最终目的,是生成了.config
文件,查看下这个文件,
#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.22.6
# Wed Dec 30 18:30:33 2009
#
CONFIG_ARM=y
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
CONFIG_GENERIC_GPIO=y
# CONFIG_GENERIC_TIME is not set
# CONFIG_GENERIC_CLOCKEVENTS is not set
CONFIG_MMU=y
CONFIG_NO_IOPORT=y
CONFIG_GENERIC_HARDIRQS=y
.....
CONFIG_DM9000=y #来分析这个配置项目
其中都是一些xxx=y,yyy=m,zzz=一个数值等配置项这些,区别:若是=y的话,该项会被编译进内核;若是=m的话,该项会被编译为一个模块,这个模块以后可以动态加载。下面取其中一行 CONFIG_DM9000=y
来分析,先搜索下包含CONFIG_DM9000
文件内容
grep "CONFIG_DM9000" * -nwR
搜索后会发现含有“CONFIG_DM9000”配置项的文件主要是:
①c源码里有:CONFIG_DM9000
②子目录的Makefile(drivers/net/Makefile)里有:CONFIG_DM9000
③include/config/auto.conf里有:CONFIG_DM9000
④include/linux/autoconf.h里有:CONFIG_DM9000
这些文件之间以及与.config配置文件之间的关系是怎样的?下面逐一分析:
- 1、忽略掉默认配置文件(以defconfig命名的),可以看到c代码含有
CONFIG_DM9000
,从c语言语法上可知CONFIG_DM9000应该是一个宏,
这些宏肯定是在c文件中或者头文件中定义,这里的宏其实是来源于下面第4点中的include/linux/autoconf.h
arch/arm/plat-s3c24xx/common-smdk.c:46:#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
arch/arm/plat-s3c24xx/common-smdk.c:162:#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
arch/arm/plat-s3c24xx/common-smdk.c:200:#endif /* CONFIG_DM9000 */
arch/arm/plat-s3c24xx/common-smdk.c:250:#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
- 2、子目录下的Makefile(drivers/net/Makefile)中含有
CONFIG_DM9000,下面
第4点中对于=Y和=M的差别体现不出来,其实这些差别是在这里的makefile(子目录下的makefile)中体现的,这里会区分是编译为模块(=M)还是编译为内核(=Y),这里子目录下的CONFIG_DM9000是在下面第3点
include/config/auto.conf中定义的。
drivers/net/Makefile:197:obj-$(CONFIG_DM9000) += dm9dev9000c.o
drivers/net/Makefile:198:#obj-$(CONFIG_DM9000) += dm9000.o
drivers/net/Makefile:199:#obj-$(CONFIG_DM9000) += dm9ks.o
插讲:子目录下的Makefile格式:
子目录的Makefile格式比较简单,一般都是obj_y += xxx.o或者obj_m += yyy.o,这表示该子目录下的xxx.c会被编译进内核去,yyy.c会被编译为yyy.ko作为一个可加载的模块。比如obj-$(CONFIG_DM9000) +=dm9dev9000c.o,若这里CONFIG_DM9000被第3点
include/config/auto.conf定义为CONFIG_DM9000=y的话,则有obj-y +=dm9dev9000c.o,dm9dev9000c.c会被编译进内核。
- 3、在include/config/auto.conf下含有
CONFIG_DM9000,
这个文件是自动生成的,内容很明显来源于.config
,上面第2点中根据这个编译模块还是内核.这个文件会被顶层makefile包含,里面的内容最终会被第2点中子目录下的makefile拿来使用。
include/config/auto.conf:144:CONFIG_DM9000=y
- 4、include/linux/autoconf.h里含有
CONFIG_DM9000配置项,这个
头文件是在make内核时,make机制根据.config自动产生的,它里面的内容来源于.config,在.config文件中不论配置项为=Y或者为=M(模块),在autoconf.h中这些配置项都被定义为1,autoconf.h被第1点中提到的源代码所使用,这里体现不出=M与=Y的区别,是在子目录下的Makefile中体现的。
include/linux/autoconf.h:145:#define CONFIG_DM9000 1
//该文件下的内容都是类似的如下
#define CONFIG_DM9000 1
#define CONFIG_SOLARIS_X86_PARTITION 1
#define CONFIG_SERIAL_NONSTANDARD 1
#define CONFIG_BLK_DEV_RAM_BLOCKSIZE 1024