工程配置

概述

本章介绍 SDK 配置的相关内容。

第一小节,将介绍如何 配置一个 SoC 工程。包括配置步骤、初始配置以及配置指令。

第二小节,将介绍 配置系统的组成。包括 Kconfig 以及 conf 文件。

配置系统

Kconfig 介绍

本节将介绍 Kconfig 的组织结构,以及一个配置项在 Kconfig 中是如何定义的。

组织结构

本项目的配置系统采用 Kconfig 组织,通过 Kconfig 的层级引用,将各个组件的配置结构化到 component/soc/amebaxxx/project/Kconfig 中。关于 Kconfig 更详细的信息可参见: https://docs.kernel.org/kbuild/kconfig-language.html

../../_images/kconfig_tree.svg

用户执行 ameba.py menuconfig 选中需要的配置项后,会保存为 .config 文件。经过脚本处理后,生成供 CMake 使用的 .config_xxx 文件,以及供 C 代码调用的头文件 platform_autoconf.h

定义 Kconfig 符号

定义一个 Kconfig 符号需要遵循下面格式:

config FOO
   bool "choose FOO"
   default n

上述 Kconfig 结构定义了一个名为 FOObool 类型符号,默认值为 n 。通过 menuconfig 进入可视化界面后,该符号将显示为:

[ ]  choose FOO
  • "choose FOO" 为提示词,其将显示在可视化配置界面中,若删除 "choose FOO" ,那么可视化界面中将不会显示该配置项。除 bool 类型外,还可以定义 string, hex, int 等其他类型的配置项。

  • default n 表示 no, 代表该项默认不会被选中, default n 可缺省。注意,通过 default 定义的默认值,只有在用户没有设置过该 config 项时才会生效。

  • 如果同一个 config 中定义了多重 default 值,那么将以首次出现的有效 default 值为准。

  • 上述符号在 .config 文件中将被解析为 CONFIG_FOO

conf 文件介绍

本节介绍 conf 文件的格式,以及涉及的几种 conf 文件。

conf 文件通过将用户需要设置的配置项写入其中,代替可视化界面的 menuconfig 方式。 和 menuconfig 交互式配置的方式类似,这种方式本质上也是选中/取消选中一些 Kconfig 文件中定义的项,只是用参数输入的方式代替了交互的的输入。

conf 文件格式

conf 文件由多行配置项组成,这些配置项遵循以下格式:

CONFIG_<name1>=<value>

CONFIG_<name2>=<value>

...

= 号左右不允许有空格。

default.conf

  • {SDK}/component/soc/amebaxxx/project 目录下,提供了一个名为 default.conf 的配置集合文件,定义了编译本 SoC 项目的 初始配置

  • 特殊地, ameba.py menuconfig -f 隐含了 ameba.py menuconfig -f default.conf 的规则,这样其它 conf 文件中只需编写 default.conf 的增量配置即可。若存在相同配置项,其它 conf 文件中的值将覆盖 default.conf 中的值。

  • Kconfig 中的 default 值只有在未设定某个配置项时才会生效, 而 default.conf 文件相当于一系列默认的输入项,因此 default.conf 的优先级要高于 Kconfig 中的 default 值。

prj.conf

  • prj.conf 存放在 example 下或用户创建的 外部工程路径 下,记录此 example 或外部工程需要的配置项。 用户可通过 ameba.py menuconfig -f /.../prj.conf 对项目进行配置。当用户未通过可视化配置或指定其他 conf 文件时, prj.conf 会作为 初始配置 生效。

  • prj.conf 的优先级高于 default.conf

user.conf

  • 用户自定义的 conf 文件。

  • 生成:用户可以手动编写 .conf 文件;也可以先运行 ameba.py menuconfig 利用可视化界面进行手动配置,退出后通过 ameba.py menuconfig -s 命令将本次配置结果保存为 <name>.conf 文件。

    ameba.py menuconfig -s <name>.conf
    
  • 应用:通过 ameba.py menuconfig -f 命令,指定一个或多个 .conf 文件。如果多个 .conf 文件中存在相同配置项, <name2>.conf 的优先级将高于 <name1>.conf 。例如,如果 <name1>.conf 中定义了 CONFIG_BT_MENU=y<name2>.conf 中定义了 CONFIG_BT_MENU=n,那么最终 CONFIG_BT_MENU=n 将会生效。

    ameba.py menuconfig -f <name1>.conf <name2>.conf ...
    

备注

用户可通过 ameba.py menuconfig -s 将当前配置保存为 conf 文件,之后利用 ameba.py menuconfig -f 对保存的 .conf 文件进行加载。