2012-10-29 31 views
35

我正在使用CMake與我的項目,並建立一個連續/夜間建設的CDash服務器。一切運行良好,並通過設置一個crontab,我們每小時/每晚的構建/測試結果自動上傳到我們的cdash服務器。在CMake/CDash中使用gcov的詳細指南?

我的下一步是向構建添加測試覆蓋率報告。我在這裏找到文檔http://www.cmake.org/Wiki/CTest:Coverage,但坦率地說,這與實用指南有點相似。

目前我已經添加了所需的標誌(而不是-fprofile-arcs -ftest-coverage,我發現--coverage更好),編譯過程生成.gcno文件。但後來我卡住了。命令

make NightlyCoverage 

似乎沒有做任何事情。有誰能告訴我下一步該做什麼?我想要的結果是通過做make NightlyCoverage,覆蓋報告生成並上傳到cdash服務器。

回答

39

我一直在成功使用https://github.com/bilke/cmake-modules/blob/master/CodeCoverage.cmake

只需遵循的準則:添加文件到我的CMAKE_MODULE_PATH目錄,在我CMakeLists.txt添加

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

。我還手動添加gcov作爲我的目標的依賴關係:

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

有了這個,我只需鍵入

make my_project_coverage 

,我得到的coverage目錄我的構建樹的HTML報告。

+3

鏈接到gcov一個ISN」真的有必要。 Gcc會自動執行此操作,並且它不會與Clang一起使用,例如,它應該再次鏈接libprofile_rt – Joakim

+2

我將添加一條註釋,說明我在OSX上使用了clang,並且除了CodeCoverage.cmake中的警告外,此解決方案還是完美運行。 – nevelis

+3

@rcomblen這會彙總所有測試的覆蓋率結果嗎?或者您是否需要爲每個測試目標設置setup_target_for_coverage? –

0

我有一個醜陋的方法使用gcovr做出GCC代碼覆蓋率報告沒有CodeCoverage.cmake:將所有*.gcno*.gcda文件到項目的根目錄,然後運行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 .