示例
本节包含一些演示 XCommonCMake 功能的示例。一些示例侧重于展示 CMakeLists.txt 文件内容,以演示如何使用 API 函数和变量,而不展示完整的应用程序或模块源代码。其他示例则是完整的“微型应用”,包含示例源代码。
应用配置
应用程序 app_cfgs 包含两种构建配置,这在此简单示例中用于改变打印消息的内容。当您的应用程序中使用多个配置时,对于每个不同的配置,相同的源文件都会被编译一次,但可以为每个配置提供不同的编译器标志。
目录结构
.
├── sandbox
│ ├── sw_cfgs
│ ├── app_cfgs
│ ├── CMakeLists.txt
│ └── src
│ └── main.c
CMake 和源文件内容
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()
#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_mod0 和 lib_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
文件内容
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()
set(LIB_NAME lib_mod0)
set(LIB_VERSION 3.2.0)
set(LIB_INCLUDES api)
set(LIB_DEPENDENT_MODULES "")
XMOS_REGISTER_MODULE()
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()
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_mod0 和 lib_mod1;应用程序 app_multiapp1 需要模块 lib_mod0 和 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_multiapp
│ ├── app_multiapp0
│ │ ├── CMakeLists.txt
│ │ └── src
│ ├── app_multiapp1
│ │ ├── CMakeLists.txt
│ │ └── src
│ ├── CMakeLists.txt
│ └── deps.cmake
CMake 文件内容
cmake_minimum_required(VERSION 3.21)
include($ENV{XMOS_CMAKE_PATH}/xcommon.cmake)
project(sw_multiapp)
add_subdirectory(app_multiapp0)
add_subdirectory(app_multiapp1)
set(APP_DEPENDENT_MODULES "lib_mod0" "lib_mod1" "lib_mod2")
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()
#include"mod0.h"
#include"mod1.h"
int main(){
mod0();
mod1();
return 0;
}
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()
#include"mod0.h"
#include"mod2.h"
int main(){
mod0();
mod2();
return 0;
}
set(LIB_NAME lib_mod0)
set(LIB_VERSION 1.0.0)
set(LIB_INCLUDES api)
set(LIB_DEPENDENT_MODULES "")
XMOS_REGISTER_MODULE()
set(LIB_NAME lib_mod1)
set(LIB_VERSION 1.0.0)
set(LIB_INCLUDES api)
set(LIB_DEPENDENT_MODULES "")
XMOS_REGISTER_MODULE()
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.xe 和 app_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 宏为一个配置定义,因此适用于所有源文件。然后 FLAG0 和 FLAG1 宏为特定文件定义,因此在其他源文件中未定义(并且此示例的成功编译证明了这一点,因为未到 达 #error 指令)。
目录结构
.
├── sandbox
│ ├── sw_cflags
│ ├── app_cflags
│ ├── CMakeLists.txt
│ ├── src
│ │ ├── flag0.c
│ │ ├── flag1.c
│ │ └── main.c
CMake 和源文件内容
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()
#include<stdio.h>
#ifndef FLAG
#error
#endif
#ifdef FLAG
#error
#endif
void flag0(){
printf("%d:%d \n ",MSG_NUM,FLAG0);
}
#include<stdio.h>
#ifdef FLAG
#error
#endif
#ifndef FLAG
#error
#endif
void flag1(){
printf("%d:%d \n ",MSG_NUM,FLAG1);
}
#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.asandbox/lib_abc/lib_abc/lib/xs3a/lib_abc.a