Coverage
Before rendering, warn the user if
genhtmlis lcov 1.x (always the case on Windows msys2; also on older Linux distros). The output is degraded:LCOV_EXCL_*markers ignored (cgo helpers inbindings/go/*show 0%), flat index, all entries as absolute paths. Recommend rendering on Linux with lcov 2.x for the clean view.
1. Run coverage
bazelisk coverage --combined_report=lcov //...
Combined LCOV is at
<bazel-cache>/execroot/_main/bazel-out/_coverage/_coverage_report.dat
(printed at the end of the run). //cli/release/... installer targets
are gated by target_compatible_with, so wrong-host toolchains skip
automatically.
2. Render HTML
genhtml ships with lcov. Check the version with genhtml --version
to pick the right command path below.
- Linux:
apt install lcov/dnf install lcov/ etc. 2.x available on Ubuntu 24.04+, Debian trixie+, Fedora 39+, current nixpkgs. - Windows (msys2):
pacman -S --noconfirm mingw-w64-clang-aarch64-lcov(or matchingmingw-w64-*-lcov). Only ships 1.16.
Linux, lcov 2.x (preferred)
rm -rf /tmp/coverage-html && mkdir -p /tmp/coverage-html
unset SOURCE_DATE_EPOCH
genhtml --filter region --rc c_file_extensions=c,h,i,C,H,I,icc,cpp,cc,cxx,hh,hpp,hxx,go \
--prefix "$(pwd)" --hierarchical \
<lcov-path> -o /tmp/coverage-html
--filter region+--rc c_file_extensions=...,gotogether honor// LCOV_EXCL_START/STOP/LINEmarkers. Drop either and the markers stop working.- Unset
SOURCE_DATE_EPOCH(set by nix / dpkg-buildpackage / etc. to a fixed epoch, used by lcov as "Test Date"). No-op in normal shells. --prefix "$(pwd)"anchors relativeSF:paths to the repo root. Without it, lcov 2.x strips the longest common prefix (cli/), pushingbindings/go/*to absolute paths.--hierarchicalrenders a directory tree. Drop for a single flat index.
Linux lcov 1.x / Windows msys2 (degraded)
--filter, --rc, --hierarchical are 2.x-only — drop them.
LCOV_EXCL_* markers are ignored, index is flat. Use --no-prefix
(not --prefix): the auto prefix detection picks cli/ as the common
root and renders bindings/go/* as absolute paths while everything
else is relative — a half-stripped, inconsistent index. On Windows the
mixed \ / / separators break it further. --no-prefix disables
stripping entirely so every entry renders as a full absolute path —
ugly but uniform.
Linux:
rm -rf /tmp/coverage-html && mkdir -p /tmp/coverage-html
unset SOURCE_DATE_EPOCH
genhtml --no-prefix <lcov-path> -o /tmp/coverage-html
Windows (msys2 bash, not PowerShell / cmd — genhtml is a Perl script and path translation happens inside msys2):
cd /c/Users/<you>/path/to/geniex
rm -rf /tmp/coverage-html && mkdir -p /tmp/coverage-html
/clangarm64/bin/genhtml --no-prefix <lcov-path> -o /tmp/coverage-html
Use /tmp (msys2 maps it to C:\msys64\tmp\), **not** $TEMP —
$TEMP / $TMP are unset in msys2 bash, so -o "$TEMP/coverage-html"
silently writes to /coverage-html. PowerShell's $env:TEMP is a
different directory entirely.
3. Open the report
- Linux:
xdg-open /tmp/coverage-html/index.html - Windows (msys2 bash):
start /tmp/coverage-html/index.html(or openC:\msys64\tmp\coverage-html\index.htmlfrom Explorer)
Notes
- For a single package use the target directly,
e.g.
//cli/internal/types:types_test.