如何将GCOV与Cmake一起使用

How to use gcov with Cmake

本文关键字:一起 Cmake GCOV      更新时间:2023-10-16

我在本指南之后遇到困难(我在另一篇文章中看到了建议)https://github.com/bilke/bilke/cmake-modules/blob/master/codecoverage.cmake

首先:

将此文件复制到您的CMAKE模块路径中。

我怎么知道我的cmake模块路径是什么?

使用函数setup_target_for_coverage创建自定义制作 目标

这到底是什么意思?我怎么做?特别是,我必须输入什么,在哪里?

我被迫用CMAKE编译该应用程序,否则我会使用GCC进行。

您通过调用来设置CMAKE模块路径 set(CMAKE_MODULE_PATH <path>)

CMAKE模块路径设置告诉CMAKE在哪里寻找CMAKE模块,例如include宏所包含的模块。

例如,我采取的步骤使用codecoverage.cmake是:

  1. 复制codecoverage.cmake在"脚本/cmake'的源文件夹中"。
  2. 将以下内容添加到我的cmakelists.txt:

    set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/scripts/cmake)
    if (CMAKE_BUILD_TYPE STREQUAL "Coverage")
        include(CodeCoverage)
        setup_target_for_coverage(${PROJECT_NAME}_coverage ${TEST_TARGET} coverage)
        SET(CMAKE_CXX_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage")
        SET(CMAKE_C_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage")
    endif() #CMAKE_BUILD_TYPE STREQUAL "Coverage"
    
  3. 使用-DCMAKE_BUILD_TYPE=Coverage

  4. 运行cmake
  5. 运行make

  6. 运行make <coverage_target>

请注意:

  • ${TEST_TARGET}是一个变量I设置,其名称是我在脚本中之前创建的单元测试目标的名称。
  • <coverage_target>${PROJECT_NAME}_coverage生成的任何字符串。
  • 您不必像我一样用if包裹覆盖范围的创建。
  • 由于我正在使用AppleClang,因此我必须修复CodeCoverage.cmake脚本以允许它。现在编写的方式允许GCC和Clang 3.0.0或仅较新。

gcov cmake

零行

作为使用CMAKE模块进行GCOV集成的替代方法,可以在不修改构建系统的情况下使用它。您只需要大约5行的外壳。对于不太大或复杂的项目,这是一种很好的方法。

通过本书,必须将源文件名(不包括标题)的列表馈送到GCOV。这基于各种命名和目录约定:GCOV假设源文件具有诸如foo.cfoo.cpp之类的名称,并且相应的对象文件称为foo.o,并且与源文件相同。但是默认情况下,cmake将它们称为foo.cpp.o。GCOV剥离给定源文件名的扩展名,然后添加.gcno.gcda后缀。我们可以通过喂食GCOV而不是源文件来利用这些事实,即 .gcda 文件。事实证明,在这种情况下,GCOV将在正确的位置寻找所有内容。

操作方法

  1. 通过将--coverage标志添加到CMAKE_C_FLAGS和/或CMAKE_CXX_FLAGS中,打开编译器和链接器标志中的覆盖范围数据。这使编译器在构建时间生成.gcno文件,并且在退出时使可执行文件dump .gcda文件。

  2. 制作[运行测试/生成报告/清洁覆盖数据]循环的脚本。这是一个准骨bash示例:

    # Ensure we are in the build directory and that coverage was enabled in the compiler
    grep -q -- --coverage CMakeCache.txt || exit 1
    # Clean up old runtime data
    find . -name '*.gcda' -exec rm {} ;
    # Run test command (specified as script arguments)
    # This can be anything that runs program(s) built by the project 
    "${@}"
    # Generate reports (.gcov files). All .gcda files in the build directory are passed as gcov args.
    find . -name '*.gcda' | xargs gcov
    

这种方法的优点

  • 可以重复使用相同的脚本,而无需在每个感兴趣的项目上执行CMAKE集成
  • 没有复杂的CMAKE代码
  • 灵活性可以轻松更改测试命令。CMAKE集成的清洁/运行/报告循环可能具有一个硬编码命令来运行所有测试,这通常比运行一个测试的用途(且较慢)。

cons

  • 丢失了完整的路径信息。每个.GCOV文件的名称仅包含basename(foo.gcov),而通常会像src#foo#foo.gcov一样对完整路径进行编码。这可能会导致报告文件中的名称碰撞。
  • 缺乏将依赖性信息集成到构建系统中意味着您可能会意外使用旧的.gcno文件忘记重建时(如果打开--coverage,然后关闭)。