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

来源:互联网 发布:软件开发编程招聘 编辑:程序博客网 时间:2024/06/05 05:35

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。


0 0
原创粉丝点击