Blame m4/gnome-code-coverage.m4

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