CMake:如何为每个测试重用相同的 test_main.cpp

CMake: How to reuse the same test_main.cpp for each test

我想在 monorepo 中使用测试框架 Catch2,其中会有很多组件,每个组件都有自己的测试。我想使用 CMake 来定义所有构建目标。

Catch2 provides a simple means 生成一个通用 main() 函数,它将 运行 所有测试链接到应用程序中。源文件(我称之为test_main.cpp)就是这两行:

#define CATCH_CONFIG_MAIN
#include "catch.hpp"

我想在我的源代码树中只有一个 test_main.cpp 的副本,并从每个具有测试的组件目录(最终将按数百个目录的顺序)引用它.

如果我复制 test_main.cpp 以便在每个目录中存在一个冗余副本并进行测试,我可以看到如何设置 CMake 工作,但我还没有弄清楚如何只有一个副本。有没有我忽略的简单技巧?

尝试通过以下方式将 Catch2 集成为 CMake interface library

将单个头文件 catch.hpptest_main.cpp 添加到它们自己的目录(例如 Catch2)以及以下 CMakeLists.txt:

add_library(catch INTERFACE)
target_include_directories(catch INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)
target_sources(catch INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/test_main.cpp")

最外层的 CMakeLists.txt 包括 Catch2 和 add_subdirectory:

add_subdirectory(Catch2)

然后您可以通过以下方式在项目的任何位置设置测试可执行文件:

add_executable(
    project_tests EXCLUDE_FROM_ALL
    test_case1.cpp
    test_case2.cpp
    ...
)

target_link_libraries(project_tests catch)

因为test_main.cpp已作为接口源文件添加到catch,它将被编译为测试可执行文件的一部分。