最新uboot的Kbuild系统 3 .config的生成

本文介绍了Kconfig文件的结构及如何通过Kconfig和defconfig文件生成.config配置文件的过程。详细解析了Kconfig中的基本元素如config、menu、choice等,并展示了如何根据用户的选择或defconfig文件将配置写入.config。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面的工作产生了一个conf

关键点是由conf产生.config的过程

最后是通过执行

scripts/kconfig/conf  --defconfig=arch/../configs/rpi_defconfig Kconfig 生成的


Kconfig包含了当前目录中可以进行的一些配置信息。

rpi_defconfig包含了默认的配置信息。

conf根据rpi_defconfig的一些配置,参考Kconfig产生最终的.config

如果是make menuconfig。那么就直接读取Kconfig。用户通过界面来配置产生.config


conf通过

conf_parse(Kconfig);来解析可选的配置信息,保存到一个链表中。

随后通过

conf_read(rpi_defconfig)读取默认的设置文件,并且生成新的配置文件

调用

conf_set_all_new_symbols更新关系链表

最后调用

conf_write写入到.config中


首先看Kconfig的构成


Kconfig的基本构成是

1 config项目

config symbolname

options

symbolname 配置名称,options是选项


config LOCALVERSION_AUTO
bool "Automatically append version information to the version string"
default y
help
 This will try to automatically determine if the current tree is a
 release tree by looking for Git tags that belong to the current
 top of tree revision.

LOCALVERSION_AUTO 就是配置名称



bool是变量类型,变量类型有五种。

分别是bool string tristate int hex

bool 只能是y或者n (选择或者不选择)

tristate 可以是y n m (选择或者不选择或者编译为模块)

string就是字符串


"Automatically append version information to the version string"  就是对于该菜单的简单描述。同promote选项

比如

bool "config for cpu"

bool

promote "config for cpu"是一个意思




default y 表示默认是选中y的


help 的内容是详细的解释。在menuconfig的时候使用使用?可以打开帮助


depend on XXX 表示只有XXX配置被选中的时候,当前选项才能够被配置。




2menu项目

通常是

menu  "menu A"

config cfgA

......

config cfgB

....

endmenu


显示后就是

menu--->

[] cfgA 

[] cfgB


3choice选项

choice包含了一组可以被选择的集合,选择只能是bool和tristate类型。并且不能同时存在两种。是bool就全部是bool。是tristate就都是tristate

也就是所有的choice里面bool只选中某一种。



choice

promote "select cpu"

config A

bool "cpu A"

config B

bool "cpu B"

config C

bool "cpu C"

endchoice

那么就是可以选择一个合适的cpu

select cpu---> (cpu A cpu B cpu C)




4 select 选项是反向依赖 dependson是正向依赖

dependson XXX 是如果该选项可以被配置,前提是XXX已经被选中。

而select XXX是如果选中了该选项。那么XXX选项也被选中。









后续menuconfig或者conf qconf 等根据用户选择或者xxx_defconfig将这些选项写入.config文件中

配置后的.confg文件将根据不同的选项分别写入。写入的时候在配置名称前面加上CONFIG_


比如

config ARM

bool

default y

写入.config以后就变成了

CONFIG_ARM=y

还有 CONFIG_MODULEA=m 表明该配置MODULEB被配置编译到模块中

CONFIG_XXX=n或者没有这个配置就表示选择为n


而string就变成了

CONFIG_SYS_ARCH="arm"
CONFIG_SYS_CPU="arm1176"
CONFIG_SYS_SOC="bcm283x"
CONFIG_SYS_VENDOR="raspberrypi"


int变成了

CONFIG_SYS_MALLOC_F_LEN=0x400


所以conf也就是根据rpi_defconfig以及各个目录以及Kconfig里面的一些默认配置,最后产生.config

CONFIG_ARM=y
CONFIG_ARCH_BCM283X=y
CONFIG_TARGET_RPI=y
CONFIG_OF_BOARD_SETUP=y
CONFIG_HUSH_PARSER=y
CONFIG_SYS_PROMPT="U-Boot> "
CONFIG_CMD_BOOTZ=y
# CONFIG_CMD_IMLS is not set
# CONFIG_CMD_FLASH is not set
CONFIG_CMD_MMC=y
CONFIG_CMD_USB=y
# CONFIG_CMD_FPGA is not set
CONFIG_CMD_GPIO=y
CONFIG_CMD_DHCP=y
CONFIG_CMD_MII=y
CONFIG_CMD_PING=y
CONFIG_CMD_EXT2=y
CONFIG_CMD_EXT4=y
CONFIG_CMD_FAT=y
CONFIG_CMD_FS_GENERIC=y
CONFIG_USB=y
CONFIG_USB_STORAGE=y
CONFIG_PHYS_TO_BUS=y
CONFIG_OF_LIBFDT=y

比如根据 TARGET_RPI

config TARGET_RPI
bool "Raspberry Pi (all BCM2835 variants)"
help
 Support for all ARM1176-/BCM2835-based Raspberry Pi variants, such as
 the A, A+, B, B+, Compute Module, and Zero. This option cannot
 support BCM2836/BCM2837-based Raspberry Pis such as the RPi 2 and
 RPi 3 due to different peripheral address maps.


 This option creates a build targetting the ARM1176 ISA.
select BCM2835

自动选中了BCM2835

config BCM2835
bool "Broadcom BCM2835 SoC support"
depends on ARCH_BCM283X
select CPU_ARM1176

随后自动选择了CPU_ARM_1176,又由于依赖了 ARCH_BCM283X。rpi_defconfg中还有一个配置CONFIG_ARCH_BCM283X=y


.config就是这样生成的。至于conf由于功能不变。所以就不解析了,东西太多,只要看成一个黑盒子,作用就是按照一定的规则将defconfig和Kbuild输入变成.config输出就行了 ,这个规则就是kconfig的规则。



### 生成或修改 U-Boot `.config` 文件的方法 对于U-Boot而言,`.config`文件包含了特定板级支持包(BSP)所需的配置选项。这些配置决定了哪些功能被启用以及如何编译U-Boot以适应具体的硬件平台。 #### 自动生成默认配置 当首次为一个新的目标板准备构建环境时,可以通过执行如下命令来加载预设的默认配置: ```bash make <board_name>_defconfig ``` 这会读取位于`configs/`目录下的相应`.cfg`文件,并据此创建或更新当前工作区内的`.config`文件[^1]。 #### 手动编辑配置项 除了使用默认配置外,还可以利用菜单驱动界面来进行更精细的手动调整: ```bash make menuconfig ``` 此工具允许开发者浏览并更改各种内核特性及其参数设定,保存后的改动同样会被记录至`.config`中。 #### 修改现有配置变量 如果仅需变更少量配置条目,则可以直接打开`.config`文本文件进行编辑。需要注意的是,在直接操作前最好备份原始版本以防意外情况发生。另外一种方式是在命令行中指定新的值给定环境变量,例如: ```bash export CONFIG_SYS_TEXT_BASE=0x87800000 ``` 上述例子展示了怎样改变启动代码基址的位置[^2]。 #### 应用自定义碎片化补丁 有时为了满足特殊需求或是测试某些新加入的功能模块,可以采用碎片化的形式提供额外的KConfig片段作为补充输入源。这类做法通常涉及将差异部分存放在独立文件里再通过脚本引入项目树下处理。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值