CMake、Kconfig 与组件模型
概述
TuyaOpen 用 CMake 与 Ninja 执行实际编译,用 Kconfig(经 tos.py config)决定编译哪些内容。本文说明各层如何衔接:库从哪里来、SDK 根 CMakeLists.txt 与工程 CMakeLists.txt 的关系,以及扩展板级或组件时应改哪里。
读者: 移植板卡、增加组件或排查链接问题的开发者。
前置条件
- 编译指南 — 有序的
tos.py build流水线(环境检查 → 平台 → CMake/Ninja → 输出)。 - Kconfig 与工程配置 —
app_default.config、tos.py config choice/menu,以及.build/cache/下生成物。
要求
- 熟悉 CMake 基本概念(
add_subdirectory、target_link_libraries、静态库)。 - 本地 TuyaOpen 树(
TuyaOpen/= SDK 根,<project>/= app 或 example 目录)。
配置到 CMake(概念流程)
- 工程根目录的
app_default.config记录 Kconfig 选择(最小差异)。 tos.py config/tos.py build将上述选择与TuyaOpen/src、TuyaOpen/boards及工程自身Kconfig合并,在<project>/.build/cache/生成中间数据(详见 编译指南)。- CMake 携带工程名、平台、板卡、芯片等变量,选用对应工具链、BSP 与组件集合。
- Kconfig 输出 由 CMake 侧消费(例如通过生成头文件),使
CONFIG_*与参与编译的源文件、宏一致。
本文侧重结构与职责;编译指南 列出构建步骤与脚本入口。
顶层 CMake 结构(SDK)
SDK 根目录 TuyaOpen/CMakeLists.txt 负责:
TuyaOpen/platform/<platform>/下的工具链与平台 CMake 片段。TuyaOpen/src/<component>/下各组件(通常各有CMakeLists.txt)。TuyaOpen/boards/<platform>/<board>/下存在CMakeLists.txt时的板级支持。- 你的应用 — 工程根目录的
CMakeLists.txt(与app_default.config同级)构建应用静态库,并链接到聚合后的 SDK 库。
简要归纳:遍历 src/ 各组件(各有 CMakeLists.txt),可选加入 boards/<platform>/<board>/,生成 libtuyaos.a,再 include(${TOS_PROJECT_ROOT}/CMakeLists.txt) 并将目标 tuyaapp 链接到该库(与 编译指南 中 CMake/Ninja 一步一致)。
链接产物
| 产物 | 典型作用 |
|---|---|
libtuyaos.a | 由 src/ 下已启用组件(及配置的板级衔接)生成的静态库。 |
libtuyaapp.a(目标 tuyaapp) | 工程 CMakeLists.txt 中的应用源码。 |
| 平台脚本 | 若存在 platform/<platform>/build_example.py,在 CMake/Ninja 之后执行平台相关的打包或分区等逻辑。 |
具体目标名与选项可能因平台略有差异,以对应平台 CMake 与 编译指南 构建阶段为准。
工程目录与 SDK 根
| 位置 | 作用 |
|---|---|
TuyaOpen/ | SDK:src/、boards/、platform/、根 CMakeLists.txt、tos.py。 |
<project>/(如 apps/...、examples/...) | 应用:CMakeLists.txt、app_default.config、Kconfig、可选 config/*.config、构建输出 .build/。 |
日常应用编译应在 <project>/ 执行 tos.py,而不是仅在 TuyaOpen/ 根目录。
Ninja 与 .build
CMake 生成 Ninja 工程。构建树位于 <project>/.build/(二进制在 .build/bin/,库在 .build/lib/,缓存在 .build/cache/)。勿将 .build/ 提交到版本库。
扩展方式
- 新增 SDK 组件 — 在
TuyaOpen/src/<name>/增加目录与CMakeLists.txt,并在 Kconfig 中可被选;可参照现有小组件。 - 新板或定制板 — BSP 放在
TuyaOpen/boards/<platform>/<board>/,含 CMake 与 Kconfig;见 新建开发板 与 编译指南。 - 仅改应用 — 通常只动工程
CMakeLists.txt与app_default.config/ 工程侧Kconfig;勿手改.build/cache/下生成文件。
预期结果
能从 Kconfig 符号 → 参与编译的源文件 → CMake 目标 → 最终固件 追溯一条功能链路,并知道应改 src、boards 还是工程树。