强制串行执行 CMake 中的特定目标

Force serial execution for specific targets in CMake

在我的 CMake 项目中,我有几个目标,它们只是 运行 一组特定的单元测试(例如,runTestsForArunTestsForBrunTestsForC)。 我还有一个目标 tests,它依赖于所有这些单元测试目标,所以我可以用一个命令 运行 它们。

我正在使用 CLion 是我的 IDE,它默认尝试使用并行构建(我想要并且也在持续集成服务器上这样做)。 然而,看起来这些测试现在也在并行 运行ning 并且没有为此进行一些测试(他们使用本地环回对套接字进行一些魔术),这导致它们失败.. 有时.

这就是为什么我想强制串行执行 some/all 我的 tests 目标的依赖项。 不幸的是,当我搜索有关如何执行此操作的信息时,CMake 文档对我没有帮助。 这让我想到了我的问题:这完全有可能吗?如果有可能如何实现?

您可以使用 CTest 工具代替手动 tests 目标声明。使用 add_test 命令创建测试目标,然后 CMake 将自动创建 tests 目标,该目标将 运行 所有测试:

enable_testing()
add_test(NAME TestsForA COMMAND <command>)
add_test(NAME TestsForB COMMAND <command>)
set_tests_properties(TestsForA TestsForB  PROPERTIES RUN_SERIAL TRUE)

之后,您可以在构建树中 运行 make testsctest -j8 .。测试将被序列化。

可以在以下位置找到更多信息:

也许这不是控制测试执行的最佳解决方案,但通常我相信您可以使用 CMake JOB_POOLS 功能来限制项目中某些 CMake 目标的并行度。

首先声明命名池和每个池支持的并行作业数:

set_property(GLOBAL PROPERTY JOB_POOLS two_jobs=2 ten_jobs=10)

然后您可以将目标分配给这些池:

set_property(TARGET myexe PROPERTY JOB_POOL_COMPILE ten_jobs)