summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore4
-rw-r--r--Makefile1
-rw-r--r--common.mak2
-rwxr-xr-xconfigure4
-rw-r--r--doc/developer.texi24
-rw-r--r--tests/Makefile16
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