]> granicus.if.org Git - python/commitdiff
Issue #18481: Add C coverage reporting with gcov and lcov. A new make target
authorChristian Heimes <christian@cheimes.de>
Tue, 30 Jul 2013 22:55:18 +0000 (00:55 +0200)
committerChristian Heimes <christian@cheimes.de>
Tue, 30 Jul 2013 22:55:18 +0000 (00:55 +0200)
"coverage-report" creates an instrumented Python build, runs unit tests
and creates a HTML. The report can be updated with "make coverage-lcov".

.hgignore
Makefile.pre.in
Misc/NEWS

index 2c0ed631ea8cef754204eb0ee014a8ab48d280bc..73e1e56536576f0518483e1144346f8c4e452ba6 100644 (file)
--- a/.hgignore
+++ b/.hgignore
@@ -36,6 +36,7 @@ Modules/Setup.local
 Modules/config.c
 Modules/ld_so_aix$
 Parser/pgen$
+^lcov-report/
 ^core
 ^python-gdb.py
 ^python.exe-gdb.py
@@ -91,3 +92,7 @@ Modules/_testembed
 .coverage
 coverage/
 htmlcov/
+*.gcda
+*.gcno
+*.gcov
+coverage.info
index bef7a251c9435a532d98bada27df909b13ded8d8..ad4eb308249ac37e8aa3a20997700d56d180453e 100644 (file)
@@ -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) \
index c08193d2f0aa05f2a05450be99d5a686d1217df8..d44a0433be8185807bfb0fb12c5b3cd9204b3163 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -725,6 +725,10 @@ IDLE
 Build
 -----
 
+- 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".
+
 - Issue #17845: Clarified the message printed when some module are not built.
 
 - Issue #18256: Compilation fix for recent AIX releases.  Patch by