2012-02-16 24 views
19

我想写一个CMakeLists.txt,以便我可以正常运行我的测试或使用valgrind。我已经看到很多将ctest与valgrind集成在一起,但都假设您想要设置一个服务器来将测试结果提交给dart仪表板。我只想在我的机器上运行测试并在命令行上查看结果。如何让ctest使用没有飞镖的valgrind运行程序?

如果我必须做一个cmake -D VALGRIND = ON那很好,但我宁愿生成名为“foo”和“valgrind_foo”的测试,如果可能的话。

回答

18

我使用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 

旁边,递交给(默认或你)仪表板,但你并不需要经过此步骤来运行你想要什么。结果将存储在Testing/Temporary /目录中。

+0

你如何“正确配置valgrind”? – ibizaman 2014-12-24 13:09:17

+0

好问题...我编辑了答案。 – KlingonJoe 2014-12-25 14:17:15

6

看来下面就足够了。我之前没有使用separate_arguments,那是我的愚蠢。

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) 
+1

这似乎比创建实验构建简单。 – aisbaa 2014-01-28 12:15:04

0

我而言太简单了,我只是用一个自定义的目标:

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()