在上一节中,我们介绍了U-Boot编译和.config配置文件生成分析,我们可以通过make xxx__defconfig
来进行一些配置,其中xxx__defconfig
对应config
目录下的基于不同开发板的一些配置,指令执行完后会根据对应的配置在根目录下生成一个.config
配置文件。而这个配置文件也可以通过图形化配置页面来生成,这一节就来介绍一下。
文章目录
- 1 xxx_defconfig和.config文件
- 1.1 文件对比
- 1.2 总结
- 2 图形化配置之Kconfig
- 2.1 介绍
- 2.1 U-Boot的图形配置
- 3 .config中的配置是如何使用的
1 xxx_defconfig和.config文件
1.1 文件对比
1、imx6ul_isiot_emmc_defconfig
及其对应.config
对比
我们对比一下两个文件,左边是imx6ul_isiot_emmc_defconfig
文件,右边是make imx6ul_isiot_emmc_defconfig
生成的.config
文件,可以看到配置文件里有的,.config
文件里都有,除此之外.config
文件里还有一些其它的配置。
- 文件中
#
开头的为注释
2、imx6ul_isiot_emmc_defconfig
和imx6ul_isiot_nand_defconfig
对比
这里找一个与imx6ul_isiot_emmc_defconfig
类似的配置imx6ul_isiot_nand_defconfig
,来看一下区别:
可以看到,如果要使能NAND的话,需要多定义几个宏定义。
3、nand的.config
和emmc的.config
对比
左边是nand的.config
,右边是emmc的.config
:
可以看出,比如nand的一行CONFIG_MTD_RAW_NAND=y
,生成出来后可能对应了多个与此相关的配置。
1.2 总结
1、xxx_defconfig
在U-Boot的defconfig
文件中,配置项之间存在依赖关系。当你在defconfig
文件中启用或禁用某个配置项时,可能会触发相关的配置项引申或取消。
- 直接依赖关系: 在
defconfig
文件中,一些配置项可能有直接的依赖关系。这意味着启用或禁用一个配置项可能会导致与之直接相关的其他配置项的状态发生变化。这通常是通过配置项的名称来指定的。 - 间接依赖关系: 有些配置项可能存在间接的依赖关系。这意味着启用或禁用一个配置项可能会触发一系列的配置项状态变化,这些变化可能是由于其他配置项的依赖关系而产生的。
所以在生成的.config
文件中,xxx_defconfig
的一项配置可能有与之相关的多个配置。
2、.config
.config
文件是一个文本文件,包含了一系列的宏定义,用于指定U-Boot的构建选项。这些宏定义决定了编译过程中使用的各种配置,如开启或关闭某个功能、指定交叉编译工具链的路径等。例如,在C代码中可以使用类似以下的方式来检查某个配置是否被定义:
#ifdef CONFIG_MY_FEATURE// 这段代码只有在 CONFIG_MY_FEATURE 被定义时才会被编译
#endif
2 图形化配置之Kconfig
2.1 介绍
Kconfig(Kernel Configuration
)是Linux内核中用于配置构建选项的工具之一。它允许开发者通过一个文本界面或图形界面来选择、配置和调整内核的各种功能和模块。Kconfig文件包含了内核的配置信息,这些信息指定了内核编译时的各种选项,如支持的硬件、文件系统、网络协议等。
以下是Kconfig的一些主要特点和用法:
- 配置系统的基本原理: Kconfig采用了一种树状结构的配置系统。用户可以通过选择配置项,打开或关闭功能、模块或驱动,以满足特定需求。
- 配置文件: Kconfig的配置信息存储在内核源代码树中的Kconfig文件中。每个子目录都可以包含一个Kconfig文件,用于配置该目录下的源代码。
- 菜单配置界面: Kconfig提供了一个文本界面,也可以通过图形界面工具(如
menuconfig
、nconfig
、xconfig
等)进行配置。这些工具允许用户在配置过程中浏览选项,选择开启或关闭功能,并设置相应的参数。 - 依赖关系: Kconfig支持配置项之间的依赖关系。某些功能可能依赖于其他功能的开启或关闭,Kconfig会确保用户不能选择不合理的配置。
- 自动生成配置: Kconfig支持自动检测系统硬件和软件环境,从而生成适用于当前系统的默认配置。这有助于简化配置过程。
- 配置文件生成: 在用户完成配置后,Kconfig会生成一个
.config
文件,其中包含了用户选择的所有配置信息。这个文件将用于实际的内核编译过程。 - make命令: 用户可以使用
make menuconfig
、make nconfig
等命令来启动配置工具。在配置完成后,使用make
命令即可开始内核的编译过程。
make menuconfig
是Linux内核编译中使用的一个命令,它打开一个文本菜单界面,允许用户配置内核的各种选项。在执行make menuconfig
之前,相关的文件主要包括:
- Kconfig文件: Kconfig文件包含了内核的配置信息,以树状结构的形式组织。每个功能、模块或驱动都有对应的Kconfig条目。这些文件通常位于内核源代码树的各个目录中,例如,
arch/
目录、drivers/
目录等。make menuconfig
通过这些文件构建菜单界面。 - Makefile: 内核源代码中的Makefile包含了编译内核的相关规则和指令。
make menuconfig
命令会使用Makefile中的规则来创建配置菜单并执行相应的操作。 - .config文件: 在用户使用
make menuconfig
过程中,配置的结果会保存在一个名为.config
的文件中。这个文件包含了用户在配置过程中所做的选择,即内核的具体配置。.config
文件将在后续的编译过程中被使用。
执行make menuconfig
后,系统会读取Kconfig文件和已经存在的.config
文件,然后在终端中打开一个菜单,用户可以在菜单中选择和配置不同的内核功能。选择保存并退出后,配置的结果会被写入.config
文件中。
虽然Kconfig是设计用来配置Linux内核的工具,但是U-Boot也使用了这个图形工具。使用这个图形化工具需要安装libncurses-dev
库:
sudo apt-get install libncurses-dev
2.1 U-Boot的图形配置
我们直接使用make menuconfig
就可以打开图形配置界面了,在上一节中我们已经修改了Makefile指定了CROSS_COMPILE
,如果没有指定的话需要指定这个变量:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
如下图所示:
如上面的提示,输入Y
可以将某个功能编译进U-Boot源码,输入N
则是取消编译,输入M
则是将功能编译成模块。
比如我们进入下面的Command Line Interface
,这个界面就是用来配置U-Boot命令行中支持的指令:
我们进去Memory commands
看一下:
我们可以通过按下Y
或N
来使能和取消某些不需要支持的指令。所有的选项配置完之后选择下面的Save
即可保存配置到.config
中。
实际上这些配置都对应代码中的宏定义,我们可以根据我们的需求打开或关闭一些功能,从而实现U-Boot的裁剪。当然如果有必要的话,还是建议把每一个配置项都理解一遍。
3 .config中的配置是如何使用的
.config
文件通常不是直接包含在代码中的头文件(.h
文件)中。它是通过Makefile中的一些规则和变量传递给预处理器的。
U-Boot的Makefile通常会包含一个名为config.mk
的文件,这个文件会包含.config
文件的内容并将其转换为Makefile变量。通过这种方式,Makefile 中的规则可以使用这些变量,将它们传递给编译器进行条件编译。
下面举一个简单的例子说明U-Boot的Makefile中如何处理.config
文件:
# Makefile# Include the configuration file
-include config.mk# Compiler flags
CFLAGS += -Wall# Conditional compilation based on configuration options
ifeq ($(CONFIG_FEATURE_A),y)CFLAGS += -DFEATURE_A_ENABLED
endififeq ($(CONFIG_FEATURE_B),y)CFLAGS += -DFEATURE_B_ENABLED
endif# Target rule
all: my_programmy_program: some_code.c$(CC) $(CFLAGS) $^ -o $@
-include config.mk
用于包含config.mk
文件,该文件会根据.config
文件的内容生成相应的变量。ifeq ($(CONFIG_FEATURE_A),y)
和ifeq ($(CONFIG_FEATURE_B),y)
用于检查配置文件中的选项是否为y
(启用),如果是,则在CFLAGS
变量中添加相应的编译选项。