From: Eric Blake Date: Tue, 8 Jul 2014 19:12:28 +0000 (-0600) Subject: maint.mk: less syntax-check noise when SIGPIPE is ignored X-Git-Tag: v1.0~7343 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=9d5efe7d61e1d96a6d7c97ffa4d21c5e33e9bd30;p=gnulib.git maint.mk: less syntax-check noise when SIGPIPE is ignored For a project with enough files, such as libvirt, vc-list-files can produce so much input that it can lead to SIGPIPE to earlier parts of a pipeline when later parts do a quick filter. Also, many buildbot environments (annoyingly) ignore SIGPIPE, which causes a number of tools to be rather chatty about reporting EPIPE write failures. It doesn't help that POSIX has standardized that the shell is unable to revert SIGPIPE to unignored status if it inherits it as ignored - otherwise, the solution would just be to re-enable SIGPIPE anywhere we expect to benefit from early filtering exits. Here's a short demonstration: $ ( trap '' PIPE; build-aux/vc-list-files | grep -l '\.c$' >/dev/null) sed: couldn't write 16 items to stdout: Broken pipe and a link to the much larger buildbot results against libvirt: http://honk.sigxcpu.org:8001/job/libvirt-syntax-check/2465/console with noise such as this, detracting from the later actual build failure it was reporting: > prohibit_argmatch_without_use > grep: write error > grep: write error > /bin/sed: couldn't write 25 items to stdout: Broken pipe > sed: couldn't write 1 item to stdout: Broken pipe > 0.46 prohibit_argmatch_without_use But look at the above example: we are piping data to grep -l, and then discarding that output. At most, data | grep -l will output "(standard input)", and exit early if the first match is found before the end of a page (causing SIGPIPE to the process feeding the pipe). It makes much more sense to use grep -l when searching for a subset of files that have a match among a larger set of file names passed as arguments, and NOT when used to filter stdin. Sure, we're burning a bit more CPU power by processing the full list instead of exiting early, but at least it cuts down on the noise. * top/maint.mk (_sc_header_without_use) (sc_require_config_h_first): Parse full list. Signed-off-by: Eric Blake --- diff --git a/ChangeLog b/ChangeLog index 81e800f5f3..40cf11d6fb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2014-07-08 Eric Blake + + maint.mk: less syntax-check noise when SIGPIPE is ignored + * top/maint.mk (_sc_header_without_use) + (sc_require_config_h_first): Parse full list. + 2014-07-07 Eli Zaretskii Paul Eggert diff --git a/top/maint.mk b/top/maint.mk index 3f369b7161..0cc769c535 100644 --- a/top/maint.mk +++ b/top/maint.mk @@ -440,7 +440,7 @@ sc_require_config_h: # You must include before including any other header file. # This can possibly be via a package-specific header, if given by cfg.mk. sc_require_config_h_first: - @if $(VC_LIST_EXCEPT) | grep -l '\.c$$' > /dev/null; then \ + @if $(VC_LIST_EXCEPT) | grep '\.c$$' > /dev/null; then \ fail=0; \ for i in $$($(VC_LIST_EXCEPT) | grep '\.c$$'); do \ grep '^# *include\>' $$i | $(SED) 1q \ @@ -464,7 +464,7 @@ sc_prohibit_HAVE_MBRTOWC: define _sc_header_without_use dummy=; : so we do not need a semicolon before each use; \ h_esc=`echo '[<"]'"$$h"'[">]'|$(SED) 's/\./\\\\./g'`; \ - if $(VC_LIST_EXCEPT) | grep -l '\.c$$' > /dev/null; then \ + if $(VC_LIST_EXCEPT) | grep '\.c$$' > /dev/null; then \ files=$$(grep -l '^# *include '"$$h_esc" \ $$($(VC_LIST_EXCEPT) | grep '\.c$$')) && \ grep -LE "$$re" $$files | grep . && \