我认为menuconfig是这些目标中最受欢迎的。目标由不同的主机程序进行处理,这些程序由内核提供,并在内核构建过程中生成。一些目标有一个GUI(为了用户的方便),而大多数没有。与kconfig相关的工具和源代码主要位于scripts/kconfig/在内核源代码中。我们可以从scripts/kconfig/makefile,有几个主机程序,包括CONF, mconf,和nconf。除了CONF,它们每个都负责基于GUI的配置目标之一,因此,CONF和他们中的大多数人打交道。
从逻辑上讲,Kconfig的基础结构有两个部分:一个实现了新语言要定义配置项(请参阅内核源代码下的Kconfig文件),而其他配置项则解析Kconfig语言并处理配置操作。
大多数配置目标的内部流程大致相同(如下所示):

注意,所有配置项都有一个默认值。
第一步读取源根下的Kconfig文件以构造初始配置数据库;然后根据此优先级读取现有配置文件来更新初始数据库:
.config /lib/Module/$(shell,uname-r)/.config /etc/kernel-config /boot/config-$(shell,uname-r) ARCH_DEFCONFIG ARCH/$(ARCH)/Defconfig如果您正在进行基于GUI的配置,则通过menuconfig或基于命令行的配置oldconfig,数据库将根据您的自定义进行更新。最后,将配置数据库转储到.config文件中。
但是.config文件不是内核构建的最终素材;这就是为什么syncconfig目标存在。syncconfig以前是一个名为silentoldconfig,但是它不像旧名字说的那样,所以它被重命名了。此外,由于它是内部使用(而不是为用户),它被从列表中删除。
下面是一个例子syncconfig作用:

syncconfig接受.config作为输入并输出许多其他文件,这些文件分为三类:
auto.conf & tristate.conf用于生成文件文本处理。例如,您可能在组件的makefile中看到这样的语句:
obj-$(CONFIG_GENERIC_CALIBRATE_DELAY) += calibrate.o
autoconf.h在C语言源文件中使用。
空头文件include/config/用于在kbuild期间进行配置依赖项跟踪,下面将对此进行解释。
配置之后,我们将知道哪些文件和代码段没有编译。
KBuild
组件式建筑,称为递归制作,是GNU的一种常见方式。制作,使管理一个大型项目。KBuild是递归make的一个很好的例子。通过将源文件划分为不同的模块/组件,每个组件都由自己的Makefile管理。当您开始构建时,顶级Makefile按正确的顺序调用每个组件的makefile,构建组件,并将它们收集到最终的执行程序中。
KBuild指的是不同类型的makefile:
Makefile位于源根中的顶部makefile。 .config是内核配置文件。 ARCH/$(ARCH)/Makefile是拱形Makefile,这是对顶部makefile的补充。 scripts/Makefile*描述所有kbuild makefile的通用规则。 最后,大约有500个Kbuildmakefiles.







