Implement a target for capturing code coverage using lcov.
It is available when elfutils is configured using --enable-gcov.

Signed-off-by: Dmitry V. Levin <l...@altlinux.org>
---
Rather than trying to salvage the coverage target, implement a different
target for capturing code coverage similar to those I use in other
projects.  I'm sure you'll like it, too.

 ChangeLog         |  4 ++++
 configure.ac      |  3 +++
 tests/.gitignore  |  2 ++
 tests/ChangeLog   |  5 +++++
 tests/Makefile.am | 40 ++++++++++++++++++++++++++++++++++++++++
 5 files changed, 54 insertions(+)

diff --git a/ChangeLog b/ChangeLog
index 03c90b6b..fe4f1829 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2020-12-22  Dmitry V. Levin  <l...@altlinux.org>
+
+       * configure.ac [--enable-gcov]: Check for gcov, lcov, and genhtml.
+
 2020-12-20  Dmitry V. Levin  <l...@altlinux.org>
 
        * .gitignore: Move subdirectory patterns to separate .gitignore files.
diff --git a/configure.ac b/configure.ac
index 60747bc8..346ab800 100644
--- a/configure.ac
+++ b/configure.ac
@@ -311,6 +311,9 @@ if test "$use_gcov" = yes; then
   CFLAGS="$CFLAGS -fprofile-arcs -ftest-coverage"
   CXXFLAGS="$CXXFLAGS -fprofile-arcs -ftest-coverage"
   LDFLAGS="$LDFLAGS -fprofile-arcs"
+  AC_CHECK_PROG([GCOV], [gcov], [gcov])
+  AC_CHECK_PROG([LCOV], [lcov], [lcov])
+  AC_CHECK_PROG([GENHTML], [genhtml], [genhtml])
 fi
 AM_CONDITIONAL(GCOV, test "$use_gcov" = yes)
 
diff --git a/tests/.gitignore b/tests/.gitignore
index d0e83da2..4aca5c7c 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -1,3 +1,5 @@
+/*-coverage
+/*.lcov
 /*.log
 /*.trs
 /addrcfi
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 4688b50a..c0d9d4b8 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,8 @@
+2020-12-22  Dmitry V. Levin  <l...@altlinux.org>
+
+       * Makefile.am [GCOV] (coverage-html): New target.
+       * .gitignore: Update.
+
 2020-12-20  Dmitry V. Levin  <l...@altlinux.org>
 
        * .gitignore: New file.
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 502becff..293b4225 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -695,4 +695,44 @@ check: check-am coverage
 .PHONY: coverage
 coverage:
        -$(srcdir)/coverage.sh
+
+COVERAGE_OUTPUT_FILE = $(PACKAGE_NAME)-$(PACKAGE_VERSION).lcov
+COVERAGE_OUTPUT_DIRECTORY = $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage
+COVERAGE_OUTPUT_INDEX_HTML = $(COVERAGE_OUTPUT_DIRECTORY)/index.html
+COVERAGE_TITLE = $(PACKAGE_NAME)-$(PACKAGE_VERSION) coverage
+
+CLEANFILES += $(COVERAGE_OUTPUT_FILE)
+
+clean-local: coverage-clean
+distclean-local: coverage-clean
+coverage-clean:
+       -rm -rf $(COVERAGE_OUTPUT_DIRECTORY)
+
+coverage-html: $(COVERAGE_OUTPUT_INDEX_HTML)
+       @echo 'file://$(abs_builddir)/$(COVERAGE_OUTPUT_INDEX_HTML)'
+
+$(COVERAGE_OUTPUT_INDEX_HTML): $(COVERAGE_OUTPUT_FILE)
+       LC_ALL=C $(GENHTML) \
+               --legend \
+               --show-details \
+               --rc=genhtml_branch_coverage=1 \
+               --title='$(COVERAGE_TITLE)' \
+               --prefix='$(top_builddir)' \
+               --prefix='$(abspath $(abs_top_srcdir))' \
+               --output-directory='$(COVERAGE_OUTPUT_DIRECTORY)' \
+               $<
+
+$(COVERAGE_OUTPUT_FILE):
+       $(LCOV) \
+               --capture \
+               --no-checksum \
+               --rc=lcov_branch_coverage=1 \
+               --gcov-tool='$(GCOV)' \
+               --exclude="$$TMPDIR/*" \
+               --exclude='/tmp/*' \
+               --exclude='/usr/include/*' \
+               --exclude='*/tests/*' \
+               --directory='$(top_builddir)' \
+               --output-file='$@'
+
 endif
-- 
ldv

Reply via email to