C++ 与CMake/CDash一起使用gcov的详细指南?

C++ 与CMake/CDash一起使用gcov的详细指南?,c++,testing,cmake,code-coverage,cdash,C++,Testing,Cmake,Code Coverage,Cdash,我正在将CMake用于我的项目,并为连续/夜间构建设置cdash服务器。一切都很好,通过设置crontab,我们可以将每小时/每夜的构建/测试结果自动上传到我们的cdash服务器 我的下一步是将测试覆盖率报告添加到构建中。我在这里找到了这份文件,但坦率地说,它离实用指南有点远 目前,我已经添加了必需的标志(我发现编译过程生成.gcno文件的效果更好,而不是-fprofile arcs-ftest coverage)。但是我被卡住了。命令 make NightlyCoverage 似乎什么都没做

我正在将CMake用于我的项目,并为连续/夜间构建设置cdash服务器。一切都很好,通过设置crontab,我们可以将每小时/每夜的构建/测试结果自动上传到我们的cdash服务器

我的下一步是将测试覆盖率报告添加到构建中。我在这里找到了这份文件,但坦率地说,它离实用指南有点远

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

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

我已经成功使用了

只需遵循指导原则:将文件添加到我的
CMAKE\u模块路径
目录,添加

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()
在my
CMakeLists.txt
中。我还手动添加了
gcov
作为我的目标的依赖项:

if(CMAKE_COMPILER_IS_GNUCXX)
    target_link_libraries(${PROJECT_TEST_NAME} gcov)
endif()
用这个,我只是打字

make my_project_coverage

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

我使用
gcovr
生成GCC代码覆盖率报告,而不使用
CodeCoverage.cmake

$ cd /path/to/your/project
$ mkdir build && cd build && cmake ..
$ make && make test
$ gcovr -r ../ .

我用以下方式设置我的项目“foo”。将cmake文件从复制到子目录“cmake_modules”。在CMakeLists.txt文件中,在添加可执行文件(foo…)之后,我添加了以下内容:

if(CMAKE_COMPILER_IS_GNUCXX)
LIST(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake_modules")
include(CodeCoverage)
APPEND_COVERAGE_COMPILER_FLAGS()
set(COVERAGE_LCOV_EXCLUDES 'dir1/*' 'dir2/*') // this is optional if you want to exclude some directory from the report
SETUP_TARGET_FOR_COVERAGE_LCOV(NAME foo_coverage
                              EXECUTABLE foo
                              DEPENDENCIES foo)
endif()
完成cmake后,构建目标 制作 做福ê保险
然后在build文件夹的foo_coverage文件夹中打开带有index.html文件的报告

此答案与@rcomblen的答案相同,但有点过时,因此我将分享我的解决方案。以下是我所做的:

  • 创建了一个玩具项目
  • 在哪里

  • 下载googletest并将其置于第三方目录下
  • 将此线程上其他答案共享的内容复制到
    cmake/CodeCoverage.cmake
  • 安装
    gcovr
    。这一步至关重要,因为此线程上的其他答案不再适用于我已有的
    gcovr
    版本:
  • 请注意,我们需要cmake脚本的输出
    gcovr
    。 4) 编写一个cmake脚本,创建一个库,一个测试可执行文件,并使用
    CodeCoverage.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 ()
    
    就这样。现在只需建立新的目标


    祝你好运。

    没有必要链接到gcov。Gcc会自动执行此操作,但它不会与Clang一起工作。例如,Clang应该链接到一个int libprofile_rtI会添加一条说明,我在OSX上使用Clang,除了CodeCoverage.cmake中的一条警告外,此解决方案工作得非常好。@rcomblen会为所有测试聚合覆盖率结果吗?或者您需要为每个测试目标的覆盖率设置\u target\u吗?可以使用这种方法排除目录吗?我在工具本身中看不到任何选项。关于覆盖范围的
    setup\u target\u的行不正确;它应该是
    setup\u target\u for\u coverage(NAME${PROJECT\u NAME}…
    ;(我编辑了答案,但被拒绝)。我知道这在文档中,但是我发现它非常方便。
    gcovr-r。--html--html详细信息-o示例html详细信息。html
    我一直通过
    -r.
    失败,直到我发现您的命令是
    -r…
    // 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);
    }
    
    (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_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 ()