Skip to content

Commit

Permalink
Issue python#18481: Add C coverage reporting with gcov and lcov. A ne…
Browse files Browse the repository at this point in the history
…w 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".
  • Loading branch information
tiran committed Jul 30, 2013
1 parent 3b998d1 commit 49e52f9
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 1 deletion.
5 changes: 5 additions & 0 deletions .hgignore
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -91,3 +92,7 @@ Modules/_testembed
.coverage
coverage/
htmlcov/
*.gcda
*.gcno
*.gcov
coverage.info
47 changes: 46 additions & 1 deletion Makefile.pre.in
Original file line number Diff line number Diff line change
Expand Up @@ -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 ===


Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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) \
Expand Down
4 changes: 4 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 49e52f9

Please sign in to comment.