From a862c7d3368241e72a465ab944afa38ea62a6640 Mon Sep 17 00:00:00 2001 From: Reinhard Tartler Date: Sat, 23 Mar 2013 08:17:24 +0100 Subject: [PATCH] Integrate lcov/gcov into Libav The gcov/lcov are a common toolchain for visualizing code coverage with the GNU/Toolchain. The documentation and implementation of this integration was heavily inspired from the blog entry by Mike Melanson: http://multimedia.cx/eggs/using-lcov-with-ffmpeg/ --- .gitignore | 4 ++++ Makefile | 1 + common.mak | 2 +- configure | 4 ++++ doc/developer.texi | 24 ++++++++++++++++++++++++ tests/Makefile | 16 +++++++++++++++- 6 files changed, 49 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 3ed55b3487..000f149c4e 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,8 @@ *.dll *.exe *.exp +*.gcda +*.gcno *.h.c *.ilk *.lib @@ -22,6 +24,7 @@ /avprobe /avserver /config.* +/coverage.info /version.h /doc/*.1 /doc/*.html @@ -30,6 +33,7 @@ /doc/avoptions_format.texi /doc/doxy/html/ /doc/print_options +/lcov/ /libavcodec/*_tablegen /libavcodec/*_tables.c /libavcodec/*_tables.h diff --git a/Makefile b/Makefile index 51947fa34a..42ef8b08e5 100644 --- a/Makefile +++ b/Makefile @@ -188,6 +188,7 @@ clean:: $(RM) $(ALLPROGS) $(RM) $(CLEANSUFFIXES) $(RM) $(CLEANSUFFIXES:%=tools/%) + $(RM) -rf coverage.info lcov distclean:: $(RM) $(DISTCLEANSUFFIXES) diff --git a/common.mak b/common.mak index d3c6b9f694..a1d9d1e502 100644 --- a/common.mak +++ b/common.mak @@ -51,7 +51,7 @@ $(TOOLOBJS): | tools OBJDIRS := $(OBJDIRS) $(dir $(OBJS) $(HOBJS) $(HOSTOBJS) $(TESTOBJS)) -CLEANSUFFIXES = *.d *.o *~ *.h.c *.map *.ver +CLEANSUFFIXES = *.d *.o *~ *.h.c *.map *.ver *.gcno *.gcda DISTCLEANSUFFIXES = *.pc LIBSUFFIXES = *.a *.lib *.so *.so.* *.dylib *.dll *.def *.dll.a diff --git a/configure b/configure index 10246e527f..8c07d0af31 100755 --- a/configure +++ b/configure @@ -2173,6 +2173,10 @@ case "$toolchain" in ar_default="lib" target_os_default="win32" ;; + gcov) + add_cflags -fprofile-arcs -ftest-coverage + add_ldflags -fprofile-arcs -ftest-coverage + ;; ?*) die "Unknown toolchain $toolchain" ;; diff --git a/doc/developer.texi b/doc/developer.texi index cde87f1e5d..3d574e4428 100644 --- a/doc/developer.texi +++ b/doc/developer.texi @@ -550,6 +550,30 @@ why the expected result changed. Please refer to @url{fate.html}. +@subsection Visualizing Test Coverage + +The Libav build system allows visualizing the test coverage in an easy +manner with the coverage tools @code{gcov}/@code{lcov}. This involves +the following steps: + +@enumerate +@item + Configure to compile with instrumentation enabled: + @code{configure --toolchain=gcov}. +@item + Run your test case, either manually or via FATE. This can be either + the full FATE regression suite, or any arbitrary invocation of any + front-end tool provided by Libav, in any combination. +@item + Run @code{make lcov} to generate coverage data in HTML format. +@item + View @code{lcov/index.html} in your preferred HTML viewer. +@end enumerate + +You can use the command @code{make lcov-reset} to reset the coverage +measurements. You will need to rerun @code{make lcov} after running a +new test. + @anchor{Release process} @section Release process diff --git a/tests/Makefile b/tests/Makefile index 67ce45e862..d60ee5a26e 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -123,6 +123,19 @@ $(FATE): $(FATE_UTILS:%=tests/%$(HOSTEXESUF)) fate-list: @printf '%s\n' $(sort $(FATE)) +coverage.info: TAG = LCOV +coverage.info: + $(M)lcov -d $(CURDIR) -b $(SRC_PATH) --capture -o $@ + +lcov: TAG = GENHTML +lcov: coverage.info + $(M)genhtml -o $(CURDIR)/lcov $< + +lcov-reset: TAG = LCOV +lcov-reset: + $(M)lcov -d $(CURDIR) --zerocounters + $(Q)$(RM) -f coverage.info + clean:: testclean testclean: @@ -132,4 +145,5 @@ testclean: -include $(wildcard tests/*.d) -.PHONY: fate* +.PHONY: fate* lcov lcov-reset +.INTERMEDIATE: coverage.info