如何在U-Boot新板卡defconfig中继承通用配置避免重复?
我明白你在Yocto中添加新板卡时想复用已有defconfig配置的痛点——像设备树那样通过引入通用配置来减少重复代码确实很高效。正如@Xypron提到的,defconfig文件本身不支持#include语法直接引入其他defconfig,不过我们有几种更优雅的方案可以解决这个问题:
方案1:优化使用merge_config.sh(当前思路的进阶版)
Yocto的内核构建流程可以顺畅集成scripts/kconfig/merge_config.sh,不需要在do_configure_append里写复杂逻辑。你可以在板卡的内核配方(比如linux-<vendor>.bbappend)中这样配置:
# 添加通用配置和板卡专属配置到源码路径 SRC_URI += "file://common_defconfig \ file://<new_board>_defconfig" # 在配置阶段自动合并两个defconfig do_configure_prepend() { ${S}/scripts/kconfig/merge_config.sh -O ${B} ${WORKDIR}/common_defconfig ${WORKDIR}/<new_board>_defconfig }
这样Yocto会在配置内核前自动合并通用配置与板卡专属配置,板卡专属配置里的选项会覆盖通用配置中的重复项,完美解决ARM这类choice选项的问题——merge_config.sh会正确处理choice类型的配置优先级。
方案2:利用Kconfig的source指令重构配置
虽然defconfig不支持直接引入,但你可以把通用配置抽象成Kconfig片段,再在板卡Kconfig中引入,最后通过defconfig选择板卡配置:
- 创建
common/Kconfig文件,用Kconfig语法定义通用配置:
config ARM bool default y config SPL bool default y config CMD_I2C bool default y
- 在板卡的Kconfig(比如
board/hw2/Kconfig)中引入通用Kconfig:
source "../common/Kconfig" choice prompt "Target board" default TARGET_BOARD_HW2 config TARGET_BOARD_HW2 bool "Support HW2 board" endchoice
- 板卡的
board_hw2_defconfig只需一行:
CONFIG_TARGET_BOARD_HW2=y
这种方式更符合Kconfig的设计逻辑,能完美处理choice类型配置——选择板卡时会自动继承通用配置里的ARM等选项,无需在defconfig中重复编写。
方案3:Yocto层级配置继承
如果多个板卡属于同一系列,还可以通过Yocto层的变量来复用配置。在系列通用的conf/machine/include/<series>-common.inc中定义:
# 通用内核配置 KERNEL_DEFCONFIG_base = "common_defconfig" # 板卡专属配置追加到通用配置后 KERNEL_DEFCONFIG = "${KERNEL_DEFCONFIG_base} <new_board>_defconfig"
然后在板卡的conf/machine/<new_board>.conf中继承通用inc文件:
require include/<series>-common.inc
这种方式贴合Yocto的层管理机制,适合批量维护同系列板卡的配置。
总结
- 简单复用需求:方案1的
merge_config.sh优化版最直接高效; - 长期维护清晰结构:方案2的Kconfig重构更推荐;
- 同系列多板卡场景:方案3的Yocto层继承最省心。
内容的提问来源于stack exchange,提问作者garlix

