summaryrefslogtreecommitdiffstats
path: root/Makefile.pre.in
diff options
context:
space:
mode:
authorChristian Heimes <christian@cheimes.de>2013-07-30 22:55:18 (GMT)
committerChristian Heimes <christian@cheimes.de>2013-07-30 22:55:18 (GMT)
commit49e52f9375c23d88023344a6fd441fd2a4124dc6 (patch)
tree960dce8598a80570ccfff6e7de1a4f5cd7420dac /Makefile.pre.in
parent3b998d1086b8dee0f70dac91d3ea50a8819a8566 (diff)
downloadcpython-49e52f9375c23d88023344a6fd441fd2a4124dc6.zip
cpython-49e52f9375c23d88023344a6fd441fd2a4124dc6.tar.gz
cpython-49e52f9375c23d88023344a6fd441fd2a4124dc6.tar.bz2
Issue #18481: Add C coverage reporting with gcov and lcov. A new make target
"coverage-report" creates an instrumented Python build, runs unit tests and creates a HTML. The report can be updated with "make coverage-lcov".
Diffstat (limited to 'Makefile.pre.in')
-rw-r--r--Makefile.pre.in47
1 files changed, 46 insertions, 1 deletions
diff --git a/Makefile.pre.in b/Makefile.pre.in
index bef7a25..ad4eb30 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -211,6 +211,12 @@ HOST_GNU_TYPE= @host@
PROFILE_TASK= $(srcdir)/Tools/pybench/pybench.py -n 2 --with-gc --with-syscheck
#PROFILE_TASK= $(srcdir)/Lib/test/regrtest.py
+# report files for gcov / lcov coverage report
+COVERAGE_INFO= $(abs_builddir)/coverage.info
+COVERAGE_REPORT=$(abs_builddir)/lcov-report
+COVERAGE_REPORT_OPTIONS=--no-branch-coverage --title "CPython lcov report"
+
+
# === Definitions added by makesetup ===
@@ -463,11 +469,48 @@ run_profile_task:
build_all_use_profile:
$(MAKE) all CFLAGS="$(CFLAGS) -fprofile-use -fprofile-correction"
+# Compile and run with gcov
+.PHONY=coverage coverage-lcov coverage-report
coverage:
@echo "Building with support for coverage checking:"
- $(MAKE) clean
+ $(MAKE) clean profile-removal
$(MAKE) all CFLAGS="$(CFLAGS) -O0 -pg -fprofile-arcs -ftest-coverage" LIBS="$(LIBS) -lgcov"
+coverage-lcov:
+ @echo "Creating Coverage HTML report with LCOV:"
+ @rm -f $(COVERAGE_INFO)
+ @rm -rf $(COVERAGE_REPORT)
+ @lcov --capture --directory $(abs_builddir) \
+ --base-directory $(realpath $(abs_builddir)) \
+ --path $(realpath $(abs_srcdir)) \
+ --output-file $(COVERAGE_INFO)
+ : # remove 3rd party modules and system headers
+ @lcov --remove $(COVERAGE_INFO) \
+ '*/Modules/_ctypes/libffi*/*' \
+ '*/Modules/_sha3/keccak/*' \
+ '*/Modules/_decimal/libmpdec/*' \
+ '*/Modules/expat/*' \
+ '*/Modules/zlib/*' \
+ '*/Include/*' \
+ '/usr/include/*' \
+ '/usr/local/include/*' \
+ --output-file $(COVERAGE_INFO)
+ @genhtml $(COVERAGE_INFO) --output-directory $(COVERAGE_REPORT) \
+ $(COVERAGE_REPORT_OPTIONS)
+ @echo
+ @echo "lcov report at $(COVERAGE_REPORT)/index.html"
+ @echo
+
+coverage-report:
+ : # force rebuilding of parser and importlib
+ @touch $(GRAMMAR_INPUT)
+ @touch $(srcdir)/Lib/importlib/_bootstrap.py
+ : # build with coverage info
+ $(MAKE) coverage
+ : # run tests, ignore failures
+ $(TESTRUNNER) $(TESTOPTS) || true
+ : # build lcov report
+ $(MAKE) coverage-lcov
# Build the interpreter
$(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
@@ -1396,6 +1439,8 @@ clean: pycremoval
profile-removal:
find . -name '*.gc??' -exec rm -f {} ';'
+ rm -f $(COVERAGE_INFO)
+ rm -rf $(COVERAGE_REPORT)
clobber: clean profile-removal
-rm -f $(BUILDPYTHON) $(PGEN) $(LIBRARY) $(LDLIBRARY) $(DLLLIBRARY) \