]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
Add coverage target
authorDmitry V. Levin <ldv@altlinux.org>
Tue, 12 Jan 2021 08:00:00 +0000 (08:00 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Tue, 12 Jan 2021 09:09:25 +0000 (09:09 +0000)
Implement a target for capturing code coverage using lcov.
It is available when elfutils is configured using --enable-gcov.

Tested with
autoreconf -if && ./configure --enable-maintainer-mode --enable-gcov &&
make && make check && make coverage

Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
.gitignore
ChangeLog
Makefile.am
configure.ac

index 9bf350c1354e86ab515c4475166bcfe2f262e6dd..8bcd88d71515e16aae8b0b2257098d70cf8c60ac 100644 (file)
@@ -16,6 +16,7 @@
 =*
 Makefile
 Makefile.in
+/*.lcov
 /ABOUT-NLS
 /INSTALL
 /aclocal.m4
@@ -26,6 +27,7 @@ Makefile.in
 /config.log
 /config.status
 /configure
+/coverage
 /elfutils.spec
 /stamp-h1
 /version.h
index 03c90b6b0d5dabd6b9e267b6a35c2ba5e2509a43..142caa276dc5594018ac5ff9ebaf6ace8caf7359 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2021-01-12  Dmitry V. Levin  <ldv@altlinux.org>
+
+       * configure.ac [--enable-gcov]: Check for gcov, lcov, and genhtml.
+       * Makefile.am [GCOV] (coverage, coverage-clean): New targets.
+       * .gitignore: Update.
+
 2020-12-20  Dmitry V. Levin  <ldv@altlinux.org>
 
        * .gitignore: Move subdirectory patterns to separate .gitignore files.
index 818e3599f2c8ac9188e9fe6334685abeba6063e9..9c47afa9ef6f28c1dc83644da8fa0174e7c09f2c 100644 (file)
@@ -47,6 +47,57 @@ distcheck-hook:
 rpm: dist
        rpmbuild -ts --sign elfutils-@PACKAGE_VERSION@.tar.bz2
 
+if GCOV
+
+COVERAGE_OUTPUT_FILE = $(PACKAGE_NAME).lcov
+COVERAGE_OUTPUT_DIRECTORY = coverage
+COVERAGE_OUTPUT_INDEX_HTML = $(COVERAGE_OUTPUT_DIRECTORY)/index.html
+COVERAGE_TITLE = $(PACKAGE_NAME)-$(PACKAGE_VERSION)
+
+COVERAGE_DIRS = $(filter-out tests,$(SUBDIRS))
+src_COVERAGE_DIRS = $(patsubst %,$(srcdir)/%,$(COVERAGE_DIRS))
+build_COVERAGE_DIRS = $(patsubst %,$(builddir)/%,$(COVERAGE_DIRS))
+all_COVERAGE_DIRS = $(sort $(src_COVERAGE_DIRS) $(build_COVERAGE_DIRS))
+LCOV_DIRS_ARGS = $(patsubst %,--directory=%,$(all_COVERAGE_DIRS))
+
+CLEANFILES = $(COVERAGE_OUTPUT_FILE)
+
+.PHONY: coverage coverage-clean
+
+clean-local: coverage-clean
+distclean-local: coverage-clean
+
+coverage-clean:
+       -rm -rf $(COVERAGE_OUTPUT_DIRECTORY)
+
+coverage: $(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='$(abspath $(abs_srcdir))' \
+               --prefix='$(realpath $(abs_srcdir))' \
+               --prefix='$(abspath $(abs_builddir)/..)' \
+               --prefix='$(realpath $(abs_builddir)/..)' \
+               --output-directory='$(COVERAGE_OUTPUT_DIRECTORY)' \
+               $<
+
+$(COVERAGE_OUTPUT_FILE):
+       $(LCOV) \
+               --capture \
+               --no-external \
+               --no-checksum \
+               --rc=lcov_branch_coverage=1 \
+               --gcov-tool='$(GCOV)' \
+               --output-file='$@' \
+               $(LCOV_DIRS_ARGS)
+
+endif
+
 # Tell version 3.79 and up of GNU make to not build goals in this
 # directory in parallel.
 .NOTPARALLEL:
index 60747bc8613e6fa5d410bc56b5759c2157d74298..346ab800554f243ad3023476fd29b02edb34e967 100644 (file)
@@ -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)