[CMAKE] Add support for generating test coverage reports
Summary:
This is inspired by the autotools make cov feature, but is not
identical.
Main differences with core:
- The way autotools coverage works requires the user to run the build
before calling the cov target, in order to build the baseline coverage
data. With cmake, the all target is built to regenerate the coverage
baseline data.
- The coverage target is associated to the test target. So `ninja
coverage-check` build a coverage report for the check target, `ninja
coverage-check-functional` for the check-functional target, etc.
To get a global coverage, one can use ninja coverage-check-all or
ninja coverage-check-extended. It also avoids adding switch at build
time to run the extended tests (what autotools does).
Note: the -DUSE_COVERAGE=1 from core is not ported as it is no longer
in use since D5047.
For now only the association of lcov, gcov and genhtml is
supported (llvm-cov requires a wrapper to work as gcov).
Test Plan:
cmake -GNinja .. -DCMAKE_BUILD_TYPE=Release -DENABLE_COVERAGE=ON
Should display a warning message: It is advised to not enforce CMAKE_BUILD_TYPE to get the best coverage results
cmake -GNinja .. \ -DCMAKE_C_COMPILER=gcc \ -DCMAKE_CXX_COMPILER=g++ \ -DENABLE_COVERAGE=ON \ -DENABLE_BRANCH_COVERAGE=ON ninja coverage-check-all
Be patient, it takes a long time to complete.
Open the generated check-all.coverage/index.html and navigate through
the coverage report.
Try to run a few other coverage targets, like:
ninja coverage-check
or
ninja coverage-check-functional
With secp256k1 standalone:
cmake -GNinja .. \ -DCMAKE_C_COMPILER=gcc \ -DSECP256K1_ENABLE_COVERAGE=ON \ -DSECP256K1_ENABLE_BRANCH_COVERAGE=ON ninja coverage-check-secp256k1
Reviewers: #bitcoin_abc, deadalnix
Reviewed By: #bitcoin_abc, deadalnix
Subscribers: deadalnix
Differential Revision: https://reviews.bitcoinabc.org/D5321