2017-01-30 92 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处理夜间覆盖报告工作的项目。)