高级用法
本机 CPU 构建
XCommon CMake 支持为本机主机 CPU 构建库和应用程序,而不仅限于 xcore 设备。此功能的一个应用场景是编译并运行单元测试,用以验证信号处理算法的逻辑,非嵌入式 CPU 的更高时钟速度使得在有限的时间内能够实现更广泛的测试覆盖。
这是 XCommon CMake 的高级应用,不保证所有模块都支持本机构建。
CMake 生成
生成构建环境的 CMake 命令中必须启用 BUILD_NATIVE 选项,之后可以正常继续构建,为主机 CPU 生成库和应用程序。构建环境将配置为系统的默认编译器工具链,因此必须预先安装合适的工具链。
cmake -G "Unix Makefiles" -B build -D BUILD_NATIVE=ON
cd build
xmake
条件配置
如果应用程序或库既支持 xcore 设备构建也支持本机 CPU 构建,则可能需要根据构建类型来设定不同的 XCommon CMake 变量值。例如,本机构建的编译可能需要不同的编译器选项。这些变量可以在条件块中设置,以实现预期的行为。
cmake_minimum_required(VERSION 3.21)
include($ENV{XMOS_CMAKE_PATH}/xcommon.cmake)
project(app)
set(APP_HW_TARGET XCORE-AI-EXPLORER)
if(NOT BUILD_NATIVE)
# xcore 构建的编译器选项
set(APP_COMPILER_OPTIONS -Os -mno-dual-issue)
else()
# 本机构建的编译器选项
set(APP_COMPILER_OPTIONS -O2)
endif()
高级依赖管理
依赖位置
默认情况下,依赖模块的位置是由 XMOS_SANDBOX_DIR 变量定义的沙盒根目录。可以通过为每个非默认依赖位置设置一个变量来单独覆盖。
注意: 推荐使用由 XMOS_SANDBOX_DIR 定义的沙盒,并且只有在特殊情况下才覆盖依赖位置。
可以使用名为 XMOS_DEP_DIR_<module> 的变量来覆盖 <module> 的位置。例如,XMOS_DEP_DIR_lib_i2c 可设置为 lib_i2c 模块在沙盒根目录以外位置的路径。然后,构建系统将在此位置搜索 lib_i2c 的源代码,而不是沙盒根目录中的 lib_i2c 目录。
此模块的任何子依赖项将在 XMOS_SANDBOX_DIR 中找到默认位置,除非它们也有一个以模块名命名的覆盖变量。
CMake 文件内容
回到之前的沙盒结构示例,我们将检查使用 XMOS_DEP_DIR_lib_mod1 指定 lib_mod1 的非标准位置时 CMakeLists.txt 和 lib_build_info.cmake 文件的内容。
.
├── sandbox
│ ├── lib_mod0
│ │ ├── lib_mod0
│ │ ├── api
│ │ ├── src
│ │ └── lib_build_info.cmake
│ └── sw_app0
│ ├── app_app0_xcoreai
│ ├── src
│ └── CMakeLists.txt
└── other_srcs
├── lib_mod1
├── lib_mod1
├── api
├── src
└── lib_build_info.cmake
sandbox/sw_app0/app_app0_xcoreai/CMakeLists.txt
cmake_minimum_required(VERSION 3.21)
include($ENV{XMOS_CMAKE_PATH}/xcommon.cmake)
project(app0_xcoreai)
set(APP_HW_TARGET XCORE-AI-EXPLORER)
set(APP_DEPENDENT_MODULES "lib_mod0")
set(XMOS_SANDBOX_DIR ${CMAKE_CURRENT_LIST_DIR}/../..)
set(XMOS_DEP_DIR_lib_mod1 ${CMAKE_CURRENT_LIST_DIR}/../../../other_srcs/lib_mod1)
XMOS_REGISTER_APP()
sandbox/lib_mod0/lib_mod0/lib_build_info.cmake
set(LIB_NAME lib_mod0)
set(LIB_VERSION 1.0.0)
set(LIB_INCLUDES api)
set(LIB_DEPENDENT_MODULES "lib_mod1")
XMOS_REGISTER_MODULE()
other_srcs/lib_mod1/lib_mod1/lib_build_info.cmake
set(LIB_NAME lib_mod1)
set(LIB_VERSION 1.0.0)
set(LIB_INCLUDES api)
set(LIB_DEPENDENT_MODULES "")
XMOS_REGISTER_MODULE()