少于 1 分钟阅读 次阅读

情况一:Kconfig中没有正确定义选项

1. 为什么 defconfig 中新增的选项不会自动进入 .config?

1.1 Kconfig 是配置的核心

  • .config 文件是 根据 Kconfig 解析生成的,并不是直接从 defconfig 复制过来的。
  • defconfig 只是提供默认值,但前提是 Kconfig 中已经定义了该选项
  • 如果 Kconfig 没有定义该选项,即使 defconfig 里添加了 CONFIG_XXX=y,它也不会出现在 .config

1.2 新增选项未在 Kconfig 定义

  • 如果你在 defconfig 中添加了一个 CONFIG_XXX,但 Kconfig 文件中没有 config XXX 的定义,该选项是无效的,make defconfig 时会被忽略。
  • 只有 Kconfig 中正确定义了该选项,并且符合依赖关系,make defconfig 才会正确生效。

2. 解决方案

2.1 确保 Kconfig 文件正确定义了新的选项

你需要在相应的 Kconfig 文件中定义选项。例如,如果你想添加 CONFIG_MY_FEATURE,应该在 Kconfig 文件中这样定义:

config MY_FEATURE
    bool "Enable my feature"
    default y

关键字段解析

  • bool:表示该选项是一个布尔值(y/n)。
  • default y:表示默认启用(可以省略)。
  • 如果该选项依赖于其他选项(比如 CONFIG_EXPERIMENTAL),你可能需要:
    config MY_FEATURE
        bool "Enable my feature"
        depends on EXPERIMENTAL
    
  • 如果 Kconfig 中没有定义 config MY_FEATURE,那么即使你在 defconfig 里加上 CONFIG_MY_FEATURE=y,它也不会出现在 .config

2.2 重新生成 .config

Kconfig 正确定义新选项后,你需要重新生成 .config

make defconfig

这样 .config 会根据 Kconfigdefconfig 重新生成。如果 .config 已存在,建议运行:

make oldconfig

这样可以确保 .config 更新,并提示你配置新增的选项。

如果 .config 仍然未更新,可以尝试:

make mrproper
make defconfig

这样可以清除 .config,并重新生成。


3. defconfig 与 Kconfig default 发生冲突时,谁生效?

如果 Kconfigdefault y,但 defconfigCONFIG_X=n,那么 最终 .config 里的值取决于 defconfig,即:

CONFIG_X=n

优先级解析

  1. .config(最高优先级,用户手动修改的 .config 最终决定编译选项)。
  2. defconfig(次优先,提供默认配置)。
  3. Kconfigdefault(仅在 .configdefconfig 都未提供时生效)。

如果你希望 default 值生效,而不受 defconfig 影响,可以执行:

make alldefconfig

这样 .config 里的值会尽量使用 Kconfig 里的 default,而不是 defconfig

情况二:defconfig中选项互相覆盖

需要保证defconfig中选项是唯一的 类似这样看起来是注释的

# CONFIG_USB_SERIAL_WWAN is not set

也会覆盖

CONFIG_USB_SERIAL_WWAN=y

可以到对应的c文件目录下,查看是否编译出了.o文件(y选项),如果编译出来了才是生效的(m选项会编译出ko文件)。

留下评论