列表 上一篇 下一篇

linux内核的kconfig

顶层makefile中kconfig相关代码:

ifeq ($(config-targets),1) # =========================================================================== # *config targets only - make sure prerequisites are updated, and descend # in scripts/kconfig to make the *config target # Read arch specific Makefile to set KBUILD_DEFCONFIG as needed. # KBUILD_DEFCONFIG may point out an alternative default configuration # used for 'make defconfig' include $(srctree)/arch/$(SRCARCH)/Makefile export KBUILD_DEFCONFIG KBUILD_KCONFIG config: scripts_basic outputmakefile FORCE $(Q)mkdir -p include/linux include/config $(Q)$(MAKE) $(build)=scripts/kconfig $@ %config: scripts_basic outputmakefile FORCE $(Q)mkdir -p include/linux include/config $(Q)$(MAKE) $(build)=scripts/kconfig $@ else 无论配置目标是config,还是%config形式的,都依赖于 script_basic 和 outputmakefile两个目标。

分析依赖

先看两个依赖定义: # =========================================================================== # Rules shared between *config targets and build targets # Basic helpers built in scripts/ PHONY += scripts_basic scripts_basic: $(Q)$(MAKE) $(build)=scripts/basic $(Q)rm -f .tmp_quiet_recordmcount # To avoid any implicit rule to kick in, define an empty command. scripts/basic/%: scripts_basic ; PHONY += outputmakefile # outputmakefile generates a Makefile in the output directory, if using a # separate output directory. This allows convenient use of make in the # output directory. outputmakefile: ifneq ($(KBUILD_SRC),) $(Q)ln -fsn $(srctree) source $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \ $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL) endif 1.script_basic
$(Q)$(MAKE) $(build)=scripts/basic,其实就是构建scripts/basic目录,所以该make命令的实际效果是去编译出 scripts/basic 目录下的三个 host program,也就是 fixdep docproc和hash。

2.outputmakefile
其实只在 make 命令带有O 变量时才有用,这里暂不分析。

分析规则

$(Q)mkdir -p include/linux include/config,创建了两个目录
$(Q)$(MAKE) $(build)=scripts/kconfig $@
如果我们的make 命令是 "make s3c2410_defconfig" 的话,这个时候执行的就是:
make -f scripts/Makefile.build obj=scripts/kconfig s3c2410_defconfig
所以看查看scripts/kconfig目录下的makefile。
scripts/kconfig目录下的makefile文件中:

%_defconfig: $(obj)/conf $(Q)$< --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)

需要依赖于同目录下的conf程序。这其实就是Linux内核进行Kconfig操作的主程序之一了,类似的还有mconf,qconf和gconf等。他们其实都是host program。关于它们是如何被编译出来的,还请参见 scripts/kconfig/Makefile 文件,主要是借助于bison,flex和gperf三个工具来生成c源程序文件,之后再编译出来的。

$(Q)$< --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
简化为:
$(obj)/conf -D arch/arm/configs/s3c2410_defconfig arch/arm/Kconfig
这个命令就是读取并解析以 arch/arm/Kconfig 为首的内核功能选项配置文件,并将文件arch/arm/configs/s3c2410_defconfig 所设置的默认值分配给对应的所有选项,最终生成隐藏配置文件 .config所以说是以 arch/arm/Kconfig 为首的,那就说明功能配置选项文件可能有多个。的确如此,你如果打开文件 arch/arm/Kconfig 就会看到它通过source 来包含其他的选项配置文件:

source "net/Kconfig" source "drivers/Kconfig" source "fs/Kconfig" source "arch/arm/Kconfig.debug" source "security/Kconfig" source "crypto/Kconfig" source "lib/Kconfig"

在配置的时候,配置工具首先会解析架构平台目录下的 Kconfig,这就是所谓和平台相关的主Kconfig。主Kconfig文件会包含其他目录的Kcofnig文件,而其他目录的Kconfig又会包含其他各子目录的 Kconfig。如此形成一个树型结构。

另外需要说一下的,如果你的make 命令是 "make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig",那用到的配置工具将会是 mconf,它同样会读取那些配置选项文件,只不过不同的是,它会show除一个菜单界面,并将这些可设置的选项一一呈现出来,如此我们就可以手动进行设置,而不是让mconf去读取 arch/arm/configs/s3c2410_defconfig 之类的文件进行默认设置了。关于gconf等其他配置工具以及Kconfig文件中具体的选项配置语法,我这里就不再详细叙述了,你可以参考目录 Documentation/kbuild/ 下的文件 kconfig.txt以及 kconfig-language.txt 。关于配置目标,除了这里的 menuconfig 和 s3c2410_defconfig,我们后面还会说到另外一个很重要的配置目标: silentoldconfig 。

总结:

%config: scripts_basic outputmakefile FORCE $(Q)mkdir -p include/linux include/config $(Q)$(MAKE) $(build)=scripts/kconfig $@

1.scripts_basic outputmakefile FORCE

构建host program,也就是 fixdep docproc和hash。

2.$(Q)mkdir -p include/linux include/config创建目录
3.$(Q)$(MAKE) $(build)=scripts/kconfig $@

生成conf类host program,然后将文件 arch/arm/configs/s3c2410_defconfig
所设置的默认值分配给对应的所有选项,
最终生成隐藏配置文件 .config