Blame m4/gnome-code-coverage.m4

Packit 5756e2
dnl GNOME_CODE_COVERAGE
Packit 5756e2
dnl
Packit 5756e2
dnl Defines CODE_COVERAGE_CFLAGS and CODE_COVERAGE_LDFLAGS which should be
Packit 5756e2
dnl included in the CFLAGS and LIBS/LDFLAGS variables of every build target
Packit 5756e2
dnl (program or library) which should be built with code coverage support.
Packit 5756e2
dnl Also defines GNOME_CODE_COVERAGE_RULES which should be substituted in your
Packit 5756e2
dnl Makefile; and $enable_code_coverage which can be used in subsequent
Packit 5756e2
dnl configure output.
Packit 5756e2
dnl
Packit 5756e2
dnl Note that all optimisation flags in CFLAGS must be disabled when code
Packit 5756e2
dnl coverage is enabled.
Packit 5756e2
dnl
Packit 5756e2
dnl Derived from Makefile.decl in GLib, originally licenced under LGPLv2.1+.
Packit 5756e2
dnl This file is licenced under LGPLv2.1+.
Packit 5756e2
dnl
Packit 5756e2
dnl Usage example:
Packit 5756e2
dnl configure.ac:
Packit 5756e2
dnl    GNOME_CODE_COVERAGE
Packit 5756e2
dnl
Packit 5756e2
dnl Makefile.am:
Packit 5756e2
dnl    @GNOME_CODE_COVERAGE_RULES@
Packit 5756e2
dnl    my_program_LIBS = … $(CODE_COVERAGE_LDFLAGS) …
Packit 5756e2
dnl    my_program_CFLAGS = … $(CODE_COVERAGE_CFLAGS) …
Packit 5756e2
dnl
Packit 5756e2
dnl This results in a “check-code-coverage” rule being added to any Makefile.am
Packit 5756e2
dnl which includes “@GNOME_CODE_COVERAGE_RULES@” (assuming the module has been
Packit 5756e2
dnl configured with --enable-code-coverage). Running `make check-code-coverage`
Packit 5756e2
dnl in that directory will run the module’s test suite (`make check`) and build
Packit 5756e2
dnl a code coverage report detailing the code which was touched, then print the
Packit 5756e2
dnl URI for the report.
Packit 5756e2
Packit 5756e2
AC_DEFUN([GNOME_CODE_COVERAGE],[
Packit 5756e2
	dnl Check for --enable-code-coverage
Packit 5756e2
	AC_MSG_CHECKING([whether to build with code coverage support])
Packit 5756e2
	AC_ARG_ENABLE([code-coverage], AS_HELP_STRING([--enable-code-coverage], [Whether to enable code coverage support]),, enable_code_coverage=no)
Packit 5756e2
	AM_CONDITIONAL([CODE_COVERAGE_ENABLED], [test x$enable_code_coverage = xyes])
Packit 5756e2
	AC_SUBST([CODE_COVERAGE_ENABLED], [$enable_code_coverage])
Packit 5756e2
	AC_MSG_RESULT($enable_code_coverage)
Packit 5756e2
Packit 5756e2
	AS_IF([ test "$enable_code_coverage" = "yes" ], [
Packit 5756e2
		dnl Check if gcc is being used
Packit 5756e2
		AS_IF([ test "$GCC" = "no" ], [
Packit 5756e2
			AC_MSG_ERROR([not compiling with gcc, which is required for gcov code coverage])
Packit 5756e2
		])
Packit 5756e2
Packit 5756e2
		AC_CHECK_PROG([LCOV], [lcov], [lcov])
Packit 5756e2
		AC_CHECK_PROG([GENHTML], [genhtml], [genhtml])
Packit 5756e2
Packit 5756e2
		AS_IF([ test -z "$LCOV" ], [
Packit 5756e2
			AC_MSG_ERROR([lcov is needed to enable code coverage reporting])
Packit 5756e2
		])
Packit 5756e2
Packit 5756e2
		AS_IF([ test -z "$GENHTML" ], [
Packit 5756e2
			AC_MSG_ERROR([Could not find genhtml from the lcov package])
Packit 5756e2
		])
Packit 5756e2
Packit 5756e2
		dnl Build the code coverage flags
Packit 5756e2
		CODE_COVERAGE_CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage"
Packit 5756e2
		CODE_COVERAGE_LDFLAGS="-lgcov"
Packit 5756e2
Packit 5756e2
		AC_SUBST([CODE_COVERAGE_CFLAGS])
Packit 5756e2
		AC_SUBST([CODE_COVERAGE_LDFLAGS])
Packit 5756e2
	])
Packit 5756e2
Packit 5756e2
GNOME_CODE_COVERAGE_RULES='
Packit 5756e2
# Code coverage
Packit 5756e2
#
Packit 5756e2
# Optional:
Packit 5756e2
#  - CODE_COVERAGE_DIRECTORY: Top-level directory for code coverage reporting.
Packit 5756e2
#    (Default: $(top_builddir))
Packit 5756e2
#  - CODE_COVERAGE_OUTPUT_FILE: Filename and path for the .info file generated
Packit 5756e2
#    by lcov for code coverage. (Default:
Packit 5756e2
#    $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info)
Packit 5756e2
#  - CODE_COVERAGE_OUTPUT_DIRECTORY: Directory for generated code coverage
Packit 5756e2
#    reports to be created. (Default:
Packit 5756e2
#    $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage)
Packit 5756e2
#  - CODE_COVERAGE_LCOV_OPTIONS: Extra options to pass to the lcov instance.
Packit 5756e2
#    (Default: empty)
Packit 5756e2
#  - CODE_COVERAGE_GENHTML_OPTIONS: Extra options to pass to the genhtml
Packit 5756e2
#    instance. (Default: empty)
Packit 5756e2
#  - CODE_COVERAGE_IGNORE_PATTERN: Extra glob pattern of files to ignore
Packit 5756e2
#
Packit 5756e2
# The generated report will be titled using the $(PACKAGE_NAME) and
Packit 5756e2
# $(PACKAGE_VERSION). In order to add the current git hash to the title,
Packit 5756e2
# use the git-version-gen script, available online.
Packit 5756e2
Packit 5756e2
# Optional variables
Packit 5756e2
CODE_COVERAGE_DIRECTORY ?= $(top_builddir)
Packit 5756e2
CODE_COVERAGE_OUTPUT_FILE ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info
Packit 5756e2
CODE_COVERAGE_OUTPUT_DIRECTORY ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage
Packit 5756e2
CODE_COVERAGE_LCOV_OPTIONS ?=
Packit 5756e2
CODE_COVERAGE_GENHTML_OPTIONS ?=
Packit 5756e2
CODE_COVERAGE_IGNORE_PATTERN ?=
Packit 5756e2
Packit 5756e2
code_coverage_quiet = $(code_coverage_quiet_$(V))
Packit 5756e2
code_coverage_quiet_ = $(code_coverage_quiet_$(AM_DEFAULT_VERBOSITY))
Packit 5756e2
code_coverage_quiet_0 = --quiet
Packit 5756e2
Packit 5756e2
# Use recursive makes in order to ignore errors during check
Packit 5756e2
check-code-coverage:
Packit 5756e2
ifeq ($(CODE_COVERAGE_ENABLED),yes)
Packit 5756e2
	-$(MAKE) $(AM_MAKEFLAGS) -k check
Packit 5756e2
	$(MAKE) $(AM_MAKEFLAGS) code-coverage-capture
Packit 5756e2
else
Packit 5756e2
	@echo "Need to reconfigure with --enable-code-coverage"
Packit 5756e2
endif
Packit 5756e2
Packit 5756e2
# Capture code coverage data
Packit 5756e2
code-coverage-capture: code-coverage-capture-hook
Packit 5756e2
ifeq ($(CODE_COVERAGE_ENABLED),yes)
Packit 5756e2
	$(LCOV) $(code_coverage_quiet) --directory $(CODE_COVERAGE_DIRECTORY) --capture --output-file "$(CODE_COVERAGE_OUTPUT_FILE).tmp" --test-name "$(PACKAGE_NAME)-$(PACKAGE_VERSION)" --no-checksum --compat-libtool $(CODE_COVERAGE_LCOV_OPTIONS)
Packit 5756e2
	$(LCOV) $(code_coverage_quiet) --directory $(CODE_COVERAGE_DIRECTORY) --remove "$(CODE_COVERAGE_OUTPUT_FILE).tmp" "/tmp/*" $(CODE_COVERAGE_IGNORE_PATTERN) --output-file "$(CODE_COVERAGE_OUTPUT_FILE)"
Packit 5756e2
	-@rm -f $(CODE_COVERAGE_OUTPUT_FILE).tmp
Packit 5756e2
	LANG=C $(GENHTML) $(code_coverage_quiet) --prefix $(CODE_COVERAGE_DIRECTORY) --output-directory "$(CODE_COVERAGE_OUTPUT_DIRECTORY)" --title "$(PACKAGE_NAME)-$(PACKAGE_VERSION) Code Coverage" --legend --show-details "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_GENHTML_OPTIONS)
Packit 5756e2
	@echo "file://$(abs_builddir)/$(CODE_COVERAGE_OUTPUT_DIRECTORY)/index.html"
Packit 5756e2
else
Packit 5756e2
	@echo "Need to reconfigure with --enable-code-coverage"
Packit 5756e2
endif
Packit 5756e2
Packit 5756e2
# Hook rule executed before code-coverage-capture, overridable by the user
Packit 5756e2
code-coverage-capture-hook:
Packit 5756e2
Packit 5756e2
ifeq ($(CODE_COVERAGE_ENABLED),yes)
Packit 5756e2
clean: code-coverage-clean
Packit 5756e2
code-coverage-clean:
Packit 5756e2
	-$(LCOV) --directory $(top_builddir) -z
Packit 5756e2
	-rm -rf $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_FILE).tmp $(CODE_COVERAGE_OUTPUT_DIRECTORY)
Packit 5756e2
	-find . -name "*.gcda" -o -name "*.gcov" -delete
Packit 5756e2
endif
Packit 5756e2
Packit 5756e2
GITIGNOREFILES ?=
Packit 5756e2
GITIGNOREFILES += $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_DIRECTORY)
Packit 5756e2
Packit 5756e2
DISTCHECK_CONFIGURE_FLAGS ?=
Packit 5756e2
DISTCHECK_CONFIGURE_FLAGS += --disable-code-coverage
Packit 5756e2
Packit 5756e2
.PHONY: check-code-coverage code-coverage-capture code-coverage-capture-hook code-coverage-clean
Packit 5756e2
'
Packit 5756e2
Packit 5756e2
	AC_SUBST([GNOME_CODE_COVERAGE_RULES])
Packit 5756e2
	m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([GNOME_CODE_COVERAGE_RULES])])
Packit 5756e2
])