2012-02-16 7 views
19

Quiero escribir un CMakeLists.txt para que pueda ejecutar mis pruebas normalmente o con valgrind. He visto mucho sobre la integración de ctest con valgrind, pero todo con la suposición de que desea configurar un servidor para enviar resultados de prueba a un dartboard. Solo quiero ejecutar las pruebas en mi máquina y ver los resultados en la línea de comando.¿Cómo hago para que ctest ejecute un programa con valgrind sin dardo?

Si tengo que hacer un cmake -D VALGRIND = ON, eso está bien, pero prefiero generar pruebas llamadas "foo" y "valgrind_foo" si es posible.

Respuesta

18

Uso valgrind para mi verificación de memoria. Para configurar valgrind, defino las siguientes variables en mi sistema de construcción:

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

Además, allí es mi valgrind archivo de supresión:

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

Después de escribir sus archivos CMakeLists.txt y configurar correctamente valgrind en ellos, puede ejecutar el siguiente comando:

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) 

Esto engañará a su sistema de compilación para ejecutar la automatización de prueba localmente. Se espera que ejecute:

ctest -R testName -D ExperimentalSubmit 

siguiente, a someterse a la (por defecto o su) del tablero de instrumentos, pero que no tienen que pasar por este paso para ejecutar lo que quiere. Los resultados se almacenarán en el directorio Testing/Temporary /.

+0

¿Cómo se "configura valgrind correctamente en ellos"? – ibizaman

+0

Buena pregunta ... He editado la respuesta. – KlingonJoe

6

Parece que lo siguiente es suficiente. No estaba usando separate_arguments antes, esa era mi estupidez.

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

Esto parece más simple que la creación de acumulación experimental. – aisbaa

0

Mi caso era bastante simple que acabo de utilizar un objetivo personalizado:

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