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

示例

本节包含一些演示 XCommonCMake 功能的示例。一些示例侧重于展示 CMakeLists.txt 文件内容,以演示如何使用 API 函数和变量,而不展示完整的应用程序或模块源代码。其他示例则是完整的“微型应用”,包含示例源代码。

应用配置

应用程序 app_cfgs 包含两种构建配置,这在此简单示例中用于改变打印消息的内容。当您的应用程序中使用多个配置时,对于每个不同的配置,相同的源文件都会被编译一次,但可以为每个配置提供不同的编译器标志。

目录结构

.
├── sandbox
│ ├── sw_cfgs
│ ├── app_cfgs
│ ├── CMakeLists.txt
│ └── src
│ └── main.c

CMake 和源文件内容

sandbox/sw_cfgs/app_cfgs/CMakeLists.txt
cmake_minimum_required(VERSION 3.21)
include($ENV{XMOS_CMAKE_PATH}/xcommon.cmake)
project(cfgs)

set(APP_HW_TARGET XCORE-AI-EXPLORER)
set(APP_COMPILER_FLAGS_config0 -DMSG_NUM=0)
set(APP_COMPILER_FLAGS_config1 -DMSG_NUM=1)

XMOS_REGISTER_APP()
sandbox/sw_cfgs/app_cfgs/src/main.c
#include<stdio.h>

int main(){
printf("config%d \n ",MSG_NUM);
return 0;
}

构建指令

从工作目录 sandbox/sw_cfgs/app_cfgs 执行以下命令来构建和运行应用程序:

cmake -G "Unix Makefiles" -B build
cd build
xmake

构建产物包括:

  • bin/config0/cfgs_config0.xe
  • bin/config1/cfgs_config1.xe

可以通过 xsim 运行这些二进制文件,以观察它们打印输出的差异:

$ >xsim bin/config0/cfgs_config0.xe
config

$ >xsim bin/config1/cfgs_config1.xe
config

若需构建单一的可执行目标,如仅构建 cfgs_config1.xe 而不构建 cfgs_config0.xe:

cd build
xmake config1

模块依赖性

应用程序 app_moddeps 需要模块 lib_mod0lib_mod1,而 lib_mod1 又依赖于 lib_mod2

目录结构

.
├── sandbox
│ ├── lib_mod0
│ │ ├── lib_mod0
│ │ ├── api
│ │ ├── src
│ │ └── lib_build_info.cmake
│ ├── lib_mod1
│ │ ├── lib_mod1
│ │ ├── api
│ │ ├── src
│ │ └── lib_build_info.cmake
│ ├── lib_mod2
│ │ ├── lib_mod2
│ │ ├── api
│ │ ├── src
│ │ └── lib_build_info.cmake
│ ├── sw_moddeps
│ ├── app_moddeps
│ ├── CMakeLists.txt
│ └── src

文件内容

sandbox/sw_moddeps/app_moddeps/CMakeLists.txt
cmake_minimum_required(VERSION 3.21)
include($ENV{XMOS_CMAKE_PATH}/xcommon.cmake)
project(moddeps)

set(APP_HW_TARGET XCORE-AI-EXPLORER)
set(APP_DEPENDENT_MODULES "lib_mod0(3.2.0)" "lib_mod1(1.0.0)")
set(XMOS_SANDBOX_DIR ${CMAKE_CURRENT_LIST_DIR}/../..)

XMOS_REGISTER_APP()
sandbox/lib_mod0/lib_mod0/lib_build_info.cmake
set(LIB_NAME lib_mod0)
set(LIB_VERSION 3.2.0)
set(LIB_INCLUDES api)
set(LIB_DEPENDENT_MODULES "")

XMOS_REGISTER_MODULE()
sandbox/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 "lib_mod2(2.5.1)")

XMOS_REGISTER_MODULE()
sandbox/lib_mod2/lib_mod2/lib_build_info.cmake
set(LIB_NAME lib_mod2)
set(LIB_VERSION 2.5.1)
set(LIB_INCLUDES api)
set(LIB_DEPENDENT_MODULES "")

XMOS_REGISTER_MODULE()

构建指令

从工作目录 sandbox/sw_moddeps/app_moddeps 执行以下命令来构建和运行应用程序:

cmake -G "Unix Makefiles" -B build
cd build
xmake

构建产物为 bin/moddeps.xe。

多应用程序仓库

仓库 sw_multiapp 包含两个应用程序,这些应用程序具有共同的依赖关系以及各自独特的依赖。应用程序 app_multiapp0 需要模块 lib_mod0lib_mod1;应用程序 app_multiapp1 需要模块 lib_mod0lib_mod2

目录结构

.
├── sandbox
│ ├── lib_mod0
│ │ ├── lib_mod0
│ │ ├── api
│ │ ├── src
│ │ └── lib_build_info.cmake
│ ├── lib_mod1
│ │ ├── lib_mod1
│ │ ├── api
│ │ ├── src
│ │ └── lib_build_info.cmake
│ ├── lib_mod2
│ │ ├── lib_mod2
│ │ ├── api
│ │ ├── src
│ │ └── lib_build_info.cmake
│ ├── sw_multiapp
│ ├── app_multiapp0
│ │ ├── CMakeLists.txt
│ │ └── src
│ ├── app_multiapp1
│ │ ├── CMakeLists.txt
│ │ └── src
│ ├── CMakeLists.txt
│ └── deps.cmake

CMake 文件内容

sandbox/sw_multiapp/CMakeLists.txt
cmake_minimum_required(VERSION 3.21)
include($ENV{XMOS_CMAKE_PATH}/xcommon.cmake)
project(sw_multiapp)

add_subdirectory(app_multiapp0)
add_subdirectory(app_multiapp1)
sandbox/sw_multiapp/deps.cmake
set(APP_DEPENDENT_MODULES "lib_mod0" "lib_mod1" "lib_mod2")
sandbox/sw_multiapp/app_multiapp0/CMakeLists.txt
cmake_minimum_required(VERSION 3.21)
include($ENV{XMOS_CMAKE_PATH}/xcommon.cmake)
project(multiapp0)

set(APP_HW_TARGET XCORE-AI-EXPLORER)
include(${CMAKE_CURRENT_LIST_DIR}/../deps.cmake)
set(XMOS_SANDBOX_DIR ${CMAKE_CURRENT_LIST_DIR}/../..)

XMOS_REGISTER_APP()
sandbox/sw_multiapp/app_multiapp0/src/main.c
#include"mod0.h"
#include"mod1.h"

int main(){
mod0();
mod1();
return 0;
}
sandbox/sw_multiapp/app_multiapp1/CMakeLists.txt
cmake_minimum_required(VERSION 3.21)
include($ENV{XMOS_CMAKE_PATH}/xcommon.cmake)
project(multiapp1)

set(APP_HW_TARGET XCORE-AI-EXPLORER)
include(${CMAKE_CURRENT_LIST_DIR}/../deps.cmake)
set(XMOS_SANDBOX_DIR ${CMAKE_CURRENT_LIST_DIR}/../..)

XMOS_REGISTER_APP()
sandbox/sw_multiapp/app_multiapp1/src/main.c
#include"mod0.h"
#include"mod2.h"

int main(){
mod0();
mod2();
return 0;
}
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 "")

XMOS_REGISTER_MODULE()
sandbox/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()
sandbox/lib_mod2/lib_mod2/lib_build_info.cmake
set(LIB_NAME lib_mod2)
set(LIB_VERSION 1.0.0)
set(LIB_INCLUDES api)
set(LIB_DEPENDENT_MODULES "")

XMOS_REGISTER_MODULE()

构建指令

从工作目录 sandbox/sw_multiapp 执行以下命令以构建和运行两个应用程序:

cmake -G "Unix Makefiles" -B build
cd build
xmake

构建生成的产品为 app_multiapp0/bin/multiapp0.xeapp_multiapp1/bin/multiapp1.xe

或者,可以配置和构建单个应用程序。从工作目录 sandbox/sw_multiapp/app_multiapp1 开始:

cmake -G "Unix Makefiles" -B build
cd build
xmake

构建产品为 bin/multiapp1.xe。应用程序 app_multiapp0 尚未构建。

依赖最佳实践

对于包含多个应用程序的存储库,每个应用程序都具有不同的依赖关系,如果每个应用程序都有自己对 APP_DEPENDENT_MODULES 变量的定义,试图保持共同依赖同步将容易出错。

在多应用程序存储库中,CMake 可以在不同级别配置和生成构建环境:可以为单个应用程序从该应用程序的子目录内部配置,也可以在存储库根目录的 CMakeLists.txt 文件中为所有应用程序配置。为了简单起见,最好让清单显示整个沙箱的共同视图,而不仅仅报告沙箱中单个应用程序使用的依赖关系。

因此,强烈建议在 commondeps.cmake 文件中为存储库中的所有应用程序设置包含所有依赖关系的 APP_DEPENDENT_MODULES 变量,就像上面的示例一样。各个应用程序不应在自己的 CMakeLists.txt 文件中修改 APP_DEPENDENT_MODULES 变量,否则生成的清单文件可能是错误的。

如果应用程序需要特定于应用程序的依赖关系,建议在其他沙盒中创建一个新的存储库,以便在那里定义这些依赖关系。

编译器标志

可以为应用程序或模块中的所有源文件设置编译器选项,并且还可以为构建配置和单独的源文件指定独立的编译器选项集。

此示例演示了这些选项如何交互的层次结构。MSG_NUM 宏为一个配置定义,因此适用于所有源文件。然后 FLAG0FLAG1 宏为特定文件定义,因此在其他源文件中未定义(并且此示例的成功编译证明了这一点,因为未到达 #error 指令)。

目录结构

.
├── sandbox
│ ├── sw_cflags
│ ├── app_cflags
│ ├── CMakeLists.txt
│ ├── src
│ │ ├── flag0.c
│ │ ├── flag1.c
│ │ └── main.c

CMake 和源文件内容

sandbox/sw_cflags/app_cflags/CMakeLists.txt
cmake_minimum_required(VERSION3.21)
include($ENV{XMOS_CMAKE_PATH}/xcommon.cmake)
project(cflags)

set(APP_HW_TARGET XCORE-AI-EXPLORER)

set(APP_COMPILER_FLAGS_config0 -DMSG_NUM=0)
set(APP_COMPILER_FLAGS_config1 -DMSG_NUM=1)

set(APP_COMPILER_FLAGS_flag0.c -DFLAG0=0)
set(APP_COMPILER_FLAGS_flag1.c -DFLAG1=1)

XMOS_REGISTER_APP()
sandbox/sw_cflags/app_cflags/src/flag0.c
#include<stdio.h>

#ifndef FLAG
#error
#endif

#ifdef FLAG
#error
#endif

void flag0(){
printf("%d:%d \n ",MSG_NUM,FLAG0);
}
sandbox/sw_cflags/app_cflags/src/flag1.c
#include<stdio.h>

#ifdef FLAG
#error
#endif

#ifndef FLAG
#error
#endif

void flag1(){
printf("%d:%d \n ",MSG_NUM,FLAG1);
}
sandbox/sw_cflags/app_cflags/src/main.c
#include<stdio.h>

#ifdef FLAG0
#error
#endif

#ifdef FLAG1
#error
#endif

void flag0();
void flag1();

int main(){
printf("config%d \n ",MSG_NUM);
flag0();
flag1();
return 0 ;
}

构建指令

从工作目录 sandbox/sw_cflags/app_cflags 执行以下命令以构建和运行应用程序:

cmake -G "Unix Makefiles" -B build
cd build
xmake

构建生成的产品为:

  • bin/config0/cflags_config0.xe
  • bin/config1/cflags_config1.xe

这些二进制文件可以使用 xsim 运行,以查看它们输出的差异。

$ >xsim bin/config0/cflags_config0.xe
config0
0:0
0:1

$ >xsim bin/config1/cflags_config1.xe
config1
1:0
1:1

构建指南

在工作目录 sandbox/lib_abc/lib_abc 下,运行以下命令来构建静态库:

cmake -G "Unix Makefiles" -B build
cd build
xmake

每种架构都将生成一个静态库存档:

  • sandbox/lib_abc/lib_abc/lib/xs2a/lib_abc.a
  • sandbox/lib_abc/lib_abc/lib/xs3a/lib_abc.a