Как заставить ctest запускать программу с valgrind без дротика?

Я хочу написать CMakeLists.txt, чтобы я мог нормально запускать свои тесты или с valgrind. Я много видел в интеграции ctest с valgrind, но все с предположением, что вы хотите настроить сервер для отправки результатов теста на приборную панель дротика. Я просто хочу запустить тесты на своей машине и посмотреть результаты в командной строке.

Если мне нужно сделать cmake -D VALGRIND = ON, это нормально, но я предпочел бы генерировать тесты с именами "foo" и "valgrind_foo", если это возможно.

Ответ 1

Я использую valgrind для проверки моей памяти. Чтобы настроить valgrind, я определяю следующие переменные в моей системе сборки:

find_program( MEMORYCHECK_COMMAND valgrind )
set( MEMORYCHECK_COMMAND_OPTIONS "--trace-children=yes --leak-check=full" )

Кроме того, в моем файле подавления valgrind есть:

set( MEMORYCHECK_SUPPRESSIONS_FILE "${PROJECT_SOURCE_DIR}/valgrind_suppress.txt" )

После того, как вы напишете файлы CMakeLists.txt и правильно настроите valgrind, вы можете запустить следующую команду:

cmake -G ... (to configure your build)
ctest -D ExperimentalBuild (this will build your code)
ctest -R testName -D ExperimentalTest (just runs the test)
ctest -R testName -D ExperimentalMemCheck (to run the test under valgrind)

Это позволит обмануть вашу систему сборки, чтобы локально выполнять автоматизацию тестирования. Он ожидает, что вы выполните:

ctest -R testName -D ExperimentalSubmit

next, чтобы отправить на панель (по умолчанию или в свою), но вам не нужно проходить этот шаг, чтобы запустить то, что вы хотите. Результаты будут сохранены в каталоге Testing/Temporary/.

Ответ 2

Кажется, что достаточно. Раньше я не использовал отдельные_аргументы, это была моя глупость.

function(add_memcheck_test name binary)
  set(memcheck_command "${CMAKE_MEMORYCHECK_COMMAND} ${CMAKE_MEMORYCHECK_COMMAND_OPTIONS}")
  separate_arguments(memcheck_command)
  add_test(${name} ${binary} ${ARGN})
  add_test(memcheck_${name} ${memcheck_command} ./${binary} ${ARGN})
endfunction(add_memcheck_test)

function(set_memcheck_test_properties name)
  set_tests_properties(${name} ${ARGN})
  set_tests_properties(memcheck_${name} ${ARGN})
endfunction(set_memcheck_test_properties)

Ответ 3

Мое дело было достаточно простым, я просто использовал пользовательскую цель:

project(bftest)

add_executable(bftest main.c)

target_link_libraries(bftest LINK_PUBLIC bf)

find_program(VALGRIND "valgrind")
if(VALGRIND)
    add_custom_target(valgrind
        COMMAND "${VALGRIND}" --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes $<TARGET_FILE:bftest>)
endif()