Run only top-level recursive lcov
authorPeter Eisentraut <[email protected]>
Fri, 11 Aug 2017 03:33:47 +0000 (23:33 -0400)
committerPeter Eisentraut <[email protected]>
Thu, 28 Sep 2017 12:50:02 +0000 (08:50 -0400)
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]>
.gitignore
doc/src/sgml/regress.sgml
src/Makefile.global.in

index 4976fd9119e578b88b23c4fdfe2d899850b3f370..94e2c582f513385c78a433ecea0e7952919b24df 100644 (file)
@@ -23,6 +23,7 @@ objfiles.txt
 *.gcov.out
 lcov.info
 coverage/
+coverage-html-stamp
 *.vcproj
 *.vcxproj
 win32ver.rc
index 7c2b1029c2bc1093a16065d751f6139005839619..14747e5f3b55598e7942bebd06a53eb96ea01442 100644 (file)
@@ -706,6 +706,19 @@ make coverage-html
     The <command>make</command> commands also work in subdirectories.
    </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>
index fae8068150d88aeb2d4353a37d60ea8543cb0779..f352ba20e20f9e3fdfe7dc838103b0df2e1a75af 100644 (file)
@@ -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