交叉编译项目的CTest单元测试

Unit testing by CTest of Cross-compiled Project

我正在开发业余爱好 OS,它与我的开发 PC 以外的其他架构交叉编译,并且在 QEMU 模拟器中 运行。

我正在尝试对我为我的内核开发的源文件进行单元测试,但是让它们 运行 在我的开发机器上而不是在我的目标上的 QEMU 中。

为了交叉编译我的源代码,我使用了使用我的自定义 GCC 工具链的工具链文件。由于来自工具链文件使用的 CMake 原则,工具链文件在我的根 CMakeLists.txt 文件中的 project(...) 定义之前设置。

我的问题是如何使用内置 GCC 为我的开发机器 (x86_64) 构建我的测试可执行文件,同时为目标平台交叉编译我的内核二进制文件...我不知道如何专门为每个用例(测试、目标构建)设置 CMAKE_CXX_COMPILER / CMAKE_C_COMPILER cmake 变量

要查看我的特定项目,请随时导航至此处:https://gitlab.com/revolta/revolta

我想将 test/ 添加到我的项目根目录,包括从 source/... 中选择的源并从我的根目录 CMakeLists.txt

以某种方式管理它

在此先感谢您提供任何概念想法和帮助!干杯马丁

规则是 - 每个配置有一个编译器。不要试图在每个配置中使用两个编译器。相反 运行 cmake 两次并配置两次,。分别用于 x86 测试和发布到目标构建。

所以写一个小脚本(无论如何你有 configure.sh)(我通常写一个包含所有 PHONY 目标的 makefile),它将 运行 并为两个配置构建项目两次:

# ./compile_and_test_your_project.sh

# build for target host
cmake -DCMAKE_TOOLCHAIN_FILE=the_toolchain -S. -B_build/crosscompiled
cmake --build _build/crosscompiled --target the_main_project_target
( cd _build/crosscompiled && ctest )

# build for native host
cmake -DCMAKE_C_FLAGS="-fsanitize=undefined -ggdb3 -O0" -S. -B_build/native 
cmake --build _build/native --target only_testing_targets
( cd _build/native && ctest )

不要在 cmake 配置中设置 CMAKE_CROSSCOMPILING_EMULATOR。我建议尽量保持 cmake 配置平台不可知,并使用参数将平台特定部分传递给配置 cmake。这种方式是可扩展的——您可以轻松地使用不同的工具链和不同的环境,或者尝试不同的编译器选项。在 cmake 中,您可以查看是否仅使用 if (CMAKE_CROSSCOMPILING) 进行交叉编译。另见 CMAKE_CROSSCOMPILING_EMULATOR.

ps。 My makefile 来自我的一个项目,根据 make 目标设置不同的 CMAKE_CROSSCOMPILING_EMULATOR