将 gcov 与 CMake/Cash 结合使用的详细指南?

新手上路,请多包涵

我在我的项目中使用 CMake,并设置了一个 cdash 服务器以进行连续/夜间构建。一切正常,通过设置 crontab,我们每小时/每晚的构建/测试结果会自动上传到我们的 cdash 服务器。

我的下一步是将测试覆盖率报告添加到构建中。我在这里找到文档 https://gitlab.kitware.com/cmake/community/-/wikis/doc/ctest/Coverage 但坦率地说,它离实用指南有点远。

目前我已经添加了所需的标志(而不是 -fprofile-arcs -ftest-coverage ,我发现 --coverage 更好),编译过程会生成 .gcno 文件。但后来我被困住了。命令

make NightlyCoverage

似乎什么也没做。谁能告诉我下一步该做什么?我想要的结果是通过 make NightlyCoverage 生成覆盖率报告并上传到 cdash 服务器。

原文由 Ralph Zhang 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

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

只需遵循指南:将文件添加到我的 CMAKE_MODULE_PATH 目录中,添加

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

在我的 CMakeLists.txt 中。我还手动添加了 gcov 作为我的目标的依赖项:

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

有了这个,我只需输入

make my_project_coverage

我在构建树的 coverage 目录中获得了 html 报告。

原文由 rcomblen 发布,翻译遵循 CC BY-SA 3.0 许可协议

这个答案与@romblen 的答案相同,但有点过时,所以我将分享我的解决方案。这是我所做的:

  1. 创建了一个玩具项目
(base) ciaran@DESKTOP-K0APGUV:/mnt/d/CoverageTest$ tree -L 2
.
├── CMakeLists.txt
├── cmake
│   └── CodeCoverage.cmake
├── src
│   ├── domath.cpp
│   ├── domath.h
│   └── testdomath.cpp
└── third_party
    └── googletest

在哪里

// src/domath.h

#ifndef COVERAGETEST_DOMATH_H
#define COVERAGETEST_DOMATH_H

class domath {

public:
    int add(int a, int b);
};

#endif //COVERAGETEST_DOMATH_H

// src/domath.cpp

#include "domath.h"

int domath::add(int a, int b) {
    return a + b;
}

// src/testdomath.cpp
#include "gtest/gtest.h"
#include "domath.h"

TEST(DoMathTests, testAdd){
    domath m;
    int actual = m.add(4, 6);
    ASSERT_EQ(10, actual);
}

  1. 下载 googletest 并将其放在第三方目录下
  2. 将此线程上其他答案分享的 要点 复制到 cmake/CodeCoverage.cmake
  3. 安装 gcovr 。此步骤至关重要,因为此线程上的其他答案不再适用于我已经拥有的 gcovr 版本:
 (base) ciaran@DESKTOP-K0APGUV:/mnt/d/CoverageTest$ pip install gcovr
(base) ciaran@DESKTOP-K0APGUV:/mnt/d/CoverageTest$ gcovr --version
gcovr 4.2
(base) ciaran@DESKTOP-K0APGUV:/mnt/d/CoverageTest$ which gcovr
/home/ciaran/miniconda3/bin/gcovr

注意,对于 cmake 脚本,我们需要 gcovr 的输出。 4) 编写一个创建库、测试可执行文件并使用 CodeCoverage.cmake 模块的 cmake 脚本:

 cmake_minimum_required(VERSION 3.15)
project(CoverageTest)

set(CMAKE_CXX_STANDARD 14)

# setup googletest
add_subdirectory(third_party/googletest)

# create our library
add_library(DoMath STATIC src/domath.h src/domath.cpp)
add_dependencies(DoMath gtest gtest_main)

# create the test executable
add_executable(TestDoMath src/testdomath.cpp)
target_include_directories(TestDoMath PRIVATE third_party/googletest/googletest)
target_link_libraries(TestDoMath PRIVATE
        DoMath gtest gtest_main)
add_dependencies(TestDoMath DoMath gtest gtest_main)

# now for coverage bits
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
if (CMAKE_COMPILER_IS_GNUCXX)
    include(CodeCoverage)
    append_coverage_compiler_flags()

    # we need to turn off optimization for non-skewed coverage reports
    set(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -O0")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0")

    # optional excludes - None needed here
    #    set(COVERAGE_EXCLUDES)

    # importantly, set the path to the gcovr executable that you downladed
    set(GCOVR_PATH "/home/ciaran/miniconda3/bin/gcovr")
    # Works
    setup_target_for_coverage_gcovr_xml(
            NAME TestDoMathCoverageXml
            EXECUTABLE TestDoMath
            DEPENDENCIES TestDoMath DoMath
    )
    # Works
    setup_target_for_coverage_gcovr_html(
            NAME TestDoMathCoverageHtml
            EXECUTABLE TestDoMath
            DEPENDENCIES TestDoMath DoMath
    )
    # This one did not work for me:
    setup_target_for_coverage_lcov(
            NAME TestDoMathCoverageLcov
            EXECUTABLE TestDoMath
            DEPENDENCIES TestDoMath DoMath
    )
endif ()

就是这样。现在只需构建新目标。

祝你好运。

原文由 CiaranWelsh 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题