Utilizo una variante de la respuesta de richq. En el nivel superior CMakeLists.txt, agrego un objetivo personalizado build_and_test, para construir y ejecutar todas las pruebas:
find_package(GTest)
if (GTEST_FOUND)
enable_testing()
add_custom_target(build_and_test ${CMAKE_CTEST_COMMAND} -V)
add_subdirectory(test)
endif()
En los diversos CMakeLists.txtarchivos de subproyecto a continuación test/, agrego cada ejecutable de prueba como una dependencia de build_and_test:
include_directories(${CMAKE_SOURCE_DIR}/src/proj1)
include_directories(${GTEST_INCLUDE_DIRS})
add_executable(proj1_test proj1_test.cpp)
target_link_libraries(proj1_test ${GTEST_BOTH_LIBRARIES} pthread)
add_test(proj1_test proj1_test)
add_dependencies(build_and_test proj1_test)
Con este enfoque, solo necesito en make build_and_testlugar de make test(o make all test), y tiene la ventaja de crear solo código de prueba (y sus dependencias). Es una pena que no pueda usar el nombre del objetivo test. En mi caso, no es tan malo porque tengo un script de nivel superior que depura y libera (y compila de forma cruzada) compilaciones fuera del árbol llamando cmakey luego make, y se traduce testen build_and_test.
Obviamente, las cosas de GTest no son necesarias. Simplemente uso / me gusta Google Test, y quería compartir un ejemplo completo de su uso con CMake / CTest. En mi humilde opinión, este enfoque también tiene la ventaja de permitirme usar ctest -V, que muestra el resultado de la prueba de Google mientras se ejecutan las pruebas:
1: Running main() from gtest_main.cc
1: [==========] Running 1 test from 1 test case.
1: [----------] Global test environment set-up.
1: [----------] 1 test from proj1
1: [ RUN ] proj1.dummy
1: [ OK ] proj1.dummy (0 ms)
1: [----------] 1 test from proj1 (1 ms total)
1:
1: [----------] Global test environment tear-down
1: [==========] 1 test from 1 test case ran. (1 ms total)
1: [ PASSED ] 1 test.
1/2 Test #1: proj1_test ....................... Passed 0.03 sec