2012-02-16 22 views
19

Chcę napisać CMakeLists.txt, dzięki czemu mogę normalnie uruchomić testy lub z Valgrind. Widziałem wiele na temat integracji ctest z Valgrindem, ale wszystkie z założeniem, że chcesz skonfigurować serwer, aby przesyłać wyniki testu do pulpitu dart. Chcę tylko uruchomić testy na moim komputerze i zobaczyć wyniki w wierszu poleceń.Jak zrobić ctest uruchomić program z valgrind bez dart?

Jeśli muszę wykonać cmake -D VALGRIND = ON, to dobrze, ale wolę generować testy o nazwach "foo" i "valgrind_foo", jeśli to możliwe.

Odpowiedz

18

Używam valgrind do sprawdzania pamięci. Aby skonfigurować valgrind, zdefiniować następujące zmienne w moim systemie build:

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

Ponadto, tam jest mój valgrind plik tłumienie:

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

Po piszesz plików CMakeLists.txt i prawidłowo skonfigurować valgrind w nich można uruchomić następującą komendę:

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) 

To okiełznanie systemu kompilacji w celu uruchomienia automatyzacji testów lokalnie. Spodziewa uruchamianie:

ctest -R testName -D ExperimentalSubmit 

obok, do poddania się (domyślnie) lub swoim pulpicie nawigacyjnym, ale nie ma potrzeby, aby przejść przez ten krok do uruchomienia, co chcesz. Wyniki zostaną zapisane w katalogu Testowanie/Temporary /.

+0

Jak "poprawnie skonfigurować valgrind"? – ibizaman

+0

Dobre pytanie ... Zmieniłem odpowiedź. – KlingonJoe

6

Wygląda na to, że poniższe jest wystarczające. Nie używałem wcześniej oddzielnych argumentów, to była moja głupota.

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

Wydaje prostsze niż tworzenie kompilacji doświadczalnego. – aisbaa

0

Moja sprawa była na tyle prosta, że ​​po prostu użył cel niestandardowe:

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() 
Powiązane problemy