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

Linux Makefile编译系统之-------.config与arch/$ARCH/configs/${PLATFORM}_defconfig之间的关系

2014-06-09 15:38 501 查看
Documentation/kbuild/Makefiles.txt对内核中Makefile的作用、用法讲解得非常透彻。

.config的产成

----------------------------------

make ${PLATFORM}_defconfig  命令执行后

.config和arch/$ARCH/configs/${PLATFORM}_defconfig之间的关系?

Linux 内核的配置编译都是由顶层目录的 Makefile 整体管理的。顶层目录的 Makefile 定义了配置和编译的规则。关于 Makefile 的具体使用方法可以参考第 3 章的内容,这里重点分析相关的变量和规则。

参考内核源码包中的 Documentation/kbuild/makefiles.txt,可以得到内核使用 Makefile 的详细说明。

在顶层的 Makefile 中,可以查找到如下几行定义的规则。

config %config: scripts_basic outputmakefile FORCE

$(Q)mkdir -p include/linux

$(Q)$(MAKE) $(build)=scripts/kconfig $@

这就是生成内核配置界面的命令规则,它也定义了执行的目标和依赖的前提条件,还有要执行的命令。

这条规则定义的目标为 config %config,通配符%意味着可以包括 config、xconfig、gconfig、menuconfig 和 oldconfig 等。依赖的前提条件是 scripts_basic outputmakefile,这些在 Makefile也是规则定义,主要用来编译生成配置工具。那么这条规则执行的命令就是执行 scripts/kconfig/Makefile 指定的规则。相当于:

make -C scripts/kconfig/ config

或者

make -C scripts/kconfig/ %config

这两行命令是使用配置工具解析 arch/$(ARCH)/Kconfig 文件,生成内核配置菜单。$(ARCH)变量是 Linux 体系结构定义,对应 arch 目录下子目录的名称。Kconfig 包含了内核配置菜单的内容,那么 arch/$(ARCH)/Kconfig 是配置主菜单的文件,调用管理其他各级Kconfig。根据配置工具的不同,内核也有不同的配置方式。有命令行方式,还有图形界面方式。

表 7.2 是各种内核配置方式的说明。

配置方式 功能

config 通过命令行程序更新当前配置

menuconfig 通过菜单程序更新当前配置

xconfig 通过QT图形界面更新当前配置

gconfig 通过GTK图形界面更新当前配置

oldconfig 通过已经提供的.config 文件更新当前配置

randconfig 对所有的选项随机配置

defconfig 对所有选项使用缺省配置

allmodconfig 对所有选项尽可能选择“m”

allyesconfig 对所有选项尽可能选择“y”

allnoconfig 对所有选项尽可能选择“n”的最小配置

这些内核配置方式是在 scripts/kconfig/Makefile 中通过规则定义的。从这个 Makefile 中,可以找到下面一些规则定义。如果把变量或者通配符带进去,就可以明白要执行的操作。这里的 ARCH 以 arm 为例来说明。

xconfig: $(obj)/qconf

$< arch/$(ARCH)/Kconfig

执行命令:scripts/kconfig/qconf arch/arm/Kconfig

使用 QT 图形库,生成内核配置界面。arch/arm/Kconfig 是菜单的主配置文件,每种配置方式都需要。

gconfig: $(obj)/gconf

$< arch/$(ARCH)/Kconfig

执行命令:scripts/kconfig/gconf arch/arm/Kconfig

使用 GTK 图形库,生成内核配置界面。

menuconfig: $(obj)/mconf

$(Q)$(MAKE) $(build)=scripts/lxdialog

$< arch/$(ARCH)/Kconfig

执行命令:scripts/kconfig/mconf arch/arm/Kconfig

使用 lxdialog 工具,生成光标配置菜单。因为 mconf 调用 lxdialog 工具,所以需要先编译 scripts/lxdialog 目录。

config: $(obj)/conf

$< arch/$(ARCH)/Kconfig

执行命令:scripts/kconfig/conf arch/arm/Kconfig,完全命令行的内核配置方式。

oldconfig: $(obj)/conf

$< -o arch/$(ARCH)/Kconfig

执行命令:scripts/kconfig/conf -o arch/arm/Kconfig

完全命令行的内核配置方式。使用“-o”选项,直接读取已经存在的.config 文件,要求确认内核新的配置项。

silentoldconfig: $(obj)/conf

$< -s arch/$(ARCH)/Kconfig

执行命令:scripts/kconfig/conf -s arch/arm/Kconfig

完全命令行的内核配置方式。使用“-s”选项,直接读取已经存在的.config 文件,提示但不要求确认内核新的配置项。

%_defconfig: $(obj)/conf

$(Q)$< -D arch/$(ARCH)/configs/$@ arch/$(ARCH)/Kconfig

执行命令:scripts/kconfig/conf -D arch/arm/configs/%_defconfig arch/arm/Kconfig

完全命令行的内核配置方式。读取缺省的配置文件 arch/arm/configs/%_defconfig,另存成.config 文件。通过上述各种都可以完成配置内核的工作,在顶层目录下生成.config 文件。这个.config文件保存大量的内核配置项,.config 会自动转换成 include/linux/autoconf.h 头文件。在include/linux/config.h 文件中,将包含使用 include/linux/autoconf.h 头文件。

配置工具

不同的内核配置方式,分别通过不同的配置工具来完成。scripts 目录下提供了各种内核

配置工具,表 7.3 是这些工具的说明。

表 7.3 内核配置工具说明

配 置 工 具 Makefile 相关目标 依赖的程序和软件

conf defconfig oldconfig ... conf.c zconf.tab.c

mconf menuconfig mconf.c zconf.tab.c,调用 scripts/lxdialog/lxdialog

qconf xconfig qconf.c kconfig_load.c zconf.tab.c,基于 QT 软件包实现图形界面

gconf gconfig gconf.c kconfig_load.c zconf.tab.c,基于 GTK 软件包实现图形界面

其中 zconf.tab.c 程序实现了解析 Kconfig 文件和内核配置主要函数。

zconf.tab.c 程序还直

接包含了下列一些 C 程序,这样各种配置功能都包含在 zconf.tab.o 目标文件中了。

#include "lex.zconf.c" //lex 语法解析器

#include "util.c" //配置工具

#include "confdata.c" //.config 等相关数据文件保存

#include "expr.c" //表达式函数

#include "symbol.c" //变量符号处理函数

#include "menu.c" //菜单控制函数

理解这些工具的使用,可以更加方便地配置内核。至于这些工具的源代码实现,一般没

有必要去详细分析。

make defconfig执行过程:

创建一个包含全部默认选项的.config文件,从arch/$ARCH/defconfig或

arch/$ARCH/configs/${PLATFORM}_defconfig获取,依赖于体系结构。

如果没有defconfig就去找${PLATFORM}_defconfig,前提是变量PLATFORM

和ARCH已经赋值。如果PLATFORM没有赋值,最好用下面的命令:

make ${PLATFORM}_defconfig

从arch/$ARCH/configs/${PLATFORM}_defconfig创建一个.config.

最终生成的.config依赖于${PLATFORM}_defconfig,但并不是${PLATFORM}_defconfig的

简单拷贝;就此说明生成.config还依赖其他文件,需要继续研究,找出其他神秘文件!

内核顶层Makefile使用如下宏语句间接包含.config文件,以后就根据.config中定义的各个变量决定编译哪些文件。之所以说是间接包含,是因为包含的是include/config/auto.conf文件,而它是将.config文件中的注释去掉,并根据顶层Makefile中定义的变量增加一些变量而已。

-include include/config/auto.conf

--------------------------------------------

include/config/auto.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd ##KCONFIG_CONFIG定义为.config

config %config

-------------------------------------------

config %config:
scripts_basic outputmakefile FORCE

$(Q)mkdir -p include/linux include/config

$(Q)$(MAKE) $(build)=scripts/kconfig $@ /* 编译生成conf,并执行conf生成.config */

$(vmlinux-dirs)

--------------------------------------------

$(vmlinux-dirs):
prepare scripts

$(Q)$(MAKE) $(build)=$@

.config的生成过程

------------------------------------

linux-2.6.21.7\scripts\kconfig\conf.c

main() -->

check_conf(&rootmenu) -->

menu_is_visible(menu) /* 检测menu是否可见 */

sym_has_value()

sym_is_changable()

make内核的过程中,会编译一个本地的conf(scripts/kconfig/conf)

scripts/kconfig/conf -s arch/$(ARCH)/Kconfig

conf将解析Kconfig最终生成新的.config,此过程用到了原来的.config。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐