.config
文件不是简单的从defconfig
复制而来。以这种文本格式存储defconfig
的动机如下:在defconfig
我们可以简单的只声明那些没有默认值的选项(例如,我们修改主板信息)。这种方式我们可以保持defconfig
小而整洁。每个新的内核版本都会带来一串新的选项,并且这种方式我们不需要在每次内核发布时升级我们的defconfig
。另外,应该提到的是内核构建系统在defconfig
中保持了非常明确的选项顺序,因此最好避免手动修改该文件。你应该使用make savedefconfig
规则代替手动修改来修改defconfig
.
简单解释
当.config
文件被生成,内核构建系统仔细检查所有的Kconfig
文件(从所有的子文件夹中),检查那些Kconfig
中的所有选项:
- 如果选项在
defconfig
中提及,构建系统将输出该选项和从defconfig
从取出的该选项的值到.config
文件中; - 如果该选项没在
defconfig
中提及,构建系统使用它在Kconfig
中对应的默认值到.config
文件中。
查看 scripts/kconfig/Makefile和 scripts/kconfig/conf.c文件了解它到底是如何工作的。
更精确详尽的解释
来自于 “Kbuild: the Linux Kernel Build System” by Javier Martinez:
定义配置符号:
Kconfig
文件
配置符号定义在Kconfig
文件中。每个Kconfig文件可以描述任意数量的符号,还可以包括(来源)其他Kconfig文件。内核编译选项的构建配置菜单的编译目标(例如,make menuconfig
),将读取这些文件以构建树状结构。内核中的每个目录都有一个Kconfig,其中包括其子目录的Kconfig文件。在内核源代码的顶级目录,有一个Kconfig
文件,它是选项树的根。menuconfig
(scripts/kconfig/mconf
)、gconfig
(scripts/kconfig/gconf
)和其他编译目标调用从根kconfig启动的程序,递归地读取位于每个子目录中的kconfig
文件,用以构建它们的菜单。要访问的子目录也在每个Kconfig文件中定义,并且还取决于用户选择的配置符号值。
存储符号值:.config
文件
所有的配置符号值都保存在一个名为.config
的特殊文件中。每次要更改内核编译配置时,都要执行make
目标,比如menuconfig
或xconfig
。它们读取Kconfig
文件以创建菜单并使用.config
文件中定义的值更新配置符号的值。此外,这些工具使用您选择的新选项更新.config
文件,如果以前不存在的话,还可以生成一个。
因为.config
文件是纯文本文件,所以不需要任何专门的工具也可以修改它。它对于保存和恢复以前的内核编译配置也非常方便。