Как заставить 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()