如何在Cmake

时间:2016-06-22 02:33:20

标签: c++ cmake gcov

我很难按照本指南(我在另一篇文章中看过推荐)对此事https://github.com/bilke/cmake-modules/blob/master/CodeCoverage.cmake

首先:

  

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

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

  

使用SETUP_TARGET_FOR_COVERAGE函数创建自定义make   目标

这究竟是什么意思?我怎么做?特别是,我需要输入什么以及在哪里?

我被迫用cmake编译应用程序,否则我会用gcc编译。

2 个答案:

答案 0 :(得分:5)

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

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

例如,我使用CodeCoverage.cmake的步骤是:

  1. 将CodeCoverage.cmake复制到'scripts / 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. 使用cmake

  4. 运行-DCMAKE_BUILD_TYPE=Coverage
  5. 运行make

  6. 运行make <coverage_target>

  7. 请注意:

    • ${TEST_TARGET}是我使用我之前在脚本中创建的单元测试目标名称设置的变量。
    • <coverage_target>是由${PROJECT_NAME}_coverage生成的任何字符串。
    • 您不必像我一样用if包装封面创建。
    • 由于我使用的是AppleClang,因此我必须修复CodeCoverage.cmake脚本以允许它。它现在的编写方式允许gcc和clang 3.0.0或更新版本。

答案 1 :(得分:1)

带有零行 CMake 的 gcov

作为使用 CMake 模块进行 gcov 集成的替代方法,可以在不修改构建系统的情况下使用 do it。你只需要大约 5 行 shell。对于不太大或不太复杂的项目,这是一种不错的方法。

根据本书,必须将源文件名列表(不包括标题)提供给 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 文件,并使可执行文件在退出时转储 .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 集成的 clean/run/report 循环可能有一个硬编码命令来运行所有测试,这通常比运行单个测试有用(而且速度更慢)。

缺点

  • 完整路径信息丢失。每个 .gcov 文件的名称仅包含基本名称 (foo.gcov),而通常它会编码完整路径,如 src#foo#foo.gcov。这可能会导致报告文件中的名称冲突。
  • 缺少将依赖信息集成到构建系统中意味着您可能会在忘记重建时意外使用旧的 .gcno 文件(如果 --coverage 已打开然后关闭)。