Как запустить ctest после создания моего проекта с помощью cmake

Я хочу, чтобы мои тесты запускались каждый раз, когда мой проект был успешно построен. И если некоторые тесты не пройдены, я хочу, чтобы моя сборка тоже была повреждена. По умолчанию мне нужно запускать тесты вручную с ctest команды ctest. CTest может фактически собрать проект, но я использую IDE, которая вызывает make для создания исходных текстов. И make не запускает тесты.

Я добавляю эту команду в мой корневой файл CMakeLists.txt, но она не работает.

add_custom_command(OUTPUT tests.txt 
                   POST_BUILD
                   COMMAND ctest --output-on-failure)

CMake не возвращает никаких ошибок, и все работает нормально, но моя пользовательская команда не запускается. Как я могу запустить что-то после каждой успешной сборки в CMake?

Обновить:

Мое окончательное решение заключается в создании этого макроса:

macro(add_unit_test target target_test)
    set(UNIT_TEST_TARGETS ${UNIT_TEST_TARGETS} ${target_test} PARENT_SCOPE)
    add_test(target ${CMAKE_CURRENT_BINARY_DIR}/${target_test})
endmacro(add_unit_test)

Вызывает add_test и запоминает цель теста в списке. Каждый тест в проекте добавляется этим макросом. В корне CMakeLists.txt у меня есть этот код:

add_custom_target( all_tests ALL
                   DEPENDS ${UNIT_TEST_TARGETS}
)
add_custom_command(TARGET all_tests
                   COMMENT "Run tests"
                   POST_BUILD COMMAND ctest ARGS --output-on-failure
                   WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)

Он создает пользовательскую цель, которая зависит от всех модульных тестов в проекте. Пользовательская команда запускается после all_tests цель all_tests была построена.

Ответ 1

Эта форма add_custom_command будет выполняться только в том случае, если другая цель CMake имеет зависимость от "tests.txt". Я предполагаю, что никакая другая цель не имеет "tests.txt" в качестве входного файла, поэтому пользовательская команда никогда не запускается.

Я думаю, вы могли бы использовать вторую форму add_custom_command для достижения своей цели; что-то вроде:

add_custom_command(TARGET MainTest
                   POST_BUILD
                   COMMAND ctest -C $<CONFIGURATION> --output-on-failure)