跳到主要内容

CMake、Kconfig 与组件模型

概述

TuyaOpen 用 CMakeNinja 执行实际编译,用 Kconfig(经 tos.py config)决定编译哪些内容。本文说明各层如何衔接:库从哪里来、SDK 根 CMakeLists.txt 与工程 CMakeLists.txt 的关系,以及扩展板级或组件时应改哪里。

读者: 移植板卡、增加组件或排查链接问题的开发者。

前置条件

  • 编译指南 — 有序的 tos.py build 流水线(环境检查 → 平台 → CMake/Ninja → 输出)。
  • Kconfig 与工程配置app_default.configtos.py config choice / menu,以及 .build/cache/ 下生成物。

要求

  • 熟悉 CMake 基本概念(add_subdirectorytarget_link_libraries、静态库)。
  • 本地 TuyaOpen 树(TuyaOpen/ = SDK 根,<project>/ = app 或 example 目录)。

配置到 CMake(概念流程)

  1. 工程根目录的 app_default.config 记录 Kconfig 选择(最小差异)。
  2. tos.py config / tos.py build 将上述选择与 TuyaOpen/srcTuyaOpen/boards 及工程自身 Kconfig 合并,在 <project>/.build/cache/ 生成中间数据(详见 编译指南)。
  3. CMake 携带工程名、平台、板卡、芯片等变量,选用对应工具链、BSP 与组件集合。
  4. 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.asrc/ 下已启用组件(及配置的板级衔接)生成的静态库。
libtuyaapp.a(目标 tuyaapp工程 CMakeLists.txt 中的应用源码。
平台脚本若存在 platform/<platform>/build_example.py,在 CMake/Ninja 之后执行平台相关的打包或分区等逻辑。

具体目标名与选项可能因平台略有差异,以对应平台 CMake 与 编译指南 构建阶段为准。

工程目录与 SDK 根

位置作用
TuyaOpen/SDK:src/boards/platform/、根 CMakeLists.txttos.py
<project>/(如 apps/...examples/...应用:CMakeLists.txtapp_default.configKconfig、可选 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.txtapp_default.config / 工程侧 Kconfig;勿手改 .build/cache/ 下生成文件。

预期结果

能从 Kconfig 符号参与编译的源文件CMake 目标最终固件 追溯一条功能链路,并知道应改 srcboards 还是工程树。

参考