如何在 TravisCI 中为 C++ w/ CMake 项目正确配置 CodeCov?

How to properly configure CodeCov for a C++ w/ CMake project in TravisCI?

本文关键字:项目 配置 CodeCov CMake TravisCI 中为 C++      更新时间:2023-10-16

我试图用TravisCI在我的GitHub存储库上配置CodeCov。由于我的存储库已C++并且我已经使用了 CMake,因此我基本上将此示例的after_success标签复制粘贴到我的.travis.yml文件中:

after_success:
# Creating report
- cd ${TRAVIS_BUILD_DIR}
- lcov --directory . --capture --output-file coverage.info coverage info
- lcov --remove coverage.info '/usr/*' --output-file coverage.info 
- lcov --list coverage.info
# Uploading report to CodeCov
- bash <(curl -s https://codecov.io/bash) || echo "Codecov did not collect coverage reports"

我推送了一个自定义.codecov.yml文件以提供我的令牌和通知设置,但after_success只是示例中建议的设置。我真的不熟悉lcov,所以我不知道是否缺少其他内容或这些呼叫的用途。

查看CodeCov的文档,我找不到我可能缺少的内容,但我的覆盖范围报告是空的,lcov因为我找不到一些神秘的.gcda文件(我猜(。CodeCov 的文档在任何地方都没有提到这一点,所以我想我在配置中错过了一个重要步骤(或者由于某种原因找不到该文件......?

这是 TravisCIafter_success阶段的输出:

$ lcov --directory . --capture --output-file coverage.info
Capturing coverage data from .
Found gcov version: 4.8.4
Scanning . for .gcda files ...
geninfo: ERROR: no .gcda files found in .!
$ lcov --remove coverage.info '/usr/*' --output-file coverage.info
Reading tracefile coverage.info
lcov: ERROR: no valid records found in tracefile coverage.info
$ lcov --list coverage.info
Reading tracefile coverage.info
lcov: ERROR: no valid records found in tracefile coverage.info
$ bash <(curl -s https://codecov.io/bash) || 
echo "Codecov did not collect coverage reports"
_____          _
/ ____|        | |
| |     ___   __| | ___  ___ _____   __
| |    / _  / _` |/ _ / __/ _   / /
| |___| (_) | (_| |  __/ (_| (_)  V /
________/ __,_|___|______/ _/
Bash-8fda091
==> Travis CI detected.
project root: .
--> token set from env
...
==> Running gcov in . (disable via -X gcov)
==> Python coveragepy not found
==> Searching for coverage reports in:
+ .
-> Found 3 reports
==> Detecting git/mercurial file structure
==> Appending build variables
+ TRAVIS_OS_NAME
==> Reading reports
- Skipping empty file ./coverage.info
+ ./doc/****.zip bytes=337165           -----> That's not a report.
+ ./doc/****.pdf bytes=353614           -----> That's not a report.
==> Appending adjustments
http://docs.codecov.io/docs/fixing-reports
+ Found adjustments
==> Uploading reports
url: https://codecov.io
query: branch=codecov&commit=*****...
-> Pinging Codecov
-> Uploading to S3 https://codecov.s3.amazonaws.com
-> View reports at https://codecov.io/github/********

问题出在 Cmake 编译器和链接器标志上。为了使GCov(GCC的一部分,由lcov使用(提供分析信息和覆盖测试,必须设置一些标志。

从 C 单元测试的代码覆盖率:

具体而言,您需要编译器将分析信息添加到目标代码中,这是通过将标志-fprofile-arcs-ftest-coverage添加到编译命令来完成的。

第一个标志将逻辑添加到目标代码以生成通用分析信息。这是有关每个基本块的执行频率的信息。当程序运行时,所有这些信息都将保存到扩展名为 .da 的新文件中,位于 .o 文件旁边。此文件中的数据不是特定于覆盖范围的,但将由 gcov 使用。

您传递给 GCC 的第二个标志-ftest-coverage也将向目标文件添加逻辑。这一次,目标是输出特定于覆盖范围的信息。将生成两个文件,.bb 和 .bbg。.bb文件是从基本块到行号的简单映射文件。.bbg 文件列出了执行应用程序时运行的相应源文件中的每个弧。gcov 使用此数据来重建实际的程序流图,从中可以计算所有基本的块和弧执行计数。

此外,来源需要与-lgcov --coverage.就我而言,由于我使用的是 Cmake,我需要使用set_target_properties函数指定这些:

add_executable(dss-sim dss-sim.cpp)
target_link_libraries(dss-sim
list
of
my
static
libs
)
# The libs above also need to be compiled with the same flags.
set_target_properties(dss-sim
PROPERTIES
COMPILE_FLAGS "-ftest-coverage -fprofile-arcs"
LINK_FLAGS    "-lgcov --coverage"
)

最后,由于您通常不希望在覆盖率报告中包括单元测试,因此不会为它们定义编译器标志。但请注意,如果将单元测试与使用 gcov 选项编译的库链接,则仍需要添加链接器标志。