From e9b0d1b40e645fd583f090601f4ae2a7926888a1 Mon Sep 17 00:00:00 2001 From: Lucas De Marchi Date: Wed, 7 Jan 2015 19:17:15 -0200 Subject: [PATCH] build-sys: integrate coverage report Just pass --enable-coverage to configure and then "make coverage" to have the coverage report at coverage dir. --- .gitignore | 3 +++ Makefile.am | 39 +++++++++++++++++++++++++++++++++++++++ configure.ac | 25 ++++++++++++++++++++++++- 3 files changed, 66 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 88c8149..f60cac6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ *.o +*.gcda +*.gcno /*.tar.xz /*.md5sum .deps/ @@ -14,6 +16,7 @@ /config.log /config.status /configure +/coverage /libtool /stamp-h1 /test-suite.log diff --git a/Makefile.am b/Makefile.am index 5df38cb..bf4f328 100644 --- a/Makefile.am +++ b/Makefile.am @@ -326,6 +326,45 @@ distclean-local: $(DISTCLEAN_LOCAL_HOOKS) buildtest-TESTS: $(MAKE) $(AM_MAKEFLAGS) $(check_LTLIBRARIES) $(check_PROGRAMS) +# ------------------------------------------------------------------------------ +# coverage +# ------------------------------------------------------------------------------ + +# .PHONY so it always rebuilds it +.PHONY: coverage lcov-run lcov-report coverage-sync + +# run lcov from scratch, always +coverage: all + $(MAKE) lcov-run + $(MAKE) lcov-report + +coverage_dir = coverage +coverage_opts = --base-directory $(srcdir) --directory $(builddir) \ + --rc 'geninfo_adjust_src_path=$(abspath $(srcdir))=>$(abspath $(builddir))' + +if ENABLE_COVERAGE +# reset run coverage tests +lcov-run: + @rm -rf $(coverage_dir) + lcov $(coverage_opts) --zerocounters + -$(MAKE) check + +# generate report based on current coverage data +lcov-report: + $(MKDIR_P) $(coverage_dir) + lcov $(coverage_opts) --capture --no-external --ignore-errors graph \ + | sed 's|$(abspath $(builddir))|$(abspath $(srcdir))|' > $(coverage_dir)/.lcov.info + lcov --remove $(coverage_dir)/.lcov.info --output-file $(coverage_dir)/.lcov-clean.info 'test-*' + genhtml -t "kmod test coverage" -o $(coverage_dir) $(coverage_dir)/.lcov-clean.info + @echo "Coverage report generated in $(abs_builddir)/$(coverage_dir)/index.html" + +else + +lcov-run lcov-report: + echo "Need to reconfigure with --enable-coverage" + +endif + # ------------------------------------------------------------------------------ # custom release helpers # ------------------------------------------------------------------------------ diff --git a/configure.ac b/configure.ac index 3be3198..648ff12 100644 --- a/configure.ac +++ b/configure.ac @@ -151,6 +151,28 @@ AS_IF([test "x$enable_python" = "xyes"], [ ]) AM_CONDITIONAL([BUILD_PYTHON], [test "x$enable_python" = "xyes"]) +AC_ARG_ENABLE([coverage], + AS_HELP_STRING([--enable-coverage], [enable test coverage @<:@default=disabled@:>@]), + [], [enable_coverage=no]) +AS_IF([test "x$enable_coverage" = "xyes"], [ + AC_CHECK_PROG(have_coverage, [lcov], [yes], [no]) + AS_IF([test "x$have_coverage" = xno],[ + AC_MSG_ERROR([*** lcov support requested but the program was not found]) + ], [ + lcov_version_major="`lcov --version | cut -d ' ' -f 4 | cut -d '.' -f 1`" + lcov_version_minor="`lcov --version | cut -d ' ' -f 4 | cut -d '.' -f 2`" + AS_IF([test "$lcov_version_major" -lt 1 -o "$lcov_version_minor" -lt 10], [ + AC_MSG_ERROR([*** lcov version is too old. 1.10 required]) + ], [ + have_coverage=yes + CC_CHECK_FLAGS_APPEND([with_coverage_cflags], [CFLAGS], [\ + -fprofile-arcs \ + -ftest-coverage]) + ]) + ]) +]) +AM_CONDITIONAL([ENABLE_COVERAGE], [test "x$enable_coverage" = "xyes"]) + m4_ifdef([GTK_DOC_CHECK], [ GTK_DOC_CHECK([1.14],[--flavour no-tmpl-flat]) ], [ @@ -204,7 +226,7 @@ CC_CHECK_FLAGS_APPEND(with_cflags, [CFLAGS], [\ -fvisibility=hidden \ -ffunction-sections \ -fdata-sections]) -AC_SUBST([OUR_CFLAGS], $with_cflags) +AC_SUBST([OUR_CFLAGS], "$with_cflags $with_coverage_cflags") CC_CHECK_FLAGS_APPEND([with_ldflags], [LDFLAGS], [ \ @@ -249,6 +271,7 @@ AC_MSG_RESULT([ logging: ${enable_logging} compression: xz=${with_xz} zlib=${with_zlib} debug: ${enable_debug} + coverage: ${enable_coverage} doc: ${enable_gtk_doc} man: ${enable_manpages} ])