2017-01-30 40 views
0


在CMake的測試配置中,我添加標記生成代碼覆蓋率代碼覆蓋率warrnings垃圾郵件輸出

IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR 
    "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") 
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage") 
    SET(CMAKE_C_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage ") 
endif() 

我每次運行測試 - 我輸出的垃圾郵件與信息:

分析:/ xxxx/xxxxxj/projects/build-xxxxx-CLang-Debug/tests/CMakeFiles/xxxxxxxxxxxxxt_ut.dir/tests/gui/ship_design/ut_ship_stats_header.cpp.gcda:無法合併之前的GCDA文件:計數器數目不匹配(14)

分析: /xxxx/xxxxxx/projects/build-xxxxxxxxxxxxxxx-CLang-Debug/tests/CMakeFiles/xxxxxxxxxxxxxxx_ut.dir/tests/gui/ship_design/ut_ship_stats_header.cpp.gcda: 不能合併以前GCDA文件:腐敗弧標籤(0x2b8e100f)

分析: /xxxx/xxxxxx/projects/build-xxxxxxxxxxxxxxx-CLang-Debug/tests/CMakeFiles/xxxxxxxxxxxxxxx_ut.dir/tests/ut_generate_hex_path.cpp.gcda: 不能合併以前GCDA文件:腐敗的圓弧標記(0x65646f6e)

我不必這麼說,這讓閱讀測試運行結果至少困難重重。當我刪除以前生成的所有gcda文件時,上述問題消失。所以有兩種可能的解決方案。 。

  • 我可能會錯過代碼覆蓋率數據(的一些有價值的配置即呼叫LCOV --zerocounters

FIND_PROGRAM(LCOV_PATH LCOV)

命令$ {} LCOV_PATH -z - -directory $ {PROJECT_BINARY_DIR}}

  • I N在提交測試運行之前添加自定義目標,刪除所有gcda文件。

我該如何解決這個問題?

+0

清理你的* .gcda文件編譯你的源代碼 – nega

+0

報價「上面的問題消失了,當我刪除以前生成的所有文件gcda」之前。然而,問題通過另一次鏈接和測試運行重演。問題是 - 如何修改CMake或其他系統來使其自動化。 – T4ng10r

回答

0

我認爲你可能會在你的工作流程中做一些不尋常的事情,因爲你看到的問題不應該一直髮生。但是,我在這裏添加的內容應該可以幫助您弄清楚,或者完全解決它。

首先,您應該利用CMake的build-types並創建您自己的「覆蓋類型」。

## coverage flags 
set(CMAKE_CXX_FLAGS_COVERAGE "-g -O0 -fprofile-arcs -ftest-coverage" CACHE STRING "Flags used by the C++ compiler during coverage builds.") 
set(CMAKE_C_FLAGS_COVERAGE "-g -O0 -fprofile-arcs -ftest-coverage" CACHE STRING "Flags used by the C compiler during coverage builds.") 
set(CMAKE_EXE_LINKER_FLAGS_COVERAGE "-g -O0 -fprofile-arcs -ftest-coverage" CACHE STRING "Flags used for linking binaries during coverage builds.") 
set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE "-g -O0 -fprofile-arcs -ftest-coverage" CACHE STRING "Flags used by the shared libraries linker during coverage builds.") 

mark_as_advanced(
    CMAKE_CXX_FLAGS_COVERAGE 
    CMAKE_C_FLAGS_COVERAGE 
    CMAKE_EXE_LINKER_FLAGS_COVERAGE 
    CMAKE_SHARED_LINKER_FLAGS_COVERAGE) 

## Update the documentation string of CMAKE_BUILD_TYPE for GUIs 
set(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel RelWithAssert Coverage." FORCE) 

然後創建一個custom target。現在

## create our "make coverage" target 
add_custom_target(coverage 
    COMMAND if test ! -d ../output \; then mkdir ../output\; fi 
    COMMAND find ${CMAKE_BINARY_DIR} -name \*.gcda -delete 
    COMMAND lcov -b CMakeFiles/ -d . -z 
    COMMAND lcov -b -d . -c -i -o test_base.info 
    COMMAND ./env-shell.sh ctest -j2 || true 
    COMMAND lcov -b CMakeFiles/ -d . -c -o test_run.info 
    COMMAND lcov -b CMakeFiles/ -d . -a test_base.info -a test_run.info -o test_total.info 
    COMMAND lcov -o reports.info -r test_total.info '/usr/include/*' '/usr/local/*' '/cvmfs/*' '*/numpy' '/usr/lib/gcc/*' ${p} '${CMAKE_BINARY_DIR}/CMakeFiles/' '${CMAKE_BINARY_DIR}/steamshovel/*' 
    COMMAND genhtml --ignore-errors source --legend -o ../output/`date +%Y-%m-%d` reports.info 
) 

,趁着亂源的建立,運行在「覆蓋」平行於你的源目錄cmake

$ pwd 
/home/user/my_project/src 
$ mkdir ../coverage 
$ cd ../coverage 
$ cmake -DCMAKE_BUILD_TYPE=Coverage ../src 
[ ... cmake's output here ...] 
-- Configuring done 
-- Generating done 
-- Build files have been written to: /home/user/my_project/coverage 

$ 

現在,構建您的項目和測試,並運行您的「覆蓋」目標。

$ make 
$ make test-bins 
$ make coverage 
[ ... make's output here ... ] 
$ 

我們在我們的CMakeLists.txt定義的make coverage目標將:

  1. ,如果它不存在,創建一個「輸出」目錄平行於我們的源代碼和生成目錄
  2. 查找和刪除我們當前生成目錄中的所有*.gcda文件
  3. 零並初始化我們的lcov計數器和輸出文件
  4. 運行我們的通過ctest
  5. 測試「編譯」 lcov輸出,並生成我們的HTML覆蓋報告

請注意,您可能需要調整的東西爲您的特定項目。

在這一點上,我強烈建議自動化所有這一切。將它添加到持續集成中(如果有的話),或者甚至設置一個cron作業,以便它在一夜之間運行,並且您有新的覆蓋報告以開始新的一天。 (這些例子都是從不會通過buildbot處理夜間覆蓋報告工作的項目。)