我想写一个CMakeLists.txt,以便我可以正常运行我的测试或使用valgrind。我已经看到很多关于将ctest与valgrind集成,但所有这些都假设您要设置服务器以将测试结果提交到飞镖仪表板。我只想在我的机器上运行测试并在命令行上查看结果。
如果我必须做一个cmake -D VALGRIND = ON就好了,但如果可能的话,我宁愿生成名为“foo”和“valgrind_foo”的测试。
答案 0 :(得分:23)
我使用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 /目录中。
答案 1 :(得分: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)
答案 2 :(得分: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()
答案 3 :(得分:0)
您可以使用add_custom_target()
生成最小的'DartConfiguration.tcl'配置文件。然后,您可以添加一个valgrind
自定义目标,该目标使用适当的参数调用ctest
。这是我通常的做法:
find_program(VALGRIND "valgrind")
if (VALGRIND)
set(DART_CONFIG DartConfiguration.tcl)
add_custom_target(${DART_CONFIG}
COMMAND echo "MemoryCheckCommand: ${VALGRIND}" >> ${DART_CONFIG}
COMMENT "Generating ${DART_CONFIG}"
)
set(VALGRIND_ARGS
--leak-check=full
--error-exitcode=255
)
set(LOGFILE memcheck.log)
add_custom_target(valgrind
COMMAND ctest -O ${LOGFILE} -D ExperimentalMemCheck --overwrite MemoryCheckCommandOptions="${VALGRIND_ARGS}"
COMMAND tail -n1 ${LOGFILE} | grep 'Memory checking results:' > /dev/null
COMMAND rm -f ${LOGFILE}
DEPENDS ${DART_CONFIG}
)
endif()
希望这会有所帮助! :-)
信用:https://github.com/ARMmbed/mbedtls/blob/development/CMakeLists.txt#L237