构建实现
设计思路
ARMINO 构建主要是采取面向对象的思想进行设计,理解的关键点:
CMakeLists.txt 二次扫描,有机会在依赖扩充期间做一些特别处理
构建前先进行依赖扩充,简化依赖的编写
projects/components 派生自 cmake 的 projects/target, 通过在函数调用前设置特定变量的方式覆盖默认值,通过在函数调用之后设置特定属性的方式来
允许 projects/components 在核心脚本执行之前,之中,之后增加 hook 处理
提供封装好的 API 处理 90% 以上的绝大多数场景,只有少数特殊场景才需要复杂 cmake 脚本处理
构建脚本
ARMINO 构建系统的列表文件位于 /tools/build_tools/cmake 中。实现构建系统核心功能的模块如下
build.cmake - 构建相关函数,即构建初始化、检索/设置构建属性、构建处理。
component.cmake - 组件相关的函数,如添加组件、检索/设置组件属性、注册组件。
kconfig.cmake - 从 Kconfig 文件中生成配置文件(sdkconfig、sdkconfig.h、sdkconfig.cmake 等)。
target.cmake - 设置构建目标和工具链文件。
utilities.cmake - 其它帮助命令。
除了这些文件,还有两个重要的 CMake 脚本在 /tools/build_tools/cmake 中:
armino.cmake - 设置构建参数并导入上面列出的核心模块。
project.cmake - 导入
armino.cmake
,并提供了一个自定义的``project()``命令,该命令负责处理建立可执行文件时所有的繁重工作。 包含在标准 ARMINO 项目的顶层 CMakeLists.txt 中。
/tools/build_tools/cmake 中的其它文件都是构建过程中的支持性文件或第三方脚本。
构建过程
构建过程可以大致分为四个阶段:
ARMINO Build System Process
初始化
该阶段为构建设置必要的参数。
- 在将
armino.cmake
导入project.cmake
后,将执行以下步骤:
在环境变量中设置
ARMINO_PATH
或从顶层 CMakeLists.txt 中包含的project.cmake
路径推断相对路径。将 /tools/build_tools/cmake 添加到
CMAKE_MODULE_PATH
中,并导入核心模块和各种辅助/第三方脚本。设置构建工具/可执行文件,如默认的 Python 解释器。
设置全局构建参数,即编译选项、编译定义、包括所有组件的 include 目录。
将 components 与 middleware 中的组件添加到构建中。
- 自定义
project()
命令的初始部分执行以下步骤:
在环境变量或 CMake 缓存中设置
ARMINO_TARGET
以及设置相应要使用的``CMAKE_TOOLCHAIN_FILE``。添加
EXTRA_COMPONENTS_DIRS
中的组件至构建中从
COMPONENTS
/EXCLUDE_COMPONENTS
、SDKCONFIG
、SDKCONFIG_DEFAULTS
等变量中为调用命令armino_build_process()
准备参数。
调用 armino_build_process()
命令标志着这个阶段的结束。
生成组件列表
这个阶段会建立一个需要在构建过程中处理的组件列表,该阶段在
armino_build_process()
的前半部分进行。
查找每个组件的公共和私有依赖。创建一个子进程,以脚本模式执行每个组件的 CMakeLists.txt。
armino_component_register
REQUIRES 和 PRIV_REQUIRES 参数的值会返回给父进程。 这就是组件依赖扩充(或者称早期扩展)。在这一步中定义变量 ``CMAKE_BUILD_EARLY_EXPANSION``。根据公共和私有的依赖关系,递归地导入各个组件。
组件处理
该阶段处理构建中的组件,是
armino_build_process()
的后半部分。
从 sdkconfig 文件中加载项目配置,并生成 sdkconfig.cmake 和 sdkconfig.h 头文件。这两个文件分别定义了可以从构建脚本和 C/C++ 源文件/头文件中访问的配置变量/宏。
导入各组件的 ``project_include.cmake``。
将每个组件添加为一个子目录,处理其 CMakeLists.txt。组件 CMakeLists.txt 调用注册命令
armino_component_register
添加源文件、导入目录、创建组件库、链接依赖关系等。
完成
该阶段是
armino_build_process()
剩余的步骤。
创建可执行文件并将其链接到组件库中。
生成 project_description.json 等项目元数据文件并且显示所建项目等相关信息。
请参考 /tools/build_tools/cmake/project.cmake 获取更多信息。