【问题标题】:Unit testing by CTest of Cross-compiled Project交叉编译项目的 CTest 单元测试
【发布时间】:2020-11-20 10:00:55
【问题描述】:

我正在开发爱好操作系统,它可以交叉编译到我的开发 PC 以外的其他架构,并在 QEMU 模拟器中运行。

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

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

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

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

我想将test/ 添加到我的项目根目录,包括来自source/... 的选定源,并以某种方式从我的根目录CMakeLists.txt 管理它

提前感谢任何概念想法和帮助!干杯马丁

【问题讨论】:

  • Toolchain file 用于交叉编译由CMAKE_TOOLCHAIN_FILE 变量指定。通常,这个变量被传递给cmake 可执行文件,但是你也可以在project() 调用之前设置这个变量。如果您在CMakeLists.txt 中设置此变量,那么您可以有条件地 设置它,具体取决于配置的目​​的(用于构建内核或构建测试)。
  • @Tsyvarev 我试过你的方法 - 有条件地在设置 project() 之前设置工具链文件的使用。到目前为止一切顺利,但现在我遇到了 cmake 缓存的问题。交叉编译后,我在缓存中设置了CMAKE_CXX_COMPILER 变量,但是一旦我重新配置为测试,使用本机系统g++(未使用工具链文件),CMAKE_CXX_COMPILER 的设置会从以前的配置中记住,而本机g++ 是未使用。如何管理?我试图从缓存中删除变量(使用unset( CMAKE_CXX_COMPILER CACHE ),但没有解决它......
  • 使用不同的构建目录来构建内核和构建测试。这样一来,它们之间就不会重复使用缓存。
  • @Tsyvarev 可以在 VS Code 中配置吗?也许为每个构建变体设置不同的构建目录?要知道,vs代码是直接触发我的根CMakeLists.txt,而不是使用configure.sh脚本...
  • 我没有在 VS Code 下使用 CMake 项目。据我了解,这应该是从同一个 CMake 项目创建不同 VS Code 项目(具有不同构建目录)的一种方式。

标签: unit-testing cmake cross-compiling


【解决方案1】:

规则是 - 每个配置有一个编译器。不要试图让每个配置使用两个编译器。而是运行 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 来自我的一个项目,根据制作目标设置不同的 CMAKE_CROSSCOMPILING_EMULATOR

【讨论】:

  • 我从答案中得到的最重要的建议是在不同的目录中构建不同的 CMake 变体(Build/Release/Test/...),从这个答案中也可以看到。我正在使用 VS Code 进行配置,我刚刚在 settings.json 中添加了 "cmake.buildDirectory": "${workspaceFolder}/build/${buildType}" 以使其在此 IDE 中得到支持
猜你喜欢
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
  • 1970-01-01
相关资源
最近更新 更多