summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Eisentraut2017-08-11 03:33:47 +0000
committerPeter Eisentraut2017-09-28 12:50:02 +0000
commit504923a0ed5c75775196c8ed0cd59b15d55cd39b (patch)
treecabfd7f5ef254105438742e17f72ab1b5f3a93ea
parent7769fc000aa3b959d3e1c7d7c3c2555aba7722c3 (diff)
Run only top-level recursive lcov
This is the way lcov was intended to be used. It is much faster and more robust and makes the makefiles simpler than running it in each subdirectory. The previous coding ran gcov before lcov, but that is useless because lcov/geninfo call gcov internally and use that information. Moreover, this led to complications and failures during parallel make. This separates the two targets: You either use "make coverage" to get textual output from gcov or "make coverage-html" to get an HTML report via lcov. (Using both is still problematic because they write the same output files.) Reviewed-by: Michael Paquier <[email protected]>
-rw-r--r--.gitignore1
-rw-r--r--doc/src/sgml/regress.sgml13
-rw-r--r--src/Makefile.global.in28
3 files changed, 30 insertions, 12 deletions
diff --git a/.gitignore b/.gitignore
index 4976fd9119..94e2c582f5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,6 +23,7 @@ objfiles.txt
*.gcov.out
lcov.info
coverage/
+coverage-html-stamp
*.vcproj
*.vcxproj
win32ver.rc
diff --git a/doc/src/sgml/regress.sgml b/doc/src/sgml/regress.sgml
index 7c2b1029c2..14747e5f3b 100644
--- a/doc/src/sgml/regress.sgml
+++ b/doc/src/sgml/regress.sgml
@@ -707,6 +707,19 @@ make coverage-html
</para>
<para>
+ If you don't have <command>lcov</command> or prefer text output over an
+ HTML report, you can also run
+<screen>
+make coverage
+</screen>
+ instead of <literal>make coverage-html</literal>, which will
+ produce <filename>.gcov</filename> output files for each source file
+ relevant to the test. (<literal>make coverage</literal> and <literal>make
+ coverage-html</literal> will overwrite each other's files, so mixing them
+ might be confusing.)
+ </para>
+
+ <para>
To reset the execution counts between test runs, run:
<screen>
make coverage-clean
diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index fae8068150..f352ba20e2 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -874,25 +874,29 @@ endif # enable_nls
ifeq ($(enable_coverage), yes)
-# There is a strange interaction between lcov and existing .gcov
-# output files. Hence the rm command and the ordering dependency.
+# make coverage -- text output
-gcda_files := $(wildcard *.gcda)
+local_gcda_files = $(wildcard *.gcda)
-lcov.info: $(gcda_files)
- rm -f *.gcov .*.gcov
- $(if $^,$(LCOV) -d . -c -o $@ $(LCOVFLAGS) --gcov-tool $(GCOV))
+coverage: $(local_gcda_files:.gcda=.c.gcov)
-%.c.gcov: %.gcda | lcov.info
+%.c.gcov: %.gcda
$(GCOV) -b -f -p -o . $(GCOVFLAGS) $*.c >$*.c.gcov.out
-coverage: $(gcda_files:.gcda=.c.gcov) lcov.info
+# make coverage-html -- HTML output via lcov
.PHONY: coverage-html
-coverage-html: coverage
+coverage-html: coverage-html-stamp
+
+coverage-html-stamp: lcov.info
rm -rf coverage
- mkdir coverage
- $(GENHTML) --show-details --legend --output-directory=coverage --title=PostgreSQL --num-spaces=4 --prefix=$(abs_top_srcdir) `find . -name lcov.info -print`
+ $(GENHTML) --show-details --legend --output-directory=coverage --title=PostgreSQL --num-spaces=4 --prefix=$(abs_top_srcdir) $<
+ touch $@
+
+all_gcda_files = $(shell find . -name '*.gcda' -print)
+
+lcov.info: $(all_gcda_files)
+ $(LCOV) -d . -c -o $@ $(LCOVFLAGS) --gcov-tool $(GCOV)
# hook for clean-up
@@ -900,7 +904,7 @@ clean distclean maintainer-clean: clean-coverage
.PHONY: clean-coverage
clean-coverage:
- rm -rf coverage
+ rm -rf coverage coverage-html-stamp
rm -f *.gcda *.gcno lcov.info *.gcov .*.gcov *.gcov.out