Skip to main content
欢迎来到PAWPAW技术文档网站了解更多信息

高级用法

本机 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.txtlib_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()