我很难按照本指南(我在另一篇文章中看过推荐)对此事https://github.com/bilke/cmake-modules/blob/master/CodeCoverage.cmake
首先:
将此文件复制到您的cmake模块路径中。
我如何知道我的cmake模块路径是什么?
使用SETUP_TARGET_FOR_COVERAGE函数创建自定义make 目标
这究竟是什么意思?我怎么做?特别是,我需要输入什么以及在哪里?
我被迫用cmake编译应用程序,否则我会用gcc编译。
答案 0 :(得分:5)
通过调用设置cmake模块路径
set(CMAKE_MODULE_PATH <path>)
cmake模块路径设置告诉cmake在哪里查找cmake模块,例如include
宏包含的模块。
例如,我使用CodeCoverage.cmake的步骤是:
将以下内容添加到我的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"
使用cmake
-DCMAKE_BUILD_TYPE=Coverage
运行make
运行make <coverage_target>
请注意:
${TEST_TARGET}
是我使用我之前在脚本中创建的单元测试目标名称设置的变量。<coverage_target>
是由${PROJECT_NAME}_coverage
生成的任何字符串。 if
包装封面创建。答案 1 :(得分:1)
作为使用 CMake 模块进行 gcov 集成的替代方法,可以在不修改构建系统的情况下使用 do it。你只需要大约 5 行 shell。对于不太大或不太复杂的项目,这是一种不错的方法。
根据本书,必须将源文件名列表(不包括标题)提供给 gcov。这是基于各种命名和目录约定:gcov 假定源文件具有类似 foo.c
或 foo.cpp
的名称,并且相应的目标文件名为 foo.o
并且位于同一目录中作为源文件。但默认情况下,CMake 将它们命名为 foo.cpp.o
。 gcov 去除给定源文件名的扩展名,然后添加 .gcno
和 .gcda
后缀。我们可以通过提供 gcov 而不是源文件,.gcda 文件来利用这些事实。事实证明,在这种情况下,gcov 会在正确的位置寻找所有内容。
通过将 --coverage
标志添加到 CMAKE_C_FLAGS
和/或 CMAKE_CXX_FLAGS
来打开编译器和链接器标志中的覆盖率数据。这使编译器在构建时生成 .gcno 文件,并使可执行文件在退出时转储 .gcda 文件。
为[运行测试/生成报告/清理覆盖数据]循环编写脚本。这是一个准系统的 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
foo.gcov
),而通常它会编码完整路径,如 src#foo#foo.gcov
。这可能会导致报告文件中的名称冲突。--coverage
已打开然后关闭)。