Integrate lcov/gcov into Libav
authorReinhard Tartler <siretart@tauware.de>
Sat, 23 Mar 2013 07:17:24 +0000 (08:17 +0100)
committerReinhard Tartler <siretart@tauware.de>
Fri, 5 Apr 2013 16:55:11 +0000 (18:55 +0200)
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
Makefile
common.mak
configure
doc/developer.texi
tests/Makefile

index 3ed55b3..000f149 100644 (file)
@@ -5,6 +5,8 @@
 *.dll
 *.exe
 *.exp
 *.dll
 *.exe
 *.exp
+*.gcda
+*.gcno
 *.h.c
 *.ilk
 *.lib
 *.h.c
 *.ilk
 *.lib
@@ -22,6 +24,7 @@
 /avprobe
 /avserver
 /config.*
 /avprobe
 /avserver
 /config.*
+/coverage.info
 /version.h
 /doc/*.1
 /doc/*.html
 /version.h
 /doc/*.1
 /doc/*.html
@@ -30,6 +33,7 @@
 /doc/avoptions_format.texi
 /doc/doxy/html/
 /doc/print_options
 /doc/avoptions_format.texi
 /doc/doxy/html/
 /doc/print_options
+/lcov/
 /libavcodec/*_tablegen
 /libavcodec/*_tables.c
 /libavcodec/*_tables.h
 /libavcodec/*_tablegen
 /libavcodec/*_tables.c
 /libavcodec/*_tables.h
index 51947fa..42ef8b0 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -188,6 +188,7 @@ clean::
        $(RM) $(ALLPROGS)
        $(RM) $(CLEANSUFFIXES)
        $(RM) $(CLEANSUFFIXES:%=tools/%)
        $(RM) $(ALLPROGS)
        $(RM) $(CLEANSUFFIXES)
        $(RM) $(CLEANSUFFIXES:%=tools/%)
+       $(RM) -rf coverage.info lcov
 
 distclean::
        $(RM) $(DISTCLEANSUFFIXES)
 
 distclean::
        $(RM) $(DISTCLEANSUFFIXES)
index d3c6b9f..a1d9d1e 100644 (file)
@@ -51,7 +51,7 @@ $(TOOLOBJS): | tools
 
 OBJDIRS := $(OBJDIRS) $(dir $(OBJS) $(HOBJS) $(HOSTOBJS) $(TESTOBJS))
 
 
 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
 
 DISTCLEANSUFFIXES = *.pc
 LIBSUFFIXES       = *.a *.lib *.so *.so.* *.dylib *.dll *.def *.dll.a
 
index 10246e5..8c07d0a 100755 (executable)
--- a/configure
+++ b/configure
@@ -2173,6 +2173,10 @@ case "$toolchain" in
         ar_default="lib"
         target_os_default="win32"
     ;;
         ar_default="lib"
         target_os_default="win32"
     ;;
+    gcov)
+        add_cflags  -fprofile-arcs -ftest-coverage
+        add_ldflags -fprofile-arcs -ftest-coverage
+    ;;
     ?*)
         die "Unknown toolchain $toolchain"
     ;;
     ?*)
         die "Unknown toolchain $toolchain"
     ;;
index cde87f1..3d574e4 100644 (file)
@@ -550,6 +550,30 @@ why the expected result changed.
 
 Please refer to @url{fate.html}.
 
 
 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
 
 @anchor{Release process}
 @section Release process
 
index 67ce45e..d60ee5a 100644 (file)
@@ -123,6 +123,19 @@ $(FATE): $(FATE_UTILS:%=tests/%$(HOSTEXESUF))
 fate-list:
        @printf '%s\n' $(sort $(FATE))
 
 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:
 clean:: testclean
 
 testclean:
@@ -132,4 +145,5 @@ testclean:
 
 -include $(wildcard tests/*.d)
 
 
 -include $(wildcard tests/*.d)
 
-.PHONY: fate*
+.PHONY: fate* lcov lcov-reset
+.INTERMEDIATE: coverage.info