[PATCH 4/4] build: merge all syntax-check logic into one file

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The gnulib syntax-check rules are spread across GNUmakefile, cfg.mk and
maint.mk. This made sense when we were getting two of the files from the
gnulib submodule. Now that we own all files though, we can merge them
into one.

Signed-off-by: Daniel P. Berrangé <berrange@xxxxxxxxxx>
---
 Makefile.am                           |    6 +-
 build-aux/GNUmakefile                 |  109 ---
 build-aux/maint.mk                    | 1036 ------------------------
 build-aux/{cfg.mk => syntax-check.mk} | 1079 ++++++++++++++++++++++++-
 4 files changed, 1056 insertions(+), 1174 deletions(-)
 delete mode 100644 build-aux/GNUmakefile
 delete mode 100644 build-aux/maint.mk
 rename build-aux/{cfg.mk => syntax-check.mk} (53%)

diff --git a/Makefile.am b/Makefile.am
index 2a28d53591..4896bee718 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -41,15 +41,13 @@ EXTRA_DIST = \
   README.md \
   AUTHORS.in \
   build-aux/augeas-gentest.pl \
-  build-aux/cfg.mk \
   build-aux/check-spacing.pl \
   build-aux/gitlog-to-changelog \
-  build-aux/GNUmakefile \
   build-aux/header-ifdef.pl \
-  build-aux/maint.mk \
   build-aux/minimize-po.pl \
   build-aux/mock-noinline.pl \
   build-aux/prohibit-duplicate-header.pl \
+  build-aux/syntax-check.mk \
   build-aux/useless-if-before-free \
   build-aux/vc-list-files \
   ci/Makefile \
@@ -87,7 +85,7 @@ srpm: clean
 	@(unset CDPATH ; $(MAKE) dist && rpmbuild -ts $(distdir).tar.xz)
 
 syntax-check:
-	@make -C $(srcdir)/build-aux syntax-check \
+	@make -C $(srcdir)/build-aux -f syntax-check.mk syntax-check \
 		abs_top_builddir=$(abs_top_builddir) \
 		FLAKE8=$(FLAKE8)
 
diff --git a/build-aux/GNUmakefile b/build-aux/GNUmakefile
deleted file mode 100644
index 63ab845f1b..0000000000
--- a/build-aux/GNUmakefile
+++ /dev/null
@@ -1,109 +0,0 @@
-# Having a separate GNUmakefile lets me `include' the dynamically
-# generated rules created via cfg.mk (package-local configuration)
-# as well as maint.mk (generic maintainer rules).
-# This makefile is used only if you run GNU Make.
-# It is necessary if you want to build targets usually of interest
-# only to the maintainer.
-
-# Copyright (C) 2001, 2003, 2006-2011 Free Software Foundation, Inc.
-
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# Systems where /bin/sh is not the default shell need this.  The $(shell)
-# command below won't work with e.g. stock DOS/Windows shells.
-ifeq ($(wildcard /bin/s[h]),/bin/sh)
-SHELL = /bin/sh
-else
-# will be used only with the next shell-test line, then overwritten
-# by a configured-in value
-SHELL = sh
-endif
-
-srcdir = ..
-top_srcdir = ..
-abs_top_srcdir = $(shell pwd)/..
-
-# Make tar archive easier to reproduce.
-export TAR_OPTIONS = --owner=0 --group=0 --numeric-owner
-
-# Allow the user to add to this in the Makefile.
-ALL_RECURSIVE_TARGETS =
-
-# Some projects override e.g., _autoreconf here.
-
-# Allow cfg.mk to override these.
-_build-aux ?= build-aux
-_autoreconf ?= autoreconf -v
-
--include $(srcdir)/$(_build-aux)/cfg.mk
-include $(srcdir)/$(_build-aux)/maint.mk
-
-# Ensure that $(VERSION) is up to date for dist-related targets, but not
-# for others: rerunning autoreconf and recompiling everything isn't cheap.
-_have-git-version-gen := \
-  $(shell test -f $(srcdir)/$(_build-aux)/git-version-gen && echo yes)
-ifeq ($(_have-git-version-gen)0,yes$(MAKELEVEL))
-  _is-dist-target ?= $(filter-out %clean, \
-    $(filter maintainer-% dist% alpha beta stable,$(MAKECMDGOALS)))
-  _is-install-target ?= $(filter-out %check, $(filter install%,$(MAKECMDGOALS)))
-  ifneq (,$(_is-dist-target)$(_is-install-target))
-    _curr-ver := $(shell cd $(srcdir)				\
-                   && $(_build-aux)/git-version-gen		\
-                         .tarball-version			\
-                         $(git-version-gen-tag-sed-script))
-    ifneq ($(_curr-ver),$(VERSION))
-      ifeq ($(_curr-ver),UNKNOWN)
-        $(info WARNING: unable to verify if $(VERSION) is the correct version)
-      else
-        ifneq (,$(_is-install-target))
-          # GNU Coding Standards state that 'make install' should not cause
-          # recompilation after 'make all'.  But as long as changing the version
-          # string alters config.h, the cost of having 'make all' always have an
-          # up-to-date version is prohibitive.  So, as a compromise, we merely
-          # warn when installing a version string that is out of date; the user
-          # should run 'autoreconf' (or something like 'make distcheck') to
-          # fix the version, 'make all' to propagate it, then 'make install'.
-          $(info WARNING: version string $(VERSION) is out of date;)
-          $(info run '$(MAKE) _version' to fix it)
-        else
-          $(info INFO: running autoreconf for new version string: $(_curr-ver))
-GNUmakefile: _version
-	touch GNUmakefile
-        endif
-      endif
-    endif
-  endif
-endif
-
-.PHONY: _version
-_version:
-	cd $(srcdir) && rm -rf autom4te.cache .version && $(_autoreconf)
-	$(MAKE) $(AM_MAKEFLAGS) Makefile
-
-# Tell version 3.79 and up of GNU make to not build goals in this
-# directory in parallel, in case someone tries to build multiple
-# targets, and one of them can cause a recursive target to be invoked.
-
-# Only set this if Automake doesn't provide it.
-AM_RECURSIVE_TARGETS ?= $(RECURSIVE_TARGETS:-recursive=) \
-  $(RECURSIVE_CLEAN_TARGETS:-recursive=) \
-  dist distcheck tags ctags
-
-ALL_RECURSIVE_TARGETS += $(AM_RECURSIVE_TARGETS)
-
-ifneq ($(word 2, $(MAKECMDGOALS)), )
-ifneq ($(filter $(ALL_RECURSIVE_TARGETS), $(MAKECMDGOALS)), )
-.NOTPARALLEL:
-endif
-endif
diff --git a/build-aux/maint.mk b/build-aux/maint.mk
deleted file mode 100644
index 45ef6f03c2..0000000000
--- a/build-aux/maint.mk
+++ /dev/null
@@ -1,1036 +0,0 @@
-# -*-Makefile-*-
-# This Makefile fragment tries to be general-purpose enough to be
-# used by many projects via the gnulib maintainer-makefile module.
-
-## Copyright (C) 2001-2019 Free Software Foundation, Inc.
-##
-## This program is free software: you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-## GNU General Public License for more details.
-##
-## You should have received a copy of the GNU General Public License
-## along with this program.  If not, see <https://www.gnu.org/licenses/>.
-
-# This is reported not to work with make-3.79.1
-# ME := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
-ME := $(_build-aux)/maint.mk
-
-# These variables ought to be defined through the configure.ac section
-# of the module description. But some packages import this file directly,
-# ignoring the module description.
-AWK ?= awk
-GREP ?= grep
-SED ?= sed
-
-# Helper variables.
-_empty =
-_sp = $(_empty) $(_empty)
-
-# _equal,S1,S2
-# ------------
-# If S1 == S2, return S1, otherwise the empty string.
-_equal = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
-
-GIT = git
-VC = $(GIT)
-
-VC_LIST = $(srcdir)/$(_build-aux)/vc-list-files -C $(srcdir)
-
-# You can override this variable in cfg.mk if your gnulib submodule lives
-# in a different location.
-gnulib_dir ?= $(srcdir)/gnulib
-
-# You can override this variable in cfg.mk to set your own regexp
-# matching files to ignore.
-VC_LIST_ALWAYS_EXCLUDE_REGEX ?= ^$$
-
-# This is to preprocess robustly the output of $(VC_LIST), so that even
-# when $(srcdir) is a pathological name like "....", the leading sed command
-# removes only the intended prefix.
-_dot_escaped_srcdir = $(subst .,\.,$(srcdir))
-
-# Post-process $(VC_LIST) output, prepending $(srcdir)/, but only
-# when $(srcdir) is not ".".
-ifeq ($(srcdir),.)
-  _prepend_srcdir_prefix =
-else
-  _prepend_srcdir_prefix = | $(SED) 's|^|$(srcdir)/|'
-endif
-
-# In order to be able to consistently filter "."-relative names,
-# (i.e., with no $(srcdir) prefix), this definition is careful to
-# remove any $(srcdir) prefix, and to restore what it removes.
-_sc_excl = \
-  $(or $(exclude_file_name_regexp--$@),^$$)
-VC_LIST_EXCEPT = \
-  $(VC_LIST) | $(SED) 's|^$(_dot_escaped_srcdir)/||' \
-	| if test -f $(srcdir)/.x-$@; then $(GREP) -vEf $(srcdir)/.x-$@; \
-	  else $(GREP) -Ev -e "$${VC_LIST_EXCEPT_DEFAULT-ChangeLog}"; fi \
-	| $(GREP) -Ev -e '($(VC_LIST_ALWAYS_EXCLUDE_REGEX)|$(_sc_excl))' \
-	$(_prepend_srcdir_prefix)
-
-# Override this in cfg.mk if you are using a different format in your
-# NEWS file.
-today = $(shell date +%Y-%m-%d)
-
-# Prevent programs like 'sort' from considering distinct strings to be equal.
-# Doing it here saves us from having to set LC_ALL elsewhere in this file.
-export LC_ALL = C
-
-## --------------- ##
-## Sanity checks.  ##
-## --------------- ##
-
-_cfg_mk := $(wildcard $(srcdir)/$(_build-aux)/cfg.mk)
-
-# Collect the names of rules starting with 'sc_'.
-syntax-check-rules := $(sort $(shell $(SED) -n \
-   's/^\(sc_[a-zA-Z0-9_-]*\):.*/\1/p' $(srcdir)/$(ME) $(_cfg_mk)))
-.PHONY: $(syntax-check-rules)
-
-ifeq ($(shell $(VC_LIST) >/dev/null 2>&1; echo $$?),0)
-  local-checks-available += $(syntax-check-rules)
-else
-  local-checks-available += no-vc-detected
-no-vc-detected:
-	@echo "No version control files detected; skipping syntax check"
-endif
-.PHONY: $(local-checks-available)
-
-# Arrange to print the name of each syntax-checking rule just before running it.
-$(syntax-check-rules): %: %.m
-sc_m_rules_ = $(patsubst %, %.m, $(syntax-check-rules))
-.PHONY: $(sc_m_rules_)
-$(sc_m_rules_):
-	@echo $(patsubst sc_%.m, %, $@)
-	@date +%s.%N > .sc-start-$(basename $@)
-
-# Compute and print the elapsed time for each syntax-check rule.
-sc_z_rules_ = $(patsubst %, %.z, $(syntax-check-rules))
-.PHONY: $(sc_z_rules_)
-$(sc_z_rules_): %.z: %
-	@end=$$(date +%s.%N);						\
-	start=$$(cat .sc-start-$*);					\
-	rm -f .sc-start-$*;						\
-	$(AWK) -v s=$$start -v e=$$end					\
-	  'END {printf "%.2f $(patsubst sc_%,%,$*)\n", e - s}' < /dev/null
-
-# The patsubst here is to replace each sc_% rule with its sc_%.z wrapper
-# that computes and prints elapsed time.
-local-check :=								\
-  $(patsubst sc_%, sc_%.z,						\
-    $(filter-out $(local-checks-to-skip), $(local-checks-available)))
-
-syntax-check: $(local-check)
-
-# _sc_search_regexp
-#
-# This macro searches for a given construct in the selected files and
-# then takes some action.
-#
-# Parameters (shell variables):
-#
-#  prohibit | require
-#
-#     Regular expression (ERE) denoting either a forbidden construct
-#     or a required construct.  Those arguments are exclusive.
-#
-#  exclude
-#
-#     Regular expression (ERE) denoting lines to ignore that matched
-#     a prohibit construct.  For example, this can be used to exclude
-#     comments that mention why the nearby code uses an alternative
-#     construct instead of the simpler prohibited construct.
-#
-#  in_vc_files | in_files
-#
-#     grep-E-style regexp selecting the files to check.  For in_vc_files,
-#     the regexp is used to select matching files from the list of all
-#     version-controlled files; for in_files, it's from the names printed
-#     by "find $(srcdir)".  When neither is specified, use all files that
-#     are under version control.
-#
-#  containing | non_containing
-#
-#     Select the files (non) containing strings matching this regexp.
-#     If both arguments are specified then CONTAINING takes
-#     precedence.
-#
-#  with_grep_options
-#
-#     Extra options for grep.
-#
-#  ignore_case
-#
-#     Ignore case.
-#
-#  halt
-#
-#     Message to display before to halting execution.
-#
-# Finally, you may exempt files based on an ERE matching file names.
-# For example, to exempt from the sc_space_tab check all files with the
-# .diff suffix, set this Make variable:
-#
-# exclude_file_name_regexp--sc_space_tab = \.diff$
-#
-# Note that while this functionality is mostly inherited via VC_LIST_EXCEPT,
-# when filtering by name via in_files, we explicitly filter out matching
-# names here as well.
-
-# Initialize each, so that envvar settings cannot interfere.
-export require =
-export prohibit =
-export exclude =
-export in_vc_files =
-export in_files =
-export containing =
-export non_containing =
-export halt =
-export with_grep_options =
-
-# By default, _sc_search_regexp does not ignore case.
-export ignore_case =
-_ignore_case = $$(test -n "$$ignore_case" && printf %s -i || :)
-
-define _sc_say_and_exit
-   dummy=; : so we do not need a semicolon before each use;		\
-   { printf '%s\n' "$(ME): $$msg" 1>&2; exit 1; };
-endef
-
-define _sc_search_regexp
-   dummy=; : so we do not need a semicolon before each use;		\
-									\
-   : Check arguments;							\
-   test -n "$$prohibit" && test -n "$$require"				\
-     && { msg='Cannot specify both prohibit and require'		\
-          $(_sc_say_and_exit) } || :;					\
-   test -z "$$prohibit" && test -z "$$require"				\
-     && { msg='Should specify either prohibit or require'		\
-          $(_sc_say_and_exit) } || :;					\
-   test -z "$$prohibit" && test -n "$$exclude"				\
-     && { msg='Use of exclude requires a prohibit pattern'		\
-          $(_sc_say_and_exit) } || :;					\
-   test -n "$$in_vc_files" && test -n "$$in_files"			\
-     && { msg='Cannot specify both in_vc_files and in_files'		\
-          $(_sc_say_and_exit) } || :;					\
-   test "x$$halt" != x							\
-     || { msg='halt not defined' $(_sc_say_and_exit) };			\
-									\
-   : Filter by file name;						\
-   if test -n "$$in_files"; then					\
-     files=$$(find $(srcdir) | $(GREP) -E "$$in_files"			\
-              | $(GREP) -Ev '$(_sc_excl)');				\
-   else									\
-     files=$$($(VC_LIST_EXCEPT));					\
-     if test -n "$$in_vc_files"; then					\
-       files=$$(echo "$$files" | $(GREP) -E "$$in_vc_files");		\
-     fi;								\
-   fi;									\
-									\
-   : Filter by content;							\
-   test -n "$$files"							\
-     && test -n "$$containing"						\
-     && { files=$$(echo "$$files" | xargs $(GREP) -l "$$containing"); }	\
-     || :;								\
-   test -n "$$files"							\
-     && test -n "$$non_containing"					\
-     && { files=$$(echo "$$files" | xargs $(GREP) -vl "$$non_containing"); } \
-     || :;								\
-									\
-   : Check for the construct;						\
-   if test -n "$$files"; then						\
-     if test -n "$$prohibit"; then					\
-       echo "$$files"							\
-         | xargs $(GREP) $$with_grep_options $(_ignore_case) -nE	\
-		"$$prohibit" /dev/null					\
-         | $(GREP) -vE "$${exclude:-^$$}"				\
-         && { msg="$$halt" $(_sc_say_and_exit) }			\
-         || :;								\
-     else								\
-       echo "$$files"							\
-         | xargs							\
-             $(GREP) $$with_grep_options $(_ignore_case) -LE "$$require" \
-         | $(GREP) .							\
-         && { msg="$$halt" $(_sc_say_and_exit) }			\
-         || :;								\
-     fi									\
-   else :;								\
-   fi || :;
-endef
-
-sc_avoid_if_before_free:
-	@$(VC_LIST_EXCEPT)						\
-	  | $(GREP) -v useless-if-before-free				\
-	  | xargs							\
-	      $(srcdir)/$(_build-aux)/useless-if-before-free		\
-	      $(useless_free_options)					\
-	  && { printf '$(ME): found useless "if"'			\
-		      ' before "free" above\n' 1>&2;			\
-	       exit 1; }						\
-	  || :
-
-sc_cast_of_argument_to_free:
-	@prohibit='\<free *\( *\(' halt="don't cast free argument"	\
-	  $(_sc_search_regexp)
-
-sc_cast_of_x_alloc_return_value:
-	@prohibit='\*\) *x(m|c|re)alloc\>'				\
-	halt="don't cast x*alloc return value"				\
-	  $(_sc_search_regexp)
-
-# Use STREQ rather than comparing strcmp == 0, or != 0.
-sp_ = strcmp *\(.+\)
-sc_prohibit_strcmp:
-	@prohibit='! *strcmp *\(|\<$(sp_) *[!=]=|[!=]= *$(sp_)'		\
-	exclude='# *define STRN?EQ\('					\
-	halt='replace strcmp calls above with STREQ/STRNEQ'		\
-	  $(_sc_search_regexp)
-
-# Really.  You don't want to use this function.
-# It may fail to NUL-terminate the destination,
-# and always NUL-pads out to the specified length.
-sc_prohibit_strncpy:
-	@prohibit='\<strncpy *\('					\
-	halt='do not use strncpy, period'				\
-	  $(_sc_search_regexp)
-
-# Pass EXIT_*, not number, to usage, exit, and error (when exiting)
-# Convert all uses automatically, via these two commands:
-# git grep -l '\<exit *(1)' \
-#  | grep -vEf .x-sc_prohibit_magic_number_exit \
-#  | xargs --no-run-if-empty \
-#      perl -pi -e 's/(^|[^.])\b(exit ?)\(1\)/$1$2(EXIT_FAILURE)/'
-# git grep -l '\<exit *(0)' \
-#  | grep -vEf .x-sc_prohibit_magic_number_exit \
-#  | xargs --no-run-if-empty \
-#      perl -pi -e 's/(^|[^.])\b(exit ?)\(0\)/$1$2(EXIT_SUCCESS)/'
-sc_prohibit_magic_number_exit:
-	@prohibit='(^|[^.])\<(usage|exit|error) ?\(-?[0-9]+[,)]'	\
-	exclude='exit \(77\)|error ?\(((0|77),|[^,]*)'			\
-	halt='use EXIT_* values rather than magic number'		\
-	  $(_sc_search_regexp)
-
-# "FATAL:" should be fully upper-cased in error messages
-# "WARNING:" should be fully upper-cased, or fully lower-cased
-sc_error_message_warn_fatal:
-	@$(VC_LIST_EXCEPT)						\
-	  | xargs $(GREP) -nEA2 '[^rp]error *\(' /dev/null		\
-	  | $(GREP) -E '"Warning|"Fatal|"fatal'				\
-	  && { echo '$(ME): use FATAL, WARNING or warning' 1>&2;	\
-	       exit 1; }						\
-	  || :
-
-# Error messages should not end with a period
-sc_error_message_period:
-	@$(VC_LIST_EXCEPT)						\
-	  | xargs $(GREP) -nEA2 '[^rp]error *\(' /dev/null		\
-	  | $(GREP) -E '[^."]\."'					\
-	  && { echo '$(ME): found error message ending in period' 1>&2;	\
-	       exit 1; }						\
-	  || :
-
-# Don't use cpp tests of this symbol.  All code assumes config.h is included.
-sc_prohibit_have_config_h:
-	@prohibit='^# *if.*HAVE''_CONFIG_H'				\
-	halt='found use of HAVE''_CONFIG_H; remove'			\
-	  $(_sc_search_regexp)
-
-# Nearly all .c files must include <config.h>.  However, we also permit this
-# via inclusion of a package-specific header, if cfg.mk specified one.
-# config_h_header must be suitable for grep -E.
-config_h_header ?= <config\.h>
-sc_require_config_h:
-	@require='^# *include $(config_h_header)'			\
-	in_vc_files='\.c$$'						\
-	halt='the above files do not include <config.h>'		\
-	  $(_sc_search_regexp)
-
-# Print each file name for which the first #include does not match
-# $(config_h_header).  Like grep -m 1, this only looks at the first match.
-perl_config_h_first_ =							\
-  -e 'BEGIN {$$ret = 0}'						\
-  -e 'if (/^\# *include\b/) {'						\
-  -e '  if (not m{^\# *include $(config_h_header)}) {'			\
-  -e '    print "$$ARGV\n";'						\
-  -e '    $$ret = 1;'							\
-  -e '  }'								\
-  -e '  \# Move on to next file after first include'			\
-  -e '  close ARGV;'							\
-  -e '}'								\
-  -e 'END {exit $$ret}'
-
-# You must include <config.h> 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) '\.c$$' > /dev/null; then	\
-	  files=$$($(VC_LIST_EXCEPT) | $(GREP) '\.c$$') &&		\
-	  perl -n $(perl_config_h_first_) $$files ||			\
-	    { echo '$(ME): the above files include some other header'	\
-		'before <config.h>' 1>&2; exit 1; } || :;		\
-	else :;								\
-	fi
-
-sc_prohibit_HAVE_MBRTOWC:
-	@prohibit='\bHAVE_MBRTOWC\b'					\
-	halt="do not use $$prohibit; it is always defined"		\
-	  $(_sc_search_regexp)
-
-# To use this "command" macro, you must first define two shell variables:
-# h: the header name, with no enclosing <> or ""
-# re: a regular expression that matches IFF something provided by $h is used.
-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) '\.c$$' > /dev/null; then		\
-    files=$$($(GREP) -l '^# *include '"$$h_esc"				\
-	     $$($(VC_LIST_EXCEPT) | $(GREP) '\.c$$')) &&		\
-    $(GREP) -LE "$$re" $$files | $(GREP) . &&				\
-      { echo "$(ME): the above files include $$h but don't use it"	\
-	1>&2; exit 1; } || :;						\
-  else :;								\
-  fi
-endef
-
-# Prohibit the inclusion of assert.h without an actual use of assert.
-sc_prohibit_assert_without_use:
-	@h='assert.h' re='\<assert *\(' $(_sc_header_without_use)
-
-# Prohibit the inclusion of close-stream.h without an actual use.
-sc_prohibit_close_stream_without_use:
-	@h='close-stream.h' re='\<close_stream *\(' $(_sc_header_without_use)
-
-# Prohibit the inclusion of getopt.h without an actual use.
-sc_prohibit_getopt_without_use:
-	@h='getopt.h' re='\<getopt(_long)? *\(' $(_sc_header_without_use)
-
-# Don't include this header unless you use one of its functions.
-sc_prohibit_long_options_without_use:
-	@h='long-options.h' re='\<parse_(long_options|gnu_standard_options_only) *\(' \
-	  $(_sc_header_without_use)
-
-# Don't include this header unless you use one of its functions.
-sc_prohibit_inttostr_without_use:
-	@h='inttostr.h' re='\<(off|[iu]max|uint)tostr *\(' \
-	  $(_sc_header_without_use)
-
-# Don't include this header unless you use one of its functions.
-sc_prohibit_ignore_value_without_use:
-	@h='ignore-value.h' re='\<ignore_(value|ptr) *\(' \
-	  $(_sc_header_without_use)
-
-# Don't include this header unless you use one of its functions.
-sc_prohibit_error_without_use:
-	@h='error.h' \
-	re='\<error(_at_line|_print_progname|_one_per_line|_message_count)? *\('\
-	  $(_sc_header_without_use)
-
-# Don't include xalloc.h unless you use one of its functions.
-# Consider these symbols:
-# perl -lne '/^# *define (\w+)\(/ and print $1' lib/xalloc.h|grep -v '^__';
-# perl -lne '/^(?:extern )?(?:void|char) \*?(\w+) *\(/ and print $1' lib/xalloc.h
-# Divide into two sets on case, and filter each through this:
-# | sort | perl -MRegexp::Assemble -le \
-#  'print Regexp::Assemble->new(file => "/dev/stdin")->as_string'|sed 's/\?://g'
-# Note this was produced by the above:
-# _xa1 = \
-#x(((2n?)?re|c(har)?|n(re|m)|z)alloc|alloc_(oversized|die)|m(alloc|emdup)|strdup)
-# But we can do better, in at least two ways:
-# 1) take advantage of two "dup"-suffixed strings:
-# x(((2n?)?re|c(har)?|n(re|m)|[mz])alloc|alloc_(oversized|die)|(mem|str)dup)
-# 2) notice that "c(har)?|[mz]" is equivalent to the shorter and more readable
-# "char|[cmz]"
-# x(((2n?)?re|char|n(re|m)|[cmz])alloc|alloc_(oversized|die)|(mem|str)dup)
-_xa1 = x(((2n?)?re|char|n(re|m)|[cmz])alloc|alloc_(oversized|die)|(mem|str)dup)
-_xa2 = X([CZ]|N?M)ALLOC
-sc_prohibit_xalloc_without_use:
-	@h='xalloc.h' \
-	re='\<($(_xa1)|$(_xa2)) *\('\
-	  $(_sc_header_without_use)
-
-sc_prohibit_cloexec_without_use:
-	@h='cloexec.h' re='\<(set_cloexec_flag|dup_cloexec) *\(' \
-	  $(_sc_header_without_use)
-
-sc_prohibit_posixver_without_use:
-	@h='posixver.h' re='\<posix2_version *\(' $(_sc_header_without_use)
-
-sc_prohibit_same_without_use:
-	@h='same.h' re='\<same_name(at)? *\(' $(_sc_header_without_use)
-
-sc_prohibit_hash_pjw_without_use:
-	@h='hash-pjw.h' \
-	re='\<hash_pjw\>' \
-	  $(_sc_header_without_use)
-
-sc_prohibit_safe_read_without_use:
-	@h='safe-read.h' re='(\<SAFE_READ_ERROR\>|\<safe_read *\()' \
-	  $(_sc_header_without_use)
-
-sc_prohibit_argmatch_without_use:
-	@h='argmatch.h' \
-	re='(\<(ARRAY_CARDINALITY|X?ARGMATCH(|_TO_ARGUMENT|_VERIFY))\>|\<(invalid_arg|argmatch(_exit_fn|_(in)?valid)?) *\()' \
-	  $(_sc_header_without_use)
-
-sc_prohibit_canonicalize_without_use:
-	@h='canonicalize.h' \
-	re='CAN_(EXISTING|ALL_BUT_LAST|MISSING)|canonicalize_(mode_t|filename_mode|file_name)' \
-	  $(_sc_header_without_use)
-
-sc_prohibit_root_dev_ino_without_use:
-	@h='root-dev-ino.h' \
-	re='(\<ROOT_DEV_INO_(CHECK|WARN)\>|\<get_root_dev_ino *\()' \
-	  $(_sc_header_without_use)
-
-sc_prohibit_openat_without_use:
-	@h='openat.h' \
-	re='\<(openat_(permissive|needs_fchdir|(save|restore)_fail)|l?(stat|ch(own|mod))at|(euid)?accessat|(FCHMOD|FCHOWN|STAT)AT_INLINE)\>' \
-	  $(_sc_header_without_use)
-
-# Prohibit the inclusion of c-ctype.h without an actual use.
-ctype_re = isalnum|isalpha|isascii|isblank|iscntrl|isdigit|isgraph|islower\
-|isprint|ispunct|isspace|isupper|isxdigit|tolower|toupper
-sc_prohibit_c_ctype_without_use:
-	@h='c-ctype.h' re='\<c_($(ctype_re)) *\(' \
-	  $(_sc_header_without_use)
-
-# The following list was generated by running:
-# man signal.h|col -b|perl -ne '/bsd_signal.*;/.../sigwaitinfo.*;/ and print' \
-#   | perl -lne '/^\s+(?:int|void).*?(\w+).*/ and print $1' | fmt
-_sig_functions = \
-  bsd_signal kill killpg pthread_kill pthread_sigmask raise sigaction \
-  sigaddset sigaltstack sigdelset sigemptyset sigfillset sighold sigignore \
-  siginterrupt sigismember signal sigpause sigpending sigprocmask sigqueue \
-  sigrelse sigset sigsuspend sigtimedwait sigwait sigwaitinfo
-_sig_function_re = $(subst $(_sp),|,$(strip $(_sig_functions)))
-# The following were extracted from "man signal.h" manually.
-_sig_types_and_consts =							\
-  MINSIGSTKSZ SA_NOCLDSTOP SA_NOCLDWAIT SA_NODEFER SA_ONSTACK		\
-  SA_RESETHAND SA_RESTART SA_SIGINFO SIGEV_NONE SIGEV_SIGNAL		\
-  SIGEV_THREAD SIGSTKSZ SIG_BLOCK SIG_SETMASK SIG_UNBLOCK SS_DISABLE	\
-  SS_ONSTACK mcontext_t pid_t sig_atomic_t sigevent siginfo_t sigset_t	\
-  sigstack sigval stack_t ucontext_t
-# generated via this:
-# perl -lne '/^#ifdef (SIG\w+)/ and print $1' lib/sig2str.c|sort -u|fmt -70
-_sig_names =								\
-  SIGABRT SIGALRM SIGALRM1 SIGBUS SIGCANCEL SIGCHLD SIGCLD SIGCONT	\
-  SIGDANGER SIGDIL SIGEMT SIGFPE SIGFREEZE SIGGRANT SIGHUP SIGILL	\
-  SIGINFO SIGINT SIGIO SIGIOT SIGKAP SIGKILL SIGKILLTHR SIGLOST SIGLWP	\
-  SIGMIGRATE SIGMSG SIGPHONE SIGPIPE SIGPOLL SIGPRE SIGPROF SIGPWR	\
-  SIGQUIT SIGRETRACT SIGSAK SIGSEGV SIGSOUND SIGSTKFLT SIGSTOP SIGSYS	\
-  SIGTERM SIGTHAW SIGTRAP SIGTSTP SIGTTIN SIGTTOU SIGURG SIGUSR1	\
-  SIGUSR2 SIGVIRT SIGVTALRM SIGWAITING SIGWINCH SIGWIND SIGWINDOW	\
-  SIGXCPU SIGXFSZ
-_sig_syms_re = $(subst $(_sp),|,$(strip $(_sig_names) $(_sig_types_and_consts)))
-
-# Prohibit the inclusion of signal.h without an actual use.
-sc_prohibit_signal_without_use:
-	@h='signal.h'							\
-	re='\<($(_sig_function_re)) *\(|\<($(_sig_syms_re))\>'		\
-	  $(_sc_header_without_use)
-
-# Don't include stdio--.h unless you use one of its functions.
-sc_prohibit_stdio--_without_use:
-	@h='stdio--.h' re='\<((f(re)?|p)open|tmpfile) *\('		\
-	  $(_sc_header_without_use)
-
-# Don't include stdio-safer.h unless you use one of its functions.
-sc_prohibit_stdio-safer_without_use:
-	@h='stdio-safer.h' re='\<((f(re)?|p)open|tmpfile)_safer *\('	\
-	  $(_sc_header_without_use)
-
-# Prohibit the inclusion of strings.h without a sensible use.
-# Using the likes of bcmp, bcopy, bzero, index or rindex is not sensible.
-sc_prohibit_strings_without_use:
-	@h='strings.h'							\
-	re='\<(strn?casecmp|ffs(ll)?)\>'				\
-	  $(_sc_header_without_use)
-
-# Extract the raw list of symbol names with this:
-gl_extract_define_simple = \
-  /^\# *define ([A-Z]\w+)\(/ and print $$1
-# Filter out duplicates and convert to a space-separated list:
-_intprops_names = \
-  $(shell f=$(gnulib_dir)/lib/intprops.h;				\
-    perl -lne '$(gl_extract_define_simple)' $$f | sort -u | tr '\n' ' ')
-# Remove trailing space and convert to a regular expression:
-_intprops_syms_re = $(subst $(_sp),|,$(strip $(_intprops_names)))
-# Prohibit the inclusion of intprops.h without an actual use.
-sc_prohibit_intprops_without_use:
-	@h='intprops.h'							\
-	re='\<($(_intprops_syms_re)) *\('				\
-	  $(_sc_header_without_use)
-
-_stddef_syms_re = NULL|offsetof|ptrdiff_t|size_t|wchar_t
-# Prohibit the inclusion of stddef.h without an actual use.
-sc_prohibit_stddef_without_use:
-	@h='stddef.h'							\
-	re='\<($(_stddef_syms_re))\>'					\
-	  $(_sc_header_without_use)
-
-_de1 = dirfd|(close|(fd)?open|read|rewind|seek|tell)dir(64)?(_r)?
-_de2 = (versionsort|struct dirent|getdirentries|alphasort|scandir(at)?)(64)?
-_de3 = MAXNAMLEN|DIR|ino_t|d_ino|d_fileno|d_namlen
-_dirent_syms_re = $(_de1)|$(_de2)|$(_de3)
-# Prohibit the inclusion of dirent.h without an actual use.
-sc_prohibit_dirent_without_use:
-	@h='dirent.h'							\
-	re='\<($(_dirent_syms_re))\>'					\
-	  $(_sc_header_without_use)
-
-# Prohibit the inclusion of verify.h without an actual use.
-sc_prohibit_verify_without_use:
-	@h='verify.h'							\
-	re='\<(verify(true|expr)?|assume|static_assert) *\('		\
-	  $(_sc_header_without_use)
-
-# Don't include xfreopen.h unless you use one of its functions.
-sc_prohibit_xfreopen_without_use:
-	@h='xfreopen.h' re='\<xfreopen *\(' $(_sc_header_without_use)
-
-# Each nonempty ChangeLog line must start with a year number, or a TAB.
-sc_changelog:
-	@prohibit='^[^12	]'					\
-	in_vc_files='^ChangeLog$$'					\
-	halt='found unexpected prefix in a ChangeLog'			\
-	  $(_sc_search_regexp)
-
-# Ensure that each .c file containing a "main" function also
-# calls bindtextdomain.
-sc_bindtextdomain:
-	@require='bindtextdomain *\('					\
-	in_vc_files='\.c$$'						\
-	containing='\<main *('						\
-	halt='the above files do not call bindtextdomain'		\
-	  $(_sc_search_regexp)
-
-sc_trailing_blank:
-	@prohibit='[	 ]$$'						\
-	halt='found trailing blank(s)'					\
-	exclude='^Binary file .* matches$$'				\
-	  $(_sc_search_regexp)
-
-
-# A regexp matching function names like "error" that may be used
-# to emit translatable messages.
-_gl_translatable_diag_func_re ?= error
-
-# Look for diagnostics that aren't marked for translation.
-# This won't find any for which error's format string is on a separate line.
-sc_unmarked_diagnostics:
-	@prohibit='\<$(_gl_translatable_diag_func_re) *\([^"]*"[^"]*[a-z]{3}' \
-	exclude='(_|ngettext ?)\('					\
-	halt='found unmarked diagnostic(s)'				\
-	  $(_sc_search_regexp)
-
-# List headers for which HAVE_HEADER_H is always true, assuming you are
-# using the appropriate gnulib module.  CAUTION: for each "unnecessary"
-# #if HAVE_HEADER_H that you remove, be sure that your project explicitly
-# requires the gnulib module that guarantees the usability of that header.
-gl_assured_headers_ = \
-  cd $(gnulib_dir)/lib && echo *.in.h|$(SED) 's/\.in\.h//g'
-
-# Convert the list of names to upper case, and replace each space with "|".
-az_ = abcdefghijklmnopqrstuvwxyz
-AZ_ = ABCDEFGHIJKLMNOPQRSTUVWXYZ
-gl_header_upper_case_or_ =						\
-  $$($(gl_assured_headers_)						\
-    | tr $(az_)/.- $(AZ_)___						\
-    | tr -s ' ' '|'							\
-    )
-sc_prohibit_always_true_header_tests:
-	@or=$(gl_header_upper_case_or_);				\
-	re="HAVE_($$or)_H";						\
-	prohibit='\<'"$$re"'\>'						\
-	halt=$$(printf '%s\n'						\
-	'do not test the above HAVE_<header>_H symbol(s);'		\
-	'  with the corresponding gnulib module, they are always true')	\
-	  $(_sc_search_regexp)
-
-sc_prohibit_defined_have_decl_tests:
-	@prohibit='(#[	 ]*ifn?def|\<defined)\>[	 (]+HAVE_DECL_'	\
-	halt='HAVE_DECL macros are always defined'			\
-	  $(_sc_search_regexp)
-
-# ==================================================================
-gl_other_headers_ ?= \
-  intprops.h	\
-  openat.h	\
-  stat-macros.h
-
-# Perl -lne code to extract "significant" cpp-defined symbols from a
-# gnulib header file, eliminating a few common false-positives.
-# The exempted names below are defined only conditionally in gnulib,
-# and hence sometimes must/may be defined in application code.
-gl_extract_significant_defines_ = \
-  /^\# *define ([^_ (][^ (]*)(\s*\(|\s+\w+)/\
-    && $$2 !~ /(?:rpl_|_used_without_)/\
-    && $$1 !~ /^(?:NSIG|ENODATA)$$/\
-    && $$1 !~ /^(?:SA_RESETHAND|SA_RESTART)$$/\
-    and print $$1
-
-# Create a list of regular expressions matching the names
-# of macros that are guaranteed to be defined by parts of gnulib.
-define def_sym_regex
-	gen_h=$(gl_generated_headers_);					\
-	(cd $(gnulib_dir)/lib;						\
-	  for f in *.in.h $(gl_other_headers_); do			\
-	    test -f $$f							\
-	      && perl -lne '$(gl_extract_significant_defines_)' $$f;	\
-	  done;								\
-	) | sort -u							\
-	  | $(SED) 's/^/^ *# *(define|undef)  */;s/$$/\\>/'
-endef
-
-# Don't define macros that we already get from gnulib header files.
-sc_prohibit_always-defined_macros:
-	@if test -d $(gnulib_dir); then					\
-	  case $$(echo all: | $(GREP) -l -f - $(abs_top_builddir)/Makefile) in $(abs_top_builddir)/Makefile);; *) \
-	    echo '$(ME): skipping $@: you lack GNU grep' 1>&2; exit 0;;	\
-	  esac;								\
-	  regex=$$($(def_sym_regex)); export regex;			\
-	  $(VC_LIST_EXCEPT)						\
-	    | xargs sh -c 'echo $$regex | $(GREP) -E -f - "$$@"'	\
-		dummy /dev/null						\
-	    && { printf '$(ME): define the above'			\
-			' via some gnulib .h file\n' 1>&2;		\
-	         exit 1; }						\
-	    || :;							\
-	fi
-# ==================================================================
-
-# Prohibit checked in backup files.
-sc_prohibit_backup_files:
-	@$(VC_LIST) | $(GREP) '~$$' &&					\
-	  { echo '$(ME): found version controlled backup file' 1>&2;	\
-	    exit 1; } || :
-
-# Require the latest GFDL.  Two regexp, since some .texi files end up
-# line wrapping between 'Free Documentation License,' and 'Version'.
-_GFDL_regexp = (Free ''Documentation.*Version 1\.[^3]|Version 1\.[^3] or any)
-sc_GFDL_version:
-	@prohibit='$(_GFDL_regexp)'					\
-	halt='GFDL vN, N!=3'						\
-	  $(_sc_search_regexp)
-
-cvs_keywords = \
-  Author|Date|Header|Id|Name|Locker|Log|RCSfile|Revision|Source|State
-
-sc_prohibit_cvs_keyword:
-	@prohibit='\$$($(cvs_keywords))\$$'				\
-	halt='do not use CVS keyword expansion'				\
-	  $(_sc_search_regexp)
-
-# This Perl code is slightly obfuscated.  Not only is each "$" doubled
-# because it's in a Makefile, but the $$c's are comments;  we cannot
-# use "#" due to the way the script ends up concatenated onto one line.
-# It would be much more concise, and would produce better output (including
-# counts) if written as:
-#   perl -ln -0777 -e '/\n(\n+)$/ and print "$ARGV: ".length $1' ...
-# but that would be far less efficient, reading the entire contents
-# of each file, rather than just the last two bytes of each.
-# In addition, while the code below detects both blank lines and a missing
-# newline at EOF, the above detects only the former.
-#
-# This is a perl script that is expected to be the single-quoted argument
-# to a command-line "-le".  The remaining arguments are file names.
-# Print the name of each file that does not end in exactly one newline byte.
-# I.e., warn if there are blank lines (2 or more newlines), or if the
-# last byte is not a newline.  However, currently we don't complain
-# about any file that contains exactly one byte.
-# Exit nonzero if at least one such file is found, otherwise, exit 0.
-# Warn about, but otherwise ignore open failure.  Ignore seek/read failure.
-#
-# Use this if you want to remove trailing empty lines from selected files:
-#   perl -pi -0777 -e 's/\n\n+$/\n/' files...
-#
-require_exactly_one_NL_at_EOF_ =					\
-  foreach my $$f (@ARGV)						\
-    {									\
-      open F, "<", $$f or (warn "failed to open $$f: $$!\n"), next;	\
-      my $$p = sysseek (F, -2, 2);					\
-      my $$c = "seek failure probably means file has < 2 bytes; ignore"; \
-      my $$last_two_bytes;						\
-      defined $$p and $$p = sysread F, $$last_two_bytes, 2;		\
-      close F;								\
-      $$c = "ignore read failure";					\
-      $$p && ($$last_two_bytes eq "\n\n"				\
-              || substr ($$last_two_bytes,1) ne "\n")			\
-          and (print $$f), $$fail=1;					\
-    }									\
-  END { exit defined $$fail }
-sc_prohibit_empty_lines_at_EOF:
-	@$(VC_LIST_EXCEPT)						\
-	  | xargs perl -le '$(require_exactly_one_NL_at_EOF_)'		\
-	  || { echo '$(ME): empty line(s) or no newline at EOF' 1>&2;	\
-	       exit 1; }						\
-	  || :
-
-
-# Perl block to convert a match to FILE_NAME:LINENO:TEST,
-# that is shared by two definitions below.
-perl_filename_lineno_text_ =						\
-    -e '  {'								\
-    -e '    $$n = ($$` =~ tr/\n/\n/ + 1);'				\
-    -e '    ($$v = $$&) =~ s/\n/\\n/g;'					\
-    -e '    print "$$ARGV:$$n:$$v\n";'					\
-    -e '  }'
-
-prohibit_doubled_words_ = \
-    the then in an on if is it but for or at and do to
-# expand the regex before running the check to avoid using expensive captures
-prohibit_doubled_word_expanded_ = \
-    $(join $(prohibit_doubled_words_),$(addprefix \s+,$(prohibit_doubled_words_)))
-prohibit_doubled_word_RE_ ?= \
-    /\b(?:$(subst $(_sp),|,$(prohibit_doubled_word_expanded_)))\b/gims
-prohibit_doubled_word_ =						\
-    -e 'while ($(prohibit_doubled_word_RE_))'				\
-    $(perl_filename_lineno_text_)
-
-# Define this to a regular expression that matches
-# any filename:dd:match lines you want to ignore.
-# The default is to ignore no matches.
-ignore_doubled_word_match_RE_ ?= ^$$
-
-sc_prohibit_doubled_word:
-	@$(VC_LIST_EXCEPT)						\
-	  | xargs perl -n -0777 $(prohibit_doubled_word_)		\
-	  | $(GREP) -vE '$(ignore_doubled_word_match_RE_)'		\
-	  | $(GREP) .							\
-	  && { echo '$(ME): doubled words' 1>&2; exit 1; }		\
-	  || :
-
-# Except for shell files and for loops, double semicolon is probably a mistake
-sc_prohibit_double_semicolon:
-	@prohibit='; *;[	{} \]*(/[/*]|$$)'			\
-	in_vc_files='\.[chly]$$'					\
-	exclude='\bfor *\(.*\)'						\
-	halt="Double semicolon detected"				\
-	  $(_sc_search_regexp)
-
-_ptm1 = use "test C1 && test C2", not "test C1 -''a C2"
-_ptm2 = use "test C1 || test C2", not "test C1 -''o C2"
-# Using test's -a and -o operators is not portable.
-# We prefer test over [, since the latter is spelled [[ in configure.ac.
-sc_prohibit_test_minus_ao:
-	@prohibit='(\<test| \[+) .+ -[ao] '				\
-	halt='$(_ptm1); $(_ptm2)'					\
-	  $(_sc_search_regexp)
-
-# Avoid a test bashism.
-sc_prohibit_test_double_equal:
-	@prohibit='(\<test| \[+) .+ == '				\
-	containing='#! */bin/[a-z]*sh'					\
-	halt='use "test x = x", not "test x =''= x"'			\
-	  $(_sc_search_regexp)
-
-# Each program that uses proper_name_utf8 must link with one of the
-# ICONV libraries.  Otherwise, some ICONV library must appear in LDADD.
-# The perl -0777 invocation below extracts the possibly-multi-line
-# definition of LDADD from the appropriate Makefile.am and exits 0
-# when it contains "ICONV".
-sc_proper_name_utf8_requires_ICONV:
-	@progs=$$($(VC_LIST_EXCEPT)					\
-		    | xargs $(GREP) -l 'proper_name_utf8 ''("');	\
-	if test "x$$progs" != x; then					\
-	  fail=0;							\
-	  for p in $$progs; do						\
-	    dir=$$(dirname "$$p");					\
-	    perl -0777							\
-	      -ne 'exit !(/^LDADD =(.+?[^\\]\n)/ms && $$1 =~ /ICONV/)'	\
-	      $$dir/Makefile.am && continue;				\
-	    base=$$(basename "$$p" .c);					\
-	    $(GREP) "$${base}_LDADD.*ICONV)" $$dir/Makefile.am > /dev/null	\
-	      || { fail=1; echo 1>&2 "$(ME): $$p uses proper_name_utf8"; }; \
-	  done;								\
-	  test $$fail = 1 &&						\
-	    { echo 1>&2 '$(ME): the above do not link with any ICONV library'; \
-	      exit 1; } || :;						\
-	fi
-
-# Warn about "c0nst struct Foo const foo[]",
-# but not about "char const *const foo" or "#define const const".
-sc_redundant_const:
-	@prohibit='\bconst\b[[:space:][:alnum:]]{2,}\bconst\b'		\
-	halt='redundant "const" in declarations'			\
-	  $(_sc_search_regexp)
-
-sc_const_long_option:
-	@prohibit='^ *static.*struct option '				\
-	exclude='const struct option|struct option const'		\
-	halt='add "const" to the above declarations'			\
-	  $(_sc_search_regexp)
-
-NEWS_hash =								\
-  $$($(SED) -n '/^\*.* $(PREV_VERSION_REGEXP) ([0-9-]*)/,$$p'		\
-       $(srcdir)/NEWS							\
-     | perl -0777 -pe							\
-	's/^Copyright.+?Free\sSoftware\sFoundation,\sInc\.\n//ms'	\
-     | md5sum -								\
-     | $(SED) 's/ .*//')
-
-# Update the hash stored above.  Do this after each release and
-# for any corrections to old entries.
-update-NEWS-hash: NEWS
-	perl -pi -e 's/^(old_NEWS_hash[ \t]+:?=[ \t]+).*/$${1}'"$(NEWS_hash)/" \
-	  $(srcdir)/cfg.mk
-
-# Ensure that we use only the standard $(VAR) notation,
-# not @...@ in Makefile.am, now that we can rely on automake
-# to emit a definition for each substituted variable.
-# However, there is still one case in which @VAR@ use is not just
-# legitimate, but actually required: when augmenting an automake-defined
-# variable with a prefix.  For example, gettext uses this:
-# MAKEINFO = env LANG= LC_MESSAGES= LC_ALL= LANGUAGE= @MAKEINFO@
-# otherwise, makeinfo would put German or French (current locale)
-# navigation hints in the otherwise-English documentation.
-#
-# Allow the package to add exceptions via a hook in cfg.mk;
-# for example, @PRAGMA_SYSTEM_HEADER@ can be permitted by
-# setting this to ' && !/PRAGMA_SYSTEM_HEADER/'.
-_makefile_at_at_check_exceptions ?=
-sc_makefile_at_at_check:
-	@perl -ne '/\@\w+\@/'						\
-          -e ' && !/(\w+)\s+=.*\@\1\@$$/'				\
-          -e ''$(_makefile_at_at_check_exceptions)			\
-	  -e 'and (print "$$ARGV:$$.: $$_"), $$m=1; END {exit !$$m}'	\
-	    $$($(VC_LIST_EXCEPT) | $(GREP) -E '(^|/)(Makefile\.am|[^/]+\.mk)$$') \
-	  && { echo '$(ME): use $$(...), not @...@' 1>&2; exit 1; } || :
-
-sc_makefile_TAB_only_indentation:
-	@prohibit='^	[ ]{8}'						\
-	in_vc_files='akefile|\.mk$$'					\
-	halt='found TAB-8-space indentation'				\
-	  $(_sc_search_regexp)
-
-sc_m4_quote_check:
-	@prohibit='(AC_DEFINE(_UNQUOTED)?|AC_DEFUN)\([^[]'		\
-	in_vc_files='(^configure\.ac|\.m4)$$'				\
-	halt='quote the first arg to AC_DEF*'				\
-	  $(_sc_search_regexp)
-
-fix_po_file_diag = \
-'you have changed the set of files with translatable diagnostics;\n\
-apply the above patch\n'
-
-# Generate a list of files in which to search for translatable strings.
-perl_translatable_files_list_ =						\
-  -e 'foreach $$file (@ARGV) {'						\
-  -e '	\# Consider only file extensions with one or two letters'	\
-  -e '	$$file =~ /\...?$$/ or next;'					\
-  -e '	\# Ignore m4 and mk files'					\
-  -e '	$$file =~ /\.m[4k]$$/ and next;'				\
-  -e '	\# Ignore a .c or .h file with a corresponding .l or .y file'	\
-  -e '	$$file =~ /(.+)\.[ch]$$/ && (-e "$${1}.l" || -e "$${1}.y")'	\
-  -e '	  and next;'							\
-  -e '	\# Skip unreadable files'					\
-  -e '	-r $$file or next;'						\
-  -e '	print "$$file ";'						\
-  -e '}'
-
-# Verify that all source files using _() (more specifically, files that
-# match $(_gl_translatable_string_re)) are listed in po/POTFILES.in.
-po_file ?= $(srcdir)/po/POTFILES.in
-generated_files ?= $(srcdir)/lib/*.[ch]
-_gl_translatable_string_re ?= \b(N?_|gettext *)\([^)"]*("|$$)
-sc_po_check:
-	@if test -f $(po_file); then					\
-	  $(GREP) -E -v '^(#|$$)' $(po_file)				\
-	    | $(GREP) -v '^src/false\.c$$' | sort > $@-1;		\
-	  { $(VC_LIST_EXCEPT); echo $(generated_files); }		\
-	    | xargs perl $(perl_translatable_files_list_)		\
-	    | xargs $(GREP) -E -l '$(_gl_translatable_string_re)'	\
-	    | $(SED) 's|^$(_dot_escaped_srcdir)/||'			\
-	    | sort -u > $@-2;						\
-	  diff -u -L $(po_file) -L $(po_file) $@-1 $@-2			\
-	    || { printf '$(ME): '$(fix_po_file_diag) 1>&2; exit 1; };	\
-	  rm -f $@-1 $@-2;						\
-	fi
-
-# Check that 'make alpha' will not fail at the end of the process,
-# i.e., when pkg-M.N.tar.xz already exists (either in "." or in ../release)
-# and is read-only.
-writable-files:
-	$(AM_V_GEN)if test -d $(release_archive_dir); then		\
-	  for file in $(DIST_ARCHIVES); do				\
-	    for p in ./ $(release_archive_dir)/; do			\
-	      test -e $$p$$file || continue;				\
-	      test -w $$p$$file						\
-		|| { echo ERROR: $$p$$file is not writable; fail=1; };	\
-	    done;							\
-	  done;								\
-	  test "$$fail" && exit 1 || : ;				\
-	else :;								\
-	fi
-
-v_etc_file = $(gnulib_dir)/lib/version-etc.c
-sample-test = tests/sample-test
-texi = doc/$(PACKAGE).texi
-# Make sure that the copyright date in $(v_etc_file) is up to date.
-# Do the same for the $(sample-test) and the main doc/.texi file.
-sc_copyright_check:
-	@require='enum { COPYRIGHT_YEAR = '$$(date +%Y)' };'		\
-	in_files=$(v_etc_file)						\
-	halt='out of date copyright in $(v_etc_file); update it'	\
-	  $(_sc_search_regexp)
-	@require='# Copyright \(C\) '$$(date +%Y)' Free'		\
-	in_vc_files=$(sample-test)					\
-	halt='out of date copyright in $(sample-test); update it'	\
-	  $(_sc_search_regexp)
-	@require='Copyright @copyright\{\} .*'$$(date +%Y)		\
-	in_vc_files=$(texi)						\
-	halt='out of date copyright in $(texi); update it'		\
-	  $(_sc_search_regexp)
-
-
-# BRE regex of file contents to identify a test script.
-_test_script_regex ?= \<init\.sh\>
-
-# In tests, use "compare expected actual", not the reverse.
-sc_prohibit_reversed_compare_failure:
-	@prohibit='\<compare [^ ]+ ([^ ]*exp|/dev/null)'		\
-	containing='$(_test_script_regex)'				\
-	halt='reversed compare arguments'				\
-	  $(_sc_search_regexp)
-
-# #if HAVE_... will evaluate to false for any non numeric string.
-# That would be flagged by using -Wundef, however gnulib currently
-# tests many undefined macros, and so we can't enable that option.
-# So at least preclude common boolean strings as macro values.
-sc_Wundef_boolean:
-	@prohibit='^#define.*(yes|no|true|false)$$'			\
-	in_files='$(CONFIG_INCLUDE)'					\
-	halt='Use 0 or 1 for macro values'				\
-	  $(_sc_search_regexp)
-
-# Even if you use pathmax.h to guarantee that PATH_MAX is defined, it might
-# not be constant, or might overflow a stack.  In general, use PATH_MAX as
-# a limit, not an array or alloca size.
-sc_prohibit_path_max_allocation:
-	@prohibit='(\balloca *\([^)]*|\[[^]]*)\bPATH_MAX'		\
-	halt='Avoid stack allocations of size PATH_MAX'			\
-	  $(_sc_search_regexp)
-
-sc_vulnerable_makefile_CVE-2009-4029:
-	@prohibit='perm -777 -exec chmod a\+rwx|chmod 777 \$$\(distdir\)' \
-	in_files='(^|/)Makefile\.in$$'					\
-	halt=$$(printf '%s\n'						\
-	  'the above files are vulnerable; beware of running'		\
-	  '  "make dist*" rules, and upgrade to fixed automake'		\
-	  '  see https://bugzilla.redhat.com/show_bug.cgi?id=542609 for details') \
-	  $(_sc_search_regexp)
-
-sc_vulnerable_makefile_CVE-2012-3386:
-	@prohibit='chmod a\+w \$$\(distdir\)'				\
-	in_files='(^|/)Makefile\.in$$'					\
-	halt=$$(printf '%s\n'						\
-	  'the above files are vulnerable; beware of running'		\
-	  '  "make distcheck", and upgrade to fixed automake'		\
-	  '  see https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2012-3386 for details') \
-	  $(_sc_search_regexp)
diff --git a/build-aux/cfg.mk b/build-aux/syntax-check.mk
similarity index 53%
rename from build-aux/cfg.mk
rename to build-aux/syntax-check.mk
index fab5fb85ea..5d17cecab9 100644
--- a/build-aux/cfg.mk
+++ b/build-aux/syntax-check.mk
@@ -1,6 +1,9 @@
-# Customize Makefile.maint.                           -*- makefile -*-
+#
+# Rules for running syntax-check, derived from gnulib's
+# maint.mk
+#
 # Copyright (C) 2008-2019 Red Hat, Inc.
-# Copyright (C) 2003-2008 Free Software Foundation, Inc.
+# Copyright (C) 2003-2019 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,6 +19,126 @@
 # along with this program.  If not, see
 # <http://www.gnu.org/licenses/>.
 
+SHELL = /bin/sh
+
+srcdir = ..
+top_srcdir = ..
+abs_top_srcdir = $(shell pwd)/..
+
+_build-aux ?= build-aux
+
+# This is reported not to work with make-3.79.1
+# ME := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
+ME := $(_build-aux)/syntax-check.mk
+
+# These variables ought to be defined through the configure.ac section
+# of the module description. But some packages import this file directly,
+# ignoring the module description.
+AWK ?= awk
+GREP ?= grep
+SED ?= sed
+
+# Helper variables.
+_empty =
+_sp = $(_empty) $(_empty)
+
+# _equal,S1,S2
+# ------------
+# If S1 == S2, return S1, otherwise the empty string.
+_equal = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+GIT = git
+VC = $(GIT)
+
+VC_LIST = $(srcdir)/$(_build-aux)/vc-list-files -C $(srcdir)
+
+# You can override this variable in syntax-check.mk if your gnulib submodule lives
+# in a different location.
+gnulib_dir ?= $(srcdir)/gnulib
+
+# You can override this variable in syntax-check.mk to set your own regexp
+# matching files to ignore.
+VC_LIST_ALWAYS_EXCLUDE_REGEX ?= ^$$
+
+# This is to preprocess robustly the output of $(VC_LIST), so that even
+# when $(srcdir) is a pathological name like "....", the leading sed command
+# removes only the intended prefix.
+_dot_escaped_srcdir = $(subst .,\.,$(srcdir))
+
+# Post-process $(VC_LIST) output, prepending $(srcdir)/, but only
+# when $(srcdir) is not ".".
+ifeq ($(srcdir),.)
+  _prepend_srcdir_prefix =
+else
+  _prepend_srcdir_prefix = | $(SED) 's|^|$(srcdir)/|'
+endif
+
+# In order to be able to consistently filter "."-relative names,
+# (i.e., with no $(srcdir) prefix), this definition is careful to
+# remove any $(srcdir) prefix, and to restore what it removes.
+_sc_excl = \
+  $(or $(exclude_file_name_regexp--$@),^$$)
+VC_LIST_EXCEPT = \
+  $(VC_LIST) | $(SED) 's|^$(_dot_escaped_srcdir)/||' \
+	| if test -f $(srcdir)/.x-$@; then $(GREP) -vEf $(srcdir)/.x-$@; \
+	  else $(GREP) -Ev -e "$${VC_LIST_EXCEPT_DEFAULT-ChangeLog}"; fi \
+	| $(GREP) -Ev -e '($(VC_LIST_ALWAYS_EXCLUDE_REGEX)|$(_sc_excl))' \
+	$(_prepend_srcdir_prefix)
+
+# Override this in syntax-check.mk if you are using a different format in your
+# NEWS file.
+today = $(shell date +%Y-%m-%d)
+
+# Prevent programs like 'sort' from considering distinct strings to be equal.
+# Doing it here saves us from having to set LC_ALL elsewhere in this file.
+export LC_ALL = C
+
+## --------------- ##
+## Sanity checks.  ##
+## --------------- ##
+
+_cfg_mk := $(wildcard $(srcdir)/$(_build-aux)/syntax-check.mk)
+
+# Collect the names of rules starting with 'sc_'.
+syntax-check-rules := $(sort $(shell $(SED) -n \
+   's/^\(sc_[a-zA-Z0-9_-]*\):.*/\1/p' $(srcdir)/$(ME) $(_cfg_mk)))
+.PHONY: $(syntax-check-rules)
+
+ifeq ($(shell $(VC_LIST) >/dev/null 2>&1; echo $$?),0)
+  local-checks-available += $(syntax-check-rules)
+else
+  local-checks-available += no-vc-detected
+no-vc-detected:
+	@echo "No version control files detected; skipping syntax check"
+endif
+.PHONY: $(local-checks-available)
+
+# Arrange to print the name of each syntax-checking rule just before running it.
+$(syntax-check-rules): %: %.m
+sc_m_rules_ = $(patsubst %, %.m, $(syntax-check-rules))
+.PHONY: $(sc_m_rules_)
+$(sc_m_rules_):
+	@echo $(patsubst sc_%.m, %, $@)
+	@date +%s.%N > .sc-start-$(basename $@)
+
+# Compute and print the elapsed time for each syntax-check rule.
+sc_z_rules_ = $(patsubst %, %.z, $(syntax-check-rules))
+.PHONY: $(sc_z_rules_)
+$(sc_z_rules_): %.z: %
+	@end=$$(date +%s.%N);						\
+	start=$$(cat .sc-start-$*);					\
+	rm -f .sc-start-$*;						\
+	$(AWK) -v s=$$start -v e=$$end					\
+	  'END {printf "%.2f $(patsubst sc_%,%,$*)\n", e - s}' < /dev/null
+
+# The patsubst here is to replace each sc_% rule with its sc_%.z wrapper
+# that computes and prints elapsed time.
+local-check :=								\
+  $(patsubst sc_%, sc_%.z,						\
+    $(filter-out $(local-checks-to-skip), $(local-checks-available)))
+
+syntax-check: $(local-check)
+
 # We use .gnulib, not gnulib.
 gnulib_dir = $(srcdir)/.gnulib
 
@@ -308,7 +431,7 @@ sc_prohibit_access_xok:
 	halt='use virFileIsExecutable instead of access(,X_OK)' \
 	  $(_sc_search_regexp)
 
-# Similar to the gnulib maint.mk rule for sc_prohibit_strcmp
+# Similar to the gnulib syntax-check.mk rule for sc_prohibit_strcmp
 # Use STREQLEN or STRPREFIX rather than comparing strncmp == 0, or != 0.
 snp_ = strncmp *\(.+\)
 sc_prohibit_strncmp:
@@ -1040,7 +1163,913 @@ sc_prohibit_dirent_d_type:
 	  $(_sc_search_regexp)
 
 
-# We don't use this feature of maint.mk.
+# _sc_search_regexp
+#
+# This macro searches for a given construct in the selected files and
+# then takes some action.
+#
+# Parameters (shell variables):
+#
+#  prohibit | require
+#
+#     Regular expression (ERE) denoting either a forbidden construct
+#     or a required construct.  Those arguments are exclusive.
+#
+#  exclude
+#
+#     Regular expression (ERE) denoting lines to ignore that matched
+#     a prohibit construct.  For example, this can be used to exclude
+#     comments that mention why the nearby code uses an alternative
+#     construct instead of the simpler prohibited construct.
+#
+#  in_vc_files | in_files
+#
+#     grep-E-style regexp selecting the files to check.  For in_vc_files,
+#     the regexp is used to select matching files from the list of all
+#     version-controlled files; for in_files, it's from the names printed
+#     by "find $(srcdir)".  When neither is specified, use all files that
+#     are under version control.
+#
+#  containing | non_containing
+#
+#     Select the files (non) containing strings matching this regexp.
+#     If both arguments are specified then CONTAINING takes
+#     precedence.
+#
+#  with_grep_options
+#
+#     Extra options for grep.
+#
+#  ignore_case
+#
+#     Ignore case.
+#
+#  halt
+#
+#     Message to display before to halting execution.
+#
+# Finally, you may exempt files based on an ERE matching file names.
+# For example, to exempt from the sc_space_tab check all files with the
+# .diff suffix, set this Make variable:
+#
+# exclude_file_name_regexp--sc_space_tab = \.diff$
+#
+# Note that while this functionality is mostly inherited via VC_LIST_EXCEPT,
+# when filtering by name via in_files, we explicitly filter out matching
+# names here as well.
+
+# Initialize each, so that envvar settings cannot interfere.
+export require =
+export prohibit =
+export exclude =
+export in_vc_files =
+export in_files =
+export containing =
+export non_containing =
+export halt =
+export with_grep_options =
+
+# By default, _sc_search_regexp does not ignore case.
+export ignore_case =
+_ignore_case = $$(test -n "$$ignore_case" && printf %s -i || :)
+
+define _sc_say_and_exit
+   dummy=; : so we do not need a semicolon before each use;		\
+   { printf '%s\n' "$(ME): $$msg" 1>&2; exit 1; };
+endef
+
+define _sc_search_regexp
+   dummy=; : so we do not need a semicolon before each use;		\
+									\
+   : Check arguments;							\
+   test -n "$$prohibit" && test -n "$$require"				\
+     && { msg='Cannot specify both prohibit and require'		\
+          $(_sc_say_and_exit) } || :;					\
+   test -z "$$prohibit" && test -z "$$require"				\
+     && { msg='Should specify either prohibit or require'		\
+          $(_sc_say_and_exit) } || :;					\
+   test -z "$$prohibit" && test -n "$$exclude"				\
+     && { msg='Use of exclude requires a prohibit pattern'		\
+          $(_sc_say_and_exit) } || :;					\
+   test -n "$$in_vc_files" && test -n "$$in_files"			\
+     && { msg='Cannot specify both in_vc_files and in_files'		\
+          $(_sc_say_and_exit) } || :;					\
+   test "x$$halt" != x							\
+     || { msg='halt not defined' $(_sc_say_and_exit) };			\
+									\
+   : Filter by file name;						\
+   if test -n "$$in_files"; then					\
+     files=$$(find $(srcdir) | $(GREP) -E "$$in_files"			\
+              | $(GREP) -Ev '$(_sc_excl)');				\
+   else									\
+     files=$$($(VC_LIST_EXCEPT));					\
+     if test -n "$$in_vc_files"; then					\
+       files=$$(echo "$$files" | $(GREP) -E "$$in_vc_files");		\
+     fi;								\
+   fi;									\
+									\
+   : Filter by content;							\
+   test -n "$$files"							\
+     && test -n "$$containing"						\
+     && { files=$$(echo "$$files" | xargs $(GREP) -l "$$containing"); }	\
+     || :;								\
+   test -n "$$files"							\
+     && test -n "$$non_containing"					\
+     && { files=$$(echo "$$files" | xargs $(GREP) -vl "$$non_containing"); } \
+     || :;								\
+									\
+   : Check for the construct;						\
+   if test -n "$$files"; then						\
+     if test -n "$$prohibit"; then					\
+       echo "$$files"							\
+         | xargs $(GREP) $$with_grep_options $(_ignore_case) -nE	\
+		"$$prohibit" /dev/null					\
+         | $(GREP) -vE "$${exclude:-^$$}"				\
+         && { msg="$$halt" $(_sc_say_and_exit) }			\
+         || :;								\
+     else								\
+       echo "$$files"							\
+         | xargs							\
+             $(GREP) $$with_grep_options $(_ignore_case) -LE "$$require" \
+         | $(GREP) .							\
+         && { msg="$$halt" $(_sc_say_and_exit) }			\
+         || :;								\
+     fi									\
+   else :;								\
+   fi || :;
+endef
+
+sc_avoid_if_before_free:
+	@$(VC_LIST_EXCEPT)						\
+	  | $(GREP) -v useless-if-before-free				\
+	  | xargs							\
+	      $(srcdir)/$(_build-aux)/useless-if-before-free		\
+	      $(useless_free_options)					\
+	  && { printf '$(ME): found useless "if"'			\
+		      ' before "free" above\n' 1>&2;			\
+	       exit 1; }						\
+	  || :
+
+sc_cast_of_argument_to_free:
+	@prohibit='\<free *\( *\(' halt="don't cast free argument"	\
+	  $(_sc_search_regexp)
+
+sc_cast_of_x_alloc_return_value:
+	@prohibit='\*\) *x(m|c|re)alloc\>'				\
+	halt="don't cast x*alloc return value"				\
+	  $(_sc_search_regexp)
+
+# Use STREQ rather than comparing strcmp == 0, or != 0.
+sp_ = strcmp *\(.+\)
+sc_prohibit_strcmp:
+	@prohibit='! *strcmp *\(|\<$(sp_) *[!=]=|[!=]= *$(sp_)'		\
+	exclude='# *define STRN?EQ\('					\
+	halt='replace strcmp calls above with STREQ/STRNEQ'		\
+	  $(_sc_search_regexp)
+
+# Really.  You don't want to use this function.
+# It may fail to NUL-terminate the destination,
+# and always NUL-pads out to the specified length.
+sc_prohibit_strncpy:
+	@prohibit='\<strncpy *\('					\
+	halt='do not use strncpy, period'				\
+	  $(_sc_search_regexp)
+
+# Pass EXIT_*, not number, to usage, exit, and error (when exiting)
+# Convert all uses automatically, via these two commands:
+# git grep -l '\<exit *(1)' \
+#  | grep -vEf .x-sc_prohibit_magic_number_exit \
+#  | xargs --no-run-if-empty \
+#      perl -pi -e 's/(^|[^.])\b(exit ?)\(1\)/$1$2(EXIT_FAILURE)/'
+# git grep -l '\<exit *(0)' \
+#  | grep -vEf .x-sc_prohibit_magic_number_exit \
+#  | xargs --no-run-if-empty \
+#      perl -pi -e 's/(^|[^.])\b(exit ?)\(0\)/$1$2(EXIT_SUCCESS)/'
+sc_prohibit_magic_number_exit:
+	@prohibit='(^|[^.])\<(usage|exit|error) ?\(-?[0-9]+[,)]'	\
+	exclude='exit \(77\)|error ?\(((0|77),|[^,]*)'			\
+	halt='use EXIT_* values rather than magic number'		\
+	  $(_sc_search_regexp)
+
+# "FATAL:" should be fully upper-cased in error messages
+# "WARNING:" should be fully upper-cased, or fully lower-cased
+sc_error_message_warn_fatal:
+	@$(VC_LIST_EXCEPT)						\
+	  | xargs $(GREP) -nEA2 '[^rp]error *\(' /dev/null		\
+	  | $(GREP) -E '"Warning|"Fatal|"fatal'				\
+	  && { echo '$(ME): use FATAL, WARNING or warning' 1>&2;	\
+	       exit 1; }						\
+	  || :
+
+# Error messages should not end with a period
+sc_error_message_period:
+	@$(VC_LIST_EXCEPT)						\
+	  | xargs $(GREP) -nEA2 '[^rp]error *\(' /dev/null		\
+	  | $(GREP) -E '[^."]\."'					\
+	  && { echo '$(ME): found error message ending in period' 1>&2;	\
+	       exit 1; }						\
+	  || :
+
+# Don't use cpp tests of this symbol.  All code assumes config.h is included.
+sc_prohibit_have_config_h:
+	@prohibit='^# *if.*HAVE''_CONFIG_H'				\
+	halt='found use of HAVE''_CONFIG_H; remove'			\
+	  $(_sc_search_regexp)
+
+# Nearly all .c files must include <config.h>.  However, we also permit this
+# via inclusion of a package-specific header, if syntax-check.mk specified one.
+# config_h_header must be suitable for grep -E.
+config_h_header ?= <config\.h>
+sc_require_config_h:
+	@require='^# *include $(config_h_header)'			\
+	in_vc_files='\.c$$'						\
+	halt='the above files do not include <config.h>'		\
+	  $(_sc_search_regexp)
+
+# Print each file name for which the first #include does not match
+# $(config_h_header).  Like grep -m 1, this only looks at the first match.
+perl_config_h_first_ =							\
+  -e 'BEGIN {$$ret = 0}'						\
+  -e 'if (/^\# *include\b/) {'						\
+  -e '  if (not m{^\# *include $(config_h_header)}) {'			\
+  -e '    print "$$ARGV\n";'						\
+  -e '    $$ret = 1;'							\
+  -e '  }'								\
+  -e '  \# Move on to next file after first include'			\
+  -e '  close ARGV;'							\
+  -e '}'								\
+  -e 'END {exit $$ret}'
+
+# You must include <config.h> before including any other header file.
+# This can possibly be via a package-specific header, if given by syntax-check.mk.
+sc_require_config_h_first:
+	@if $(VC_LIST_EXCEPT) | $(GREP) '\.c$$' > /dev/null; then	\
+	  files=$$($(VC_LIST_EXCEPT) | $(GREP) '\.c$$') &&		\
+	  perl -n $(perl_config_h_first_) $$files ||			\
+	    { echo '$(ME): the above files include some other header'	\
+		'before <config.h>' 1>&2; exit 1; } || :;		\
+	else :;								\
+	fi
+
+sc_prohibit_HAVE_MBRTOWC:
+	@prohibit='\bHAVE_MBRTOWC\b'					\
+	halt="do not use $$prohibit; it is always defined"		\
+	  $(_sc_search_regexp)
+
+# To use this "command" macro, you must first define two shell variables:
+# h: the header name, with no enclosing <> or ""
+# re: a regular expression that matches IFF something provided by $h is used.
+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) '\.c$$' > /dev/null; then		\
+    files=$$($(GREP) -l '^# *include '"$$h_esc"				\
+	     $$($(VC_LIST_EXCEPT) | $(GREP) '\.c$$')) &&		\
+    $(GREP) -LE "$$re" $$files | $(GREP) . &&				\
+      { echo "$(ME): the above files include $$h but don't use it"	\
+	1>&2; exit 1; } || :;						\
+  else :;								\
+  fi
+endef
+
+# Prohibit the inclusion of assert.h without an actual use of assert.
+sc_prohibit_assert_without_use:
+	@h='assert.h' re='\<assert *\(' $(_sc_header_without_use)
+
+# Prohibit the inclusion of close-stream.h without an actual use.
+sc_prohibit_close_stream_without_use:
+	@h='close-stream.h' re='\<close_stream *\(' $(_sc_header_without_use)
+
+# Prohibit the inclusion of getopt.h without an actual use.
+sc_prohibit_getopt_without_use:
+	@h='getopt.h' re='\<getopt(_long)? *\(' $(_sc_header_without_use)
+
+# Don't include this header unless you use one of its functions.
+sc_prohibit_long_options_without_use:
+	@h='long-options.h' re='\<parse_(long_options|gnu_standard_options_only) *\(' \
+	  $(_sc_header_without_use)
+
+# Don't include this header unless you use one of its functions.
+sc_prohibit_inttostr_without_use:
+	@h='inttostr.h' re='\<(off|[iu]max|uint)tostr *\(' \
+	  $(_sc_header_without_use)
+
+# Don't include this header unless you use one of its functions.
+sc_prohibit_ignore_value_without_use:
+	@h='ignore-value.h' re='\<ignore_(value|ptr) *\(' \
+	  $(_sc_header_without_use)
+
+# Don't include this header unless you use one of its functions.
+sc_prohibit_error_without_use:
+	@h='error.h' \
+	re='\<error(_at_line|_print_progname|_one_per_line|_message_count)? *\('\
+	  $(_sc_header_without_use)
+
+# Don't include xalloc.h unless you use one of its functions.
+# Consider these symbols:
+# perl -lne '/^# *define (\w+)\(/ and print $1' lib/xalloc.h|grep -v '^__';
+# perl -lne '/^(?:extern )?(?:void|char) \*?(\w+) *\(/ and print $1' lib/xalloc.h
+# Divide into two sets on case, and filter each through this:
+# | sort | perl -MRegexp::Assemble -le \
+#  'print Regexp::Assemble->new(file => "/dev/stdin")->as_string'|sed 's/\?://g'
+# Note this was produced by the above:
+# _xa1 = \
+#x(((2n?)?re|c(har)?|n(re|m)|z)alloc|alloc_(oversized|die)|m(alloc|emdup)|strdup)
+# But we can do better, in at least two ways:
+# 1) take advantage of two "dup"-suffixed strings:
+# x(((2n?)?re|c(har)?|n(re|m)|[mz])alloc|alloc_(oversized|die)|(mem|str)dup)
+# 2) notice that "c(har)?|[mz]" is equivalent to the shorter and more readable
+# "char|[cmz]"
+# x(((2n?)?re|char|n(re|m)|[cmz])alloc|alloc_(oversized|die)|(mem|str)dup)
+_xa1 = x(((2n?)?re|char|n(re|m)|[cmz])alloc|alloc_(oversized|die)|(mem|str)dup)
+_xa2 = X([CZ]|N?M)ALLOC
+sc_prohibit_xalloc_without_use:
+	@h='xalloc.h' \
+	re='\<($(_xa1)|$(_xa2)) *\('\
+	  $(_sc_header_without_use)
+
+sc_prohibit_cloexec_without_use:
+	@h='cloexec.h' re='\<(set_cloexec_flag|dup_cloexec) *\(' \
+	  $(_sc_header_without_use)
+
+sc_prohibit_posixver_without_use:
+	@h='posixver.h' re='\<posix2_version *\(' $(_sc_header_without_use)
+
+sc_prohibit_same_without_use:
+	@h='same.h' re='\<same_name(at)? *\(' $(_sc_header_without_use)
+
+sc_prohibit_hash_pjw_without_use:
+	@h='hash-pjw.h' \
+	re='\<hash_pjw\>' \
+	  $(_sc_header_without_use)
+
+sc_prohibit_safe_read_without_use:
+	@h='safe-read.h' re='(\<SAFE_READ_ERROR\>|\<safe_read *\()' \
+	  $(_sc_header_without_use)
+
+sc_prohibit_argmatch_without_use:
+	@h='argmatch.h' \
+	re='(\<(ARRAY_CARDINALITY|X?ARGMATCH(|_TO_ARGUMENT|_VERIFY))\>|\<(invalid_arg|argmatch(_exit_fn|_(in)?valid)?) *\()' \
+	  $(_sc_header_without_use)
+
+sc_prohibit_canonicalize_without_use:
+	@h='canonicalize.h' \
+	re='CAN_(EXISTING|ALL_BUT_LAST|MISSING)|canonicalize_(mode_t|filename_mode|file_name)' \
+	  $(_sc_header_without_use)
+
+sc_prohibit_root_dev_ino_without_use:
+	@h='root-dev-ino.h' \
+	re='(\<ROOT_DEV_INO_(CHECK|WARN)\>|\<get_root_dev_ino *\()' \
+	  $(_sc_header_without_use)
+
+sc_prohibit_openat_without_use:
+	@h='openat.h' \
+	re='\<(openat_(permissive|needs_fchdir|(save|restore)_fail)|l?(stat|ch(own|mod))at|(euid)?accessat|(FCHMOD|FCHOWN|STAT)AT_INLINE)\>' \
+	  $(_sc_header_without_use)
+
+# Prohibit the inclusion of c-ctype.h without an actual use.
+ctype_re = isalnum|isalpha|isascii|isblank|iscntrl|isdigit|isgraph|islower\
+|isprint|ispunct|isspace|isupper|isxdigit|tolower|toupper
+sc_prohibit_c_ctype_without_use:
+	@h='c-ctype.h' re='\<c_($(ctype_re)) *\(' \
+	  $(_sc_header_without_use)
+
+# The following list was generated by running:
+# man signal.h|col -b|perl -ne '/bsd_signal.*;/.../sigwaitinfo.*;/ and print' \
+#   | perl -lne '/^\s+(?:int|void).*?(\w+).*/ and print $1' | fmt
+_sig_functions = \
+  bsd_signal kill killpg pthread_kill pthread_sigmask raise sigaction \
+  sigaddset sigaltstack sigdelset sigemptyset sigfillset sighold sigignore \
+  siginterrupt sigismember signal sigpause sigpending sigprocmask sigqueue \
+  sigrelse sigset sigsuspend sigtimedwait sigwait sigwaitinfo
+_sig_function_re = $(subst $(_sp),|,$(strip $(_sig_functions)))
+# The following were extracted from "man signal.h" manually.
+_sig_types_and_consts =							\
+  MINSIGSTKSZ SA_NOCLDSTOP SA_NOCLDWAIT SA_NODEFER SA_ONSTACK		\
+  SA_RESETHAND SA_RESTART SA_SIGINFO SIGEV_NONE SIGEV_SIGNAL		\
+  SIGEV_THREAD SIGSTKSZ SIG_BLOCK SIG_SETMASK SIG_UNBLOCK SS_DISABLE	\
+  SS_ONSTACK mcontext_t pid_t sig_atomic_t sigevent siginfo_t sigset_t	\
+  sigstack sigval stack_t ucontext_t
+# generated via this:
+# perl -lne '/^#ifdef (SIG\w+)/ and print $1' lib/sig2str.c|sort -u|fmt -70
+_sig_names =								\
+  SIGABRT SIGALRM SIGALRM1 SIGBUS SIGCANCEL SIGCHLD SIGCLD SIGCONT	\
+  SIGDANGER SIGDIL SIGEMT SIGFPE SIGFREEZE SIGGRANT SIGHUP SIGILL	\
+  SIGINFO SIGINT SIGIO SIGIOT SIGKAP SIGKILL SIGKILLTHR SIGLOST SIGLWP	\
+  SIGMIGRATE SIGMSG SIGPHONE SIGPIPE SIGPOLL SIGPRE SIGPROF SIGPWR	\
+  SIGQUIT SIGRETRACT SIGSAK SIGSEGV SIGSOUND SIGSTKFLT SIGSTOP SIGSYS	\
+  SIGTERM SIGTHAW SIGTRAP SIGTSTP SIGTTIN SIGTTOU SIGURG SIGUSR1	\
+  SIGUSR2 SIGVIRT SIGVTALRM SIGWAITING SIGWINCH SIGWIND SIGWINDOW	\
+  SIGXCPU SIGXFSZ
+_sig_syms_re = $(subst $(_sp),|,$(strip $(_sig_names) $(_sig_types_and_consts)))
+
+# Prohibit the inclusion of signal.h without an actual use.
+sc_prohibit_signal_without_use:
+	@h='signal.h'							\
+	re='\<($(_sig_function_re)) *\(|\<($(_sig_syms_re))\>'		\
+	  $(_sc_header_without_use)
+
+# Don't include stdio--.h unless you use one of its functions.
+sc_prohibit_stdio--_without_use:
+	@h='stdio--.h' re='\<((f(re)?|p)open|tmpfile) *\('		\
+	  $(_sc_header_without_use)
+
+# Don't include stdio-safer.h unless you use one of its functions.
+sc_prohibit_stdio-safer_without_use:
+	@h='stdio-safer.h' re='\<((f(re)?|p)open|tmpfile)_safer *\('	\
+	  $(_sc_header_without_use)
+
+# Prohibit the inclusion of strings.h without a sensible use.
+# Using the likes of bcmp, bcopy, bzero, index or rindex is not sensible.
+sc_prohibit_strings_without_use:
+	@h='strings.h'							\
+	re='\<(strn?casecmp|ffs(ll)?)\>'				\
+	  $(_sc_header_without_use)
+
+# Extract the raw list of symbol names with this:
+gl_extract_define_simple = \
+  /^\# *define ([A-Z]\w+)\(/ and print $$1
+# Filter out duplicates and convert to a space-separated list:
+_intprops_names = \
+  $(shell f=$(gnulib_dir)/lib/intprops.h;				\
+    perl -lne '$(gl_extract_define_simple)' $$f | sort -u | tr '\n' ' ')
+# Remove trailing space and convert to a regular expression:
+_intprops_syms_re = $(subst $(_sp),|,$(strip $(_intprops_names)))
+# Prohibit the inclusion of intprops.h without an actual use.
+sc_prohibit_intprops_without_use:
+	@h='intprops.h'							\
+	re='\<($(_intprops_syms_re)) *\('				\
+	  $(_sc_header_without_use)
+
+_stddef_syms_re = NULL|offsetof|ptrdiff_t|size_t|wchar_t
+# Prohibit the inclusion of stddef.h without an actual use.
+sc_prohibit_stddef_without_use:
+	@h='stddef.h'							\
+	re='\<($(_stddef_syms_re))\>'					\
+	  $(_sc_header_without_use)
+
+_de1 = dirfd|(close|(fd)?open|read|rewind|seek|tell)dir(64)?(_r)?
+_de2 = (versionsort|struct dirent|getdirentries|alphasort|scandir(at)?)(64)?
+_de3 = MAXNAMLEN|DIR|ino_t|d_ino|d_fileno|d_namlen
+_dirent_syms_re = $(_de1)|$(_de2)|$(_de3)
+# Prohibit the inclusion of dirent.h without an actual use.
+sc_prohibit_dirent_without_use:
+	@h='dirent.h'							\
+	re='\<($(_dirent_syms_re))\>'					\
+	  $(_sc_header_without_use)
+
+# Prohibit the inclusion of verify.h without an actual use.
+sc_prohibit_verify_without_use:
+	@h='verify.h'							\
+	re='\<(verify(true|expr)?|assume|static_assert) *\('		\
+	  $(_sc_header_without_use)
+
+# Don't include xfreopen.h unless you use one of its functions.
+sc_prohibit_xfreopen_without_use:
+	@h='xfreopen.h' re='\<xfreopen *\(' $(_sc_header_without_use)
+
+# Each nonempty ChangeLog line must start with a year number, or a TAB.
+sc_changelog:
+	@prohibit='^[^12	]'					\
+	in_vc_files='^ChangeLog$$'					\
+	halt='found unexpected prefix in a ChangeLog'			\
+	  $(_sc_search_regexp)
+
+# Ensure that each .c file containing a "main" function also
+# calls bindtextdomain.
+sc_bindtextdomain:
+	@require='bindtextdomain *\('					\
+	in_vc_files='\.c$$'						\
+	containing='\<main *('						\
+	halt='the above files do not call bindtextdomain'		\
+	  $(_sc_search_regexp)
+
+sc_trailing_blank:
+	@prohibit='[	 ]$$'						\
+	halt='found trailing blank(s)'					\
+	exclude='^Binary file .* matches$$'				\
+	  $(_sc_search_regexp)
+
+
+# A regexp matching function names like "error" that may be used
+# to emit translatable messages.
+_gl_translatable_diag_func_re ?= error
+
+# Look for diagnostics that aren't marked for translation.
+# This won't find any for which error's format string is on a separate line.
+sc_unmarked_diagnostics:
+	@prohibit='\<$(_gl_translatable_diag_func_re) *\([^"]*"[^"]*[a-z]{3}' \
+	exclude='(_|ngettext ?)\('					\
+	halt='found unmarked diagnostic(s)'				\
+	  $(_sc_search_regexp)
+
+# List headers for which HAVE_HEADER_H is always true, assuming you are
+# using the appropriate gnulib module.  CAUTION: for each "unnecessary"
+# #if HAVE_HEADER_H that you remove, be sure that your project explicitly
+# requires the gnulib module that guarantees the usability of that header.
+gl_assured_headers_ = \
+  cd $(gnulib_dir)/lib && echo *.in.h|$(SED) 's/\.in\.h//g'
+
+# Convert the list of names to upper case, and replace each space with "|".
+az_ = abcdefghijklmnopqrstuvwxyz
+AZ_ = ABCDEFGHIJKLMNOPQRSTUVWXYZ
+gl_header_upper_case_or_ =						\
+  $$($(gl_assured_headers_)						\
+    | tr $(az_)/.- $(AZ_)___						\
+    | tr -s ' ' '|'							\
+    )
+sc_prohibit_always_true_header_tests:
+	@or=$(gl_header_upper_case_or_);				\
+	re="HAVE_($$or)_H";						\
+	prohibit='\<'"$$re"'\>'						\
+	halt=$$(printf '%s\n'						\
+	'do not test the above HAVE_<header>_H symbol(s);'		\
+	'  with the corresponding gnulib module, they are always true')	\
+	  $(_sc_search_regexp)
+
+sc_prohibit_defined_have_decl_tests:
+	@prohibit='(#[	 ]*ifn?def|\<defined)\>[	 (]+HAVE_DECL_'	\
+	halt='HAVE_DECL macros are always defined'			\
+	  $(_sc_search_regexp)
+
+# ==================================================================
+gl_other_headers_ ?= \
+  intprops.h	\
+  openat.h	\
+  stat-macros.h
+
+# Perl -lne code to extract "significant" cpp-defined symbols from a
+# gnulib header file, eliminating a few common false-positives.
+# The exempted names below are defined only conditionally in gnulib,
+# and hence sometimes must/may be defined in application code.
+gl_extract_significant_defines_ = \
+  /^\# *define ([^_ (][^ (]*)(\s*\(|\s+\w+)/\
+    && $$2 !~ /(?:rpl_|_used_without_)/\
+    && $$1 !~ /^(?:NSIG|ENODATA)$$/\
+    && $$1 !~ /^(?:SA_RESETHAND|SA_RESTART)$$/\
+    and print $$1
+
+# Create a list of regular expressions matching the names
+# of macros that are guaranteed to be defined by parts of gnulib.
+define def_sym_regex
+	gen_h=$(gl_generated_headers_);					\
+	(cd $(gnulib_dir)/lib;						\
+	  for f in *.in.h $(gl_other_headers_); do			\
+	    test -f $$f							\
+	      && perl -lne '$(gl_extract_significant_defines_)' $$f;	\
+	  done;								\
+	) | sort -u							\
+	  | $(SED) 's/^/^ *# *(define|undef)  */;s/$$/\\>/'
+endef
+
+# Don't define macros that we already get from gnulib header files.
+sc_prohibit_always-defined_macros:
+	@if test -d $(gnulib_dir); then					\
+	  case $$(echo all: | $(GREP) -l -f - $(abs_top_builddir)/Makefile) in $(abs_top_builddir)/Makefile);; *) \
+	    echo '$(ME): skipping $@: you lack GNU grep' 1>&2; exit 0;;	\
+	  esac;								\
+	  regex=$$($(def_sym_regex)); export regex;			\
+	  $(VC_LIST_EXCEPT)						\
+	    | xargs sh -c 'echo $$regex | $(GREP) -E -f - "$$@"'	\
+		dummy /dev/null						\
+	    && { printf '$(ME): define the above'			\
+			' via some gnulib .h file\n' 1>&2;		\
+	         exit 1; }						\
+	    || :;							\
+	fi
+# ==================================================================
+
+# Prohibit checked in backup files.
+sc_prohibit_backup_files:
+	@$(VC_LIST) | $(GREP) '~$$' &&					\
+	  { echo '$(ME): found version controlled backup file' 1>&2;	\
+	    exit 1; } || :
+
+# Require the latest GFDL.  Two regexp, since some .texi files end up
+# line wrapping between 'Free Documentation License,' and 'Version'.
+_GFDL_regexp = (Free ''Documentation.*Version 1\.[^3]|Version 1\.[^3] or any)
+sc_GFDL_version:
+	@prohibit='$(_GFDL_regexp)'					\
+	halt='GFDL vN, N!=3'						\
+	  $(_sc_search_regexp)
+
+cvs_keywords = \
+  Author|Date|Header|Id|Name|Locker|Log|RCSfile|Revision|Source|State
+
+sc_prohibit_cvs_keyword:
+	@prohibit='\$$($(cvs_keywords))\$$'				\
+	halt='do not use CVS keyword expansion'				\
+	  $(_sc_search_regexp)
+
+# This Perl code is slightly obfuscated.  Not only is each "$" doubled
+# because it's in a Makefile, but the $$c's are comments;  we cannot
+# use "#" due to the way the script ends up concatenated onto one line.
+# It would be much more concise, and would produce better output (including
+# counts) if written as:
+#   perl -ln -0777 -e '/\n(\n+)$/ and print "$ARGV: ".length $1' ...
+# but that would be far less efficient, reading the entire contents
+# of each file, rather than just the last two bytes of each.
+# In addition, while the code below detects both blank lines and a missing
+# newline at EOF, the above detects only the former.
+#
+# This is a perl script that is expected to be the single-quoted argument
+# to a command-line "-le".  The remaining arguments are file names.
+# Print the name of each file that does not end in exactly one newline byte.
+# I.e., warn if there are blank lines (2 or more newlines), or if the
+# last byte is not a newline.  However, currently we don't complain
+# about any file that contains exactly one byte.
+# Exit nonzero if at least one such file is found, otherwise, exit 0.
+# Warn about, but otherwise ignore open failure.  Ignore seek/read failure.
+#
+# Use this if you want to remove trailing empty lines from selected files:
+#   perl -pi -0777 -e 's/\n\n+$/\n/' files...
+#
+require_exactly_one_NL_at_EOF_ =					\
+  foreach my $$f (@ARGV)						\
+    {									\
+      open F, "<", $$f or (warn "failed to open $$f: $$!\n"), next;	\
+      my $$p = sysseek (F, -2, 2);					\
+      my $$c = "seek failure probably means file has < 2 bytes; ignore"; \
+      my $$last_two_bytes;						\
+      defined $$p and $$p = sysread F, $$last_two_bytes, 2;		\
+      close F;								\
+      $$c = "ignore read failure";					\
+      $$p && ($$last_two_bytes eq "\n\n"				\
+              || substr ($$last_two_bytes,1) ne "\n")			\
+          and (print $$f), $$fail=1;					\
+    }									\
+  END { exit defined $$fail }
+sc_prohibit_empty_lines_at_EOF:
+	@$(VC_LIST_EXCEPT)						\
+	  | xargs perl -le '$(require_exactly_one_NL_at_EOF_)'		\
+	  || { echo '$(ME): empty line(s) or no newline at EOF' 1>&2;	\
+	       exit 1; }						\
+	  || :
+
+
+# Perl block to convert a match to FILE_NAME:LINENO:TEST,
+# that is shared by two definitions below.
+perl_filename_lineno_text_ =						\
+    -e '  {'								\
+    -e '    $$n = ($$` =~ tr/\n/\n/ + 1);'				\
+    -e '    ($$v = $$&) =~ s/\n/\\n/g;'					\
+    -e '    print "$$ARGV:$$n:$$v\n";'					\
+    -e '  }'
+
+prohibit_doubled_words_ = \
+    the then in an on if is it but for or at and do to
+# expand the regex before running the check to avoid using expensive captures
+prohibit_doubled_word_expanded_ = \
+    $(join $(prohibit_doubled_words_),$(addprefix \s+,$(prohibit_doubled_words_)))
+prohibit_doubled_word_RE_ ?= \
+    /\b(?:$(subst $(_sp),|,$(prohibit_doubled_word_expanded_)))\b/gims
+prohibit_doubled_word_ =						\
+    -e 'while ($(prohibit_doubled_word_RE_))'				\
+    $(perl_filename_lineno_text_)
+
+# Define this to a regular expression that matches
+# any filename:dd:match lines you want to ignore.
+# The default is to ignore no matches.
+ignore_doubled_word_match_RE_ ?= ^$$
+
+sc_prohibit_doubled_word:
+	@$(VC_LIST_EXCEPT)						\
+	  | xargs perl -n -0777 $(prohibit_doubled_word_)		\
+	  | $(GREP) -vE '$(ignore_doubled_word_match_RE_)'		\
+	  | $(GREP) .							\
+	  && { echo '$(ME): doubled words' 1>&2; exit 1; }		\
+	  || :
+
+# Except for shell files and for loops, double semicolon is probably a mistake
+sc_prohibit_double_semicolon:
+	@prohibit='; *;[	{} \]*(/[/*]|$$)'			\
+	in_vc_files='\.[chly]$$'					\
+	exclude='\bfor *\(.*\)'						\
+	halt="Double semicolon detected"				\
+	  $(_sc_search_regexp)
+
+_ptm1 = use "test C1 && test C2", not "test C1 -''a C2"
+_ptm2 = use "test C1 || test C2", not "test C1 -''o C2"
+# Using test's -a and -o operators is not portable.
+# We prefer test over [, since the latter is spelled [[ in configure.ac.
+sc_prohibit_test_minus_ao:
+	@prohibit='(\<test| \[+) .+ -[ao] '				\
+	halt='$(_ptm1); $(_ptm2)'					\
+	  $(_sc_search_regexp)
+
+# Avoid a test bashism.
+sc_prohibit_test_double_equal:
+	@prohibit='(\<test| \[+) .+ == '				\
+	containing='#! */bin/[a-z]*sh'					\
+	halt='use "test x = x", not "test x =''= x"'			\
+	  $(_sc_search_regexp)
+
+# Each program that uses proper_name_utf8 must link with one of the
+# ICONV libraries.  Otherwise, some ICONV library must appear in LDADD.
+# The perl -0777 invocation below extracts the possibly-multi-line
+# definition of LDADD from the appropriate Makefile.am and exits 0
+# when it contains "ICONV".
+sc_proper_name_utf8_requires_ICONV:
+	@progs=$$($(VC_LIST_EXCEPT)					\
+		    | xargs $(GREP) -l 'proper_name_utf8 ''("');	\
+	if test "x$$progs" != x; then					\
+	  fail=0;							\
+	  for p in $$progs; do						\
+	    dir=$$(dirname "$$p");					\
+	    perl -0777							\
+	      -ne 'exit !(/^LDADD =(.+?[^\\]\n)/ms && $$1 =~ /ICONV/)'	\
+	      $$dir/Makefile.am && continue;				\
+	    base=$$(basename "$$p" .c);					\
+	    $(GREP) "$${base}_LDADD.*ICONV)" $$dir/Makefile.am > /dev/null	\
+	      || { fail=1; echo 1>&2 "$(ME): $$p uses proper_name_utf8"; }; \
+	  done;								\
+	  test $$fail = 1 &&						\
+	    { echo 1>&2 '$(ME): the above do not link with any ICONV library'; \
+	      exit 1; } || :;						\
+	fi
+
+# Warn about "c0nst struct Foo const foo[]",
+# but not about "char const *const foo" or "#define const const".
+sc_redundant_const:
+	@prohibit='\bconst\b[[:space:][:alnum:]]{2,}\bconst\b'		\
+	halt='redundant "const" in declarations'			\
+	  $(_sc_search_regexp)
+
+sc_const_long_option:
+	@prohibit='^ *static.*struct option '				\
+	exclude='const struct option|struct option const'		\
+	halt='add "const" to the above declarations'			\
+	  $(_sc_search_regexp)
+
+NEWS_hash =								\
+  $$($(SED) -n '/^\*.* $(PREV_VERSION_REGEXP) ([0-9-]*)/,$$p'		\
+       $(srcdir)/NEWS							\
+     | perl -0777 -pe							\
+	's/^Copyright.+?Free\sSoftware\sFoundation,\sInc\.\n//ms'	\
+     | md5sum -								\
+     | $(SED) 's/ .*//')
+
+# Update the hash stored above.  Do this after each release and
+# for any corrections to old entries.
+update-NEWS-hash: NEWS
+	perl -pi -e 's/^(old_NEWS_hash[ \t]+:?=[ \t]+).*/$${1}'"$(NEWS_hash)/" \
+	  $(srcdir)/syntax-check.mk
+
+# Ensure that we use only the standard $(VAR) notation,
+# not @...@ in Makefile.am, now that we can rely on automake
+# to emit a definition for each substituted variable.
+# However, there is still one case in which @VAR@ use is not just
+# legitimate, but actually required: when augmenting an automake-defined
+# variable with a prefix.  For example, gettext uses this:
+# MAKEINFO = env LANG= LC_MESSAGES= LC_ALL= LANGUAGE= @MAKEINFO@
+# otherwise, makeinfo would put German or French (current locale)
+# navigation hints in the otherwise-English documentation.
+#
+# Allow the package to add exceptions via a hook in syntax-check.mk;
+# for example, @PRAGMA_SYSTEM_HEADER@ can be permitted by
+# setting this to ' && !/PRAGMA_SYSTEM_HEADER/'.
+_makefile_at_at_check_exceptions ?=
+sc_makefile_at_at_check:
+	@perl -ne '/\@\w+\@/'						\
+          -e ' && !/(\w+)\s+=.*\@\1\@$$/'				\
+          -e ''$(_makefile_at_at_check_exceptions)			\
+	  -e 'and (print "$$ARGV:$$.: $$_"), $$m=1; END {exit !$$m}'	\
+	    $$($(VC_LIST_EXCEPT) | $(GREP) -E '(^|/)(Makefile\.am|[^/]+\.mk)$$') \
+	  && { echo '$(ME): use $$(...), not @...@' 1>&2; exit 1; } || :
+
+sc_makefile_TAB_only_indentation:
+	@prohibit='^	[ ]{8}'						\
+	in_vc_files='akefile|\.mk$$'					\
+	halt='found TAB-8-space indentation'				\
+	  $(_sc_search_regexp)
+
+sc_m4_quote_check:
+	@prohibit='(AC_DEFINE(_UNQUOTED)?|AC_DEFUN)\([^[]'		\
+	in_vc_files='(^configure\.ac|\.m4)$$'				\
+	halt='quote the first arg to AC_DEF*'				\
+	  $(_sc_search_regexp)
+
+fix_po_file_diag = \
+'you have changed the set of files with translatable diagnostics;\n\
+apply the above patch\n'
+
+# Generate a list of files in which to search for translatable strings.
+perl_translatable_files_list_ =						\
+  -e 'foreach $$file (@ARGV) {'						\
+  -e '	\# Consider only file extensions with one or two letters'	\
+  -e '	$$file =~ /\...?$$/ or next;'					\
+  -e '	\# Ignore m4 and mk files'					\
+  -e '	$$file =~ /\.m[4k]$$/ and next;'				\
+  -e '	\# Ignore a .c or .h file with a corresponding .l or .y file'	\
+  -e '	$$file =~ /(.+)\.[ch]$$/ && (-e "$${1}.l" || -e "$${1}.y")'	\
+  -e '	  and next;'							\
+  -e '	\# Skip unreadable files'					\
+  -e '	-r $$file or next;'						\
+  -e '	print "$$file ";'						\
+  -e '}'
+
+# Verify that all source files using _() (more specifically, files that
+# match $(_gl_translatable_string_re)) are listed in po/POTFILES.in.
+po_file ?= $(srcdir)/po/POTFILES.in
+generated_files ?= $(srcdir)/lib/*.[ch]
+_gl_translatable_string_re ?= \b(N?_|gettext *)\([^)"]*("|$$)
+sc_po_check:
+	@if test -f $(po_file); then					\
+	  $(GREP) -E -v '^(#|$$)' $(po_file)				\
+	    | $(GREP) -v '^src/false\.c$$' | sort > $@-1;		\
+	  { $(VC_LIST_EXCEPT); echo $(generated_files); }		\
+	    | xargs perl $(perl_translatable_files_list_)		\
+	    | xargs $(GREP) -E -l '$(_gl_translatable_string_re)'	\
+	    | $(SED) 's|^$(_dot_escaped_srcdir)/||'			\
+	    | sort -u > $@-2;						\
+	  diff -u -L $(po_file) -L $(po_file) $@-1 $@-2			\
+	    || { printf '$(ME): '$(fix_po_file_diag) 1>&2; exit 1; };	\
+	  rm -f $@-1 $@-2;						\
+	fi
+
+# Check that 'make alpha' will not fail at the end of the process,
+# i.e., when pkg-M.N.tar.xz already exists (either in "." or in ../release)
+# and is read-only.
+writable-files:
+	$(AM_V_GEN)if test -d $(release_archive_dir); then		\
+	  for file in $(DIST_ARCHIVES); do				\
+	    for p in ./ $(release_archive_dir)/; do			\
+	      test -e $$p$$file || continue;				\
+	      test -w $$p$$file						\
+		|| { echo ERROR: $$p$$file is not writable; fail=1; };	\
+	    done;							\
+	  done;								\
+	  test "$$fail" && exit 1 || : ;				\
+	else :;								\
+	fi
+
+v_etc_file = $(gnulib_dir)/lib/version-etc.c
+sample-test = tests/sample-test
+texi = doc/$(PACKAGE).texi
+# Make sure that the copyright date in $(v_etc_file) is up to date.
+# Do the same for the $(sample-test) and the main doc/.texi file.
+sc_copyright_check:
+	@require='enum { COPYRIGHT_YEAR = '$$(date +%Y)' };'		\
+	in_files=$(v_etc_file)						\
+	halt='out of date copyright in $(v_etc_file); update it'	\
+	  $(_sc_search_regexp)
+	@require='# Copyright \(C\) '$$(date +%Y)' Free'		\
+	in_vc_files=$(sample-test)					\
+	halt='out of date copyright in $(sample-test); update it'	\
+	  $(_sc_search_regexp)
+	@require='Copyright @copyright\{\} .*'$$(date +%Y)		\
+	in_vc_files=$(texi)						\
+	halt='out of date copyright in $(texi); update it'		\
+	  $(_sc_search_regexp)
+
+
+# BRE regex of file contents to identify a test script.
+_test_script_regex ?= \<init\.sh\>
+
+# In tests, use "compare expected actual", not the reverse.
+sc_prohibit_reversed_compare_failure:
+	@prohibit='\<compare [^ ]+ ([^ ]*exp|/dev/null)'		\
+	containing='$(_test_script_regex)'				\
+	halt='reversed compare arguments'				\
+	  $(_sc_search_regexp)
+
+# #if HAVE_... will evaluate to false for any non numeric string.
+# That would be flagged by using -Wundef, however gnulib currently
+# tests many undefined macros, and so we can't enable that option.
+# So at least preclude common boolean strings as macro values.
+sc_Wundef_boolean:
+	@prohibit='^#define.*(yes|no|true|false)$$'			\
+	in_files='$(CONFIG_INCLUDE)'					\
+	halt='Use 0 or 1 for macro values'				\
+	  $(_sc_search_regexp)
+
+# Even if you use pathmax.h to guarantee that PATH_MAX is defined, it might
+# not be constant, or might overflow a stack.  In general, use PATH_MAX as
+# a limit, not an array or alloca size.
+sc_prohibit_path_max_allocation:
+	@prohibit='(\balloca *\([^)]*|\[[^]]*)\bPATH_MAX'		\
+	halt='Avoid stack allocations of size PATH_MAX'			\
+	  $(_sc_search_regexp)
+
+sc_vulnerable_makefile_CVE-2009-4029:
+	@prohibit='perm -777 -exec chmod a\+rwx|chmod 777 \$$\(distdir\)' \
+	in_files='(^|/)Makefile\.in$$'					\
+	halt=$$(printf '%s\n'						\
+	  'the above files are vulnerable; beware of running'		\
+	  '  "make dist*" rules, and upgrade to fixed automake'		\
+	  '  see https://bugzilla.redhat.com/show_bug.cgi?id=542609 for details') \
+	  $(_sc_search_regexp)
+
+sc_vulnerable_makefile_CVE-2012-3386:
+	@prohibit='chmod a\+w \$$\(distdir\)'				\
+	in_files='(^|/)Makefile\.in$$'					\
+	halt=$$(printf '%s\n'						\
+	  'the above files are vulnerable; beware of running'		\
+	  '  "make distcheck", and upgrade to fixed automake'		\
+	  '  see https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2012-3386 for details') \
+	  $(_sc_search_regexp)
+
+# We don't use this feature of syntax-check.mk.
 prev_version_file = /dev/null
 
 ifneq ($(_gl-Makefile),)
@@ -1060,7 +2089,7 @@ ifeq (0,$(MAKELEVEL))
   # be investigated
   ifeq (1,$(_dry_run_result))
     $(info INFO: autogen.sh error, running again to show details)
-maint.mk Makefile: _autogen_error
+syntax-check.mk Makefile: _autogen_error
   endif
 
   # A return value of 2 means that autogen.sh needs to be executed
@@ -1070,7 +2099,7 @@ maint.mk Makefile: _autogen_error
   ifeq (2,$(_dry_run_result)$(_clean_requested))
     $(info INFO: running autogen.sh is required, running it now...)
     $(shell touch $(srcdir)/AUTHORS)
-maint.mk Makefile: _autogen
+syntax-check.mk Makefile: _autogen
   endif
 endif
 endif
@@ -1159,13 +2188,13 @@ exclude_file_name_regexp--sc_bindtextdomain = .*
 exclude_file_name_regexp--sc_gettext_init = ^((tests|examples)/|tools/virt-login-shell.c)
 
 exclude_file_name_regexp--sc_copyright_format = \
-	^build-aux/cfg\.mk$$
+	^build-aux/syntax-check\.mk$$
 
 exclude_file_name_regexp--sc_copyright_usage = \
-  ^COPYING(|\.LESSER)|build-aux/maint.mk$$
+  ^COPYING(|\.LESSER)|build-aux/syntax-check.mk$$
 
 exclude_file_name_regexp--sc_flags_usage = \
-  ^(build-aux/cfg\.mk|docs/|src/util/virnetdevtap\.c$$|tests/((vir(cgroup|pci|test|usb)|nss|qemuxml2argv|qemusecurity)mock|virfilewrapper)\.c$$)
+  ^(build-aux/syntax-check\.mk|docs/|src/util/virnetdevtap\.c$$|tests/((vir(cgroup|pci|test|usb)|nss|qemuxml2argv|qemusecurity)mock|virfilewrapper)\.c$$)
 
 exclude_file_name_regexp--sc_libvirt_unmarked_diagnostics = \
   ^(src/rpc/gendispatch\.pl$$|tests/)
@@ -1173,22 +2202,22 @@ exclude_file_name_regexp--sc_libvirt_unmarked_diagnostics = \
 exclude_file_name_regexp--sc_po_check = ^(docs/|src/rpc/gendispatch\.pl$$)
 
 exclude_file_name_regexp--sc_prohibit_VIR_ERR_NO_MEMORY = \
-  ^(build-aux/cfg\.mk|include/libvirt/virterror\.h|src/remote/remote_daemon_dispatch\.c|src/util/virerror\.c|docs/internals/oomtesting\.html\.in)$$
+  ^(build-aux/syntax-check\.mk|include/libvirt/virterror\.h|src/remote/remote_daemon_dispatch\.c|src/util/virerror\.c|docs/internals/oomtesting\.html\.in)$$
 
 exclude_file_name_regexp--sc_makefile_TAB_only_indentation = \
-  ^build-aux/maint\.mk$$
+  ^build-aux/syntax-check\.mk$$
 
 exclude_file_name_regexp--sc_makefile_at_at_check = \
-  ^build-aux/maint\.mk$$
+  ^build-aux/syntax-check\.mk$$
 
 exclude_file_name_regexp--sc_prohibit_PATH_MAX = \
-	^build-aux/(cfg|maint)\.mk$$
+	^build-aux/syntax-check\.mk$$
 
 exclude_file_name_regexp--sc_prohibit_access_xok = \
-	^(build-aux/cfg\.mk|src/util/virutil\.c)$$
+	^(build-aux/syntax-check\.mk|src/util/virutil\.c)$$
 
 exclude_file_name_regexp--sc_prohibit_asprintf = \
-  ^(build-aux/cfg\.mk|bootstrap.conf$$|examples/|src/util/virstring\.[ch]$$|tests/vircgroupmock\.c|tools/virt-login-shell\.c|tools/nss/libvirt_nss\.c$$)
+  ^(build-aux/syntax-check\.mk|bootstrap.conf$$|examples/|src/util/virstring\.[ch]$$|tests/vircgroupmock\.c|tools/virt-login-shell\.c|tools/nss/libvirt_nss\.c$$)
 
 exclude_file_name_regexp--sc_prohibit_strdup = \
   ^(docs/|examples/|src/util/virstring\.c|tests/vir(netserverclient|cgroup)mock.c|tests/commandhelper\.c|tools/nss/libvirt_nss_(leases|macs)\.c$$)
@@ -1218,10 +2247,10 @@ exclude_file_name_regexp--sc_prohibit_nonreentrant = \
   ^((po|tests|examples)/|docs/.*(py|js|html\.in)|run.in$$|tools/wireshark/util/genxdrstub\.pl|tools/virt-login-shell\.c$$)
 
 exclude_file_name_regexp--sc_prohibit_select = \
-	^build-aux/cfg\.mk$$
+	^build-aux/syntax-check\.mk$$
 
 exclude_file_name_regexp--sc_prohibit_canonicalize_file_name = \
-  ^(build-aux/cfg\.mk|tests/virfilemock\.c)$$
+  ^(build-aux/syntax-check\.mk|tests/virfilemock\.c)$$
 
 exclude_file_name_regexp--sc_prohibit_raw_allocation = \
   ^(docs/hacking\.html\.in|src/util/viralloc\.[ch]|examples/.*|tests/(securityselinuxhelper|(vircgroup|nss)mock|commandhelper)\.c|tools/wireshark/src/packet-libvirt\.c|tools/nss/libvirt_nss(_leases|_macs)?\.c|build-aux/useless-if-before-free)$$
@@ -1232,7 +2261,7 @@ exclude_file_name_regexp--sc_prohibit_readlink = \
 exclude_file_name_regexp--sc_prohibit_setuid = ^src/util/virutil\.c|tools/virt-login-shell\.c$$
 
 exclude_file_name_regexp--sc_prohibit_sprintf = \
-  ^(build-aux/cfg\.mk|docs/hacking\.html\.in|.*\.stp|.*\.pl)$$
+  ^(build-aux/syntax-check\.mk|docs/hacking\.html\.in|.*\.stp|.*\.pl)$$
 
 exclude_file_name_regexp--sc_prohibit_strncpy = ^src/util/virstring\.c$$
 
@@ -1256,7 +2285,7 @@ exclude_file_name_regexp--sc_trailing_blank = \
 exclude_file_name_regexp--sc_unmarked_diagnostics = \
   ^(docs/apibuild.py|tests/virt-aa-helper-test|docs/js/.*\.js)$$
 
-exclude_file_name_regexp--sc_size_of_brackets = build-aux/cfg\.mk
+exclude_file_name_regexp--sc_size_of_brackets = build-aux/syntax-check\.mk
 
 exclude_file_name_regexp--sc_correct_id_types = \
   (^src/locking/lock_protocol.x$$)
@@ -1270,7 +2299,7 @@ exclude_file_name_regexp--sc_prohibit_include_public_headers_brackets = \
   ^(tools/|examples/|include/libvirt/(virterror|libvirt(-(admin|qemu|lxc))?)\.h$$)
 
 exclude_file_name_regexp--sc_prohibit_int_ijk = \
-  ^(src/remote_protocol-structs|src/remote/remote_protocol\.x|build-aux/cfg\.mk|include/libvirt/libvirt.+|src/admin_protocol-structs|src/admin/admin_protocol\.x)$$
+  ^(src/remote_protocol-structs|src/remote/remote_protocol\.x|build-aux/syntax-check\.mk|include/libvirt/libvirt.+|src/admin_protocol-structs|src/admin/admin_protocol\.x)$$
 
 exclude_file_name_regexp--sc_prohibit_unsigned_pid = \
   ^(include/libvirt/.*\.h|src/(qemu/qemu_driver\.c|driver-hypervisor\.h|libvirt(-[a-z]*)?\.c|.*\.x|util/vir(polkit|systemd)\.c)|tests/virpolkittest\.c|tools/virsh-domain\.c)$$
@@ -1288,16 +2317,16 @@ exclude_file_name_regexp--sc_prohibit_useless_translation = \
   ^tests/virpolkittest.c
 
 exclude_file_name_regexp--sc_prohibit_devname = \
-  ^(tools/virsh.pod|build-aux/cfg\.mk|docs/.*)$$
+  ^(tools/virsh.pod|build-aux/syntax-check\.mk|docs/.*)$$
 
 exclude_file_name_regexp--sc_prohibit_virXXXFree = \
-  ^(docs/|tests/|examples/|tools/|build-aux/cfg\.mk|src/test/test_driver.c|src/libvirt_public.syms|include/libvirt/libvirt-(domain|network|nodedev|storage|stream|secret|nwfilter|interface|domain-snapshot).h|src/libvirt-(domain|qemu|network|nodedev|storage|stream|secret|nwfilter|interface|domain-snapshot).c$$)
+  ^(docs/|tests/|examples/|tools/|build-aux/syntax-check\.mk|src/test/test_driver.c|src/libvirt_public.syms|include/libvirt/libvirt-(domain|network|nodedev|storage|stream|secret|nwfilter|interface|domain-snapshot).h|src/libvirt-(domain|qemu|network|nodedev|storage|stream|secret|nwfilter|interface|domain-snapshot).c$$)
 
 exclude_file_name_regexp--sc_prohibit_sysconf_pagesize = \
-  ^(build-aux/cfg\.mk|src/util/virutil\.c)$$
+  ^(build-aux/syntax-check\.mk|src/util/virutil\.c)$$
 
 exclude_file_name_regexp--sc_prohibit_pthread_create = \
-  ^(build-aux/cfg\.mk|src/util/virthread\.c|tests/.*)$$
+  ^(build-aux/syntax-check\.mk|src/util/virthread\.c|tests/.*)$$
 
 exclude_file_name_regexp--sc_prohibit_always-defined_macros = \
   ^tests/virtestmock.c$$
@@ -1315,4 +2344,4 @@ exclude_file_name_regexp--sc_prohibit_strcmp = \
   ^(tools/nss/libvirt_nss.*\.c|tools/virt-login-shell\.c)
 
 exclude_file_name_regexp--sc_prohibit_backslash_alignment = \
-  ^build-aux/maint\.mk$$
+  ^build-aux/syntax-check\.mk$$
-- 
2.21.0

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux