blob: 7d23636b79ef03bbd3174e21e3b623c5ee83f564 [file] [log] [blame]
Gilles Peskine3d4ea542022-11-30 17:35:44 +01001#!/bin/sh
2
Gilles Peskineeff88032022-11-30 17:51:44 +01003help () {
4 cat <<EOF
Gilles Peskine749a0d72022-11-30 18:08:14 +01005Usage: $0 [-r]
Gilles Peskineeff88032022-11-30 17:51:44 +01006Collect coverage statistics of library code into an HTML report.
7
8General instructions:
Gilles Peskine202b1a02022-12-01 17:41:36 +010091. Build the library with CFLAGS="--coverage -O0 -g3" and link the test
10 programs with LDFLAGS="--coverage".
Gilles Peskineeff88032022-11-30 17:51:44 +010011 This can be an out-of-tree build.
Gilles Peskine202b1a02022-12-01 17:41:36 +010012 For example (in-tree):
13 make CFLAGS="--coverage -O0 -g3" LDFLAGS="--coverage"
14 Or (out-of-tree):
15 mkdir build-coverage && cd build-coverage &&
16 cmake -D CMAKE_BUILD_TYPE=Coverage .. && make
Gilles Peskineeff88032022-11-30 17:51:44 +0100172. Run whatever tests you want.
183. Run this script from the parent of the directory containing the library
19 object files and coverage statistics files.
204. Browse the coverage report in Coverage/index.html.
Gilles Peskine749a0d72022-11-30 18:08:14 +0100215. After rework, run "$0 -r", then re-test and run "$0" to get a fresh report.
22
23Options
24 -r Reset traces. Run this before re-testing to get fresh measurements.
Gilles Peskineeff88032022-11-30 17:51:44 +010025EOF
26}
27
28# Copyright The Mbed TLS Contributors
Dave Rodgman16799db2023-11-02 19:47:20 +000029# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
Gilles Peskineeff88032022-11-30 17:51:44 +010030
31set -eu
32
Gilles Peskine749a0d72022-11-30 18:08:14 +010033# Collect stats and build a HTML report.
34lcov_library_report () {
Gilles Peskineeff88032022-11-30 17:51:44 +010035 rm -rf Coverage
Gilles Peskinee628f292022-11-30 17:56:58 +010036 mkdir Coverage Coverage/tmp
37 lcov --capture --initial --directory library -o Coverage/tmp/files.info
38 lcov --rc lcov_branch_coverage=1 --capture --directory library -o Coverage/tmp/tests.info
39 lcov --rc lcov_branch_coverage=1 --add-tracefile Coverage/tmp/files.info --add-tracefile Coverage/tmp/tests.info -o Coverage/tmp/all.info
40 lcov --rc lcov_branch_coverage=1 --remove Coverage/tmp/all.info -o Coverage/tmp/final.info '*.h'
41 gendesc tests/Descriptions.txt -o Coverage/tmp/descriptions
Gilles Peskinee820c0a2023-08-03 17:45:20 +020042 genhtml --title "Mbed TLS" --description-file Coverage/tmp/descriptions --keep-descriptions --legend --branch-coverage -o Coverage Coverage/tmp/final.info
Gilles Peskinee628f292022-11-30 17:56:58 +010043 rm -f Coverage/tmp/*.info Coverage/tmp/descriptions
Gilles Peskineeff88032022-11-30 17:51:44 +010044 echo "Coverage report in: Coverage/index.html"
45}
46
Gilles Peskine749a0d72022-11-30 18:08:14 +010047# Reset the traces to 0.
48lcov_reset_traces () {
49 # Location with plain make
50 rm -f library/*.gcda
51 # Location with CMake
52 rm -f library/CMakeFiles/*.dir/*.gcda
53}
54
Gilles Peskineeff88032022-11-30 17:51:44 +010055if [ $# -gt 0 ] && [ "$1" = "--help" ]; then
56 help
57 exit
58fi
59
Gilles Peskine749a0d72022-11-30 18:08:14 +010060main=lcov_library_report
61while getopts r OPTLET; do
62 case $OPTLET in
63 r) main=lcov_reset_traces;;
64 *) help 2>&1; exit 120;;
65 esac
66done
67shift $((OPTIND - 1))
68
69"$main" "$@"