2012-10-29 9 views
35

Sto usando CMake con il mio progetto e ho installato un server cdash per la costruzione continua/notturna. Tutto funziona bene e con l'impostazione di un crontab, i risultati di test/generazione orari/notturni vengono caricati automaticamente sul nostro server cdash.Guida dettagliata sull'uso di gcov con CMake/CDash?

Il mio prossimo passo è aggiungere un rapporto di copertura del test alla costruzione. Trovo il documento qui http://www.cmake.org/Wiki/CTest:Coverage ma francamente è un po 'lontano da una guida pratica.

Attualmente ho aggiunto il flag richiesto (anziché -fprofile-arcs -ftest-coverage, trovo lo --coverage migliore), il processo di compilazione genera i file .gcno. Ma poi sono bloccato. Il comando

make NightlyCoverage 

non sembra fare nulla. Qualcuno potrebbe dirmi quale sarà il prossimo? Il risultato che voglio è quello di fare make NightlyCoverage, i report di copertura sono generati e caricati sul server cdash.

risposta

39

Sto usando con successo https://github.com/bilke/cmake-modules/blob/master/CodeCoverage.cmake.

solo seguito le linee guida: aggiunti i file al mio indice CMAKE_MODULE_PATH, ha aggiunto

set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMakeModules) 
if(CMAKE_COMPILER_IS_GNUCXX) 
    include(CodeCoverage) 
    setup_target_for_coverage(${PROJECT_NAME}_coverage ${PROJECT_TEST_NAME} coverage) 
endif() 

nel mio CMakeLists.txt. Ho anche aggiunto manualmente gcov come una dipendenza per il mio obiettivo:

if(CMAKE_COMPILER_IS_GNUCXX) 
    target_link_libraries(${PROJECT_TEST_NAME} gcov) 
endif() 

Con questo, mi basta digitare

make my_project_coverage 

e ottengo il report HTML nella coverage directory del mio albero build.

+3

Collegamento a gcov isn' davvero necessario Gcc lo fa automaticamente comunque e non funzionerà con Clang per esempio che invece dovrebbe collegare againt libprofile_rt – Joakim

+2

Aggiungerò una nota che sto usando clang su OSX e oltre a un avvertimento in CodeCoverage.cmake, questa soluzione ha funzionato perfettamente. – nevelis

+3

@rcomblen Questo aggregherà i risultati della copertura per tutti i test? O hai bisogno di setup_target_for_coverage per ogni target di test? –

0

Ho un metodo di brutto da usare gcovr per fare un rapporto GCC Code Coverage senza la CodeCoverage.cmake: spostare tutti *.gcno e *.gcda file di proiettare directory principale e quindi eseguire gcovr

$ cd /path/to/your/project 
$ mkdir build && cd build && cmake .. 
$ make && make test 
$ find . -type f \(-iname \*.gcno -or -iname \*.gcda \) -exec cp {} .. \; 
$ cd .. 
$ gcovr -v -r .