我有一个CMake项目,其中包括使用ExternalProject_Add
的另一个项目,其源代码在配置时可用:
ExternalProject_Add(projectB
PREFIX abc
SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/projectB"
BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/projectB"
INSTALL_COMMAND ""
)
外部项目作为父项目构建的一部分被构建。如果我从${CMAKE_CURRENT_BINARY_DIR}/projectB
运行make check
,我可以运行projectB
的测试,但我希望它们与make test
的所有其他测试一起运行。我怎样才能使projectB
的单元测试作为父测试目标的一部分运行?
我之前在他们的讨论中问过CMake开发人员:https://discourse.cmake.org/t/testing-in-a-superbuild/1906
本·伯克尔,其中一个维护者,回复如下:
我已经在我们的superbuild基础设施中做了一个hack。您可以根据您的项目调整它。有问题的文件:
- 蹦床
逻辑收集我们想要测试的项目,提取它们的二进制目录,并配置
CTestTestfile.cmake
来完成这项工作。然后,它使用蹦床为我们感兴趣的每个项目执行实际的subdirs
调用。该文件被添加到CTest要包含的文件列表中。
如果您不关心为外部项目中的每个单独的测试用例获得适当的机器可读的测试报告,那么以下内容应该可以工作
add_test(projectB_tests
COMMAND ${CMAKE_COMMAND} --build "${CMAKE_CURRENT_BINARY_DIR}/projectB" --target test
)
然而,缺点是CTest生成的XML将只指示projectB
的测试套件是否失败,但是您需要读取测试运行的整个输出以查找哪个特定的测试失败。
如果你没有定义一个超级构建项目,虽然没有必要在你的场景中使用ExternalProject
,一个简单的add_subdirectory(projectB)
应该工作得很好,ProjectB
的测试也会自动添加到你的测试目标。