强制串行执行 CMake 中的特定目标
Force serial execution for specific targets in CMake
在我的 CMake 项目中,我有几个目标,它们只是 运行 一组特定的单元测试(例如,runTestsForA
、runTestsForB
和 runTestsForC
)。
我还有一个目标 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 tests
或 ctest -j8 .
。测试将被序列化。
可以在以下位置找到更多信息:
- http://www.cmake.org/cmake/help/v3.2/command/add_test.html
- http://www.cmake.org/cmake/help/v3.2/command/enable_testing.html
- http://www.cmake.org/cmake/help/v3.2/command/set_tests_properties.html
- http://www.cmake.org/cmake/help/v3.2/manual/cmake-properties.7.html#properties-on-tests
- http://www.cmake.org/cmake/help/v3.2/manual/ctest.1.html
也许这不是控制测试执行的最佳解决方案,但通常我相信您可以使用 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)
在我的 CMake 项目中,我有几个目标,它们只是 运行 一组特定的单元测试(例如,runTestsForA
、runTestsForB
和 runTestsForC
)。
我还有一个目标 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 tests
或 ctest -j8 .
。测试将被序列化。
可以在以下位置找到更多信息:
- http://www.cmake.org/cmake/help/v3.2/command/add_test.html
- http://www.cmake.org/cmake/help/v3.2/command/enable_testing.html
- http://www.cmake.org/cmake/help/v3.2/command/set_tests_properties.html
- http://www.cmake.org/cmake/help/v3.2/manual/cmake-properties.7.html#properties-on-tests
- http://www.cmake.org/cmake/help/v3.2/manual/ctest.1.html
也许这不是控制测试执行的最佳解决方案,但通常我相信您可以使用 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)