+# Checks that don't require cvs.
+# Run `changelog-check' last, as previous test may reveal problems requiring
+# new ChangeLog entries.
+local-checks-available = \
+ po-check copyright-check writable-files m4-check author_mark_check \
+ changelog-check strftime-check syntax-check makefile_path_separator_check \
+ makefile-check
+.PHONY: $(local-checks-available)
+
+local-check = $(filter-out $(local-checks-to-skip), $(local-checks-available))
+
+# Make sure C source files in src/ don't include xalloc.h directly,
+# since they all already include it via sys2.h.
+# It's not a big deal -- just aesthetics.
+.PHONY: $(syntax-check-rules)
+syntax-check-rules = \
+ sc_cast_of_argument_to_free \
+ sc_cast_of_x_alloc_return_value \
+ sc_changelog \
+ sc_error_exit_success \
+ sc_space_tab \
+ sc_sun_os_names \
+ sc_system_h_headers \
+ sc_unmarked_diagnostics \
+ sc_xalloc_h_in_src
+
+syntax-check: $(syntax-check-rules)
+# @grep -E '# *include <(limits|std(def|arg|bool))\.h>' \
+# $$(find -type f -name '*.[chly]') && \
+# { echo '$(ME): found conditional include' 1>&2; \
+# exit 1; } || :
+
+# grep -E '^# *include <(string|stdlib)\.h>' \
+# $(srcdir)/{lib,src}/*.[chy] && \
+# { echo '$(ME): FIXME' 1>&2; \
+# exit 1; } || :
+# FIXME: don't allow `#include .strings\.h' anywhere
+
+# 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:
+ @grep --exclude=$(srcdir)/src/shred.c -E \
+ '\<error \([^"]*"[^"]*[a-z]{3}' $(srcdir)/{lib,src}/*.c \
+ | grep -v '_(' && \
+ { echo '$(ME): found unmarked diagnostic(s)' 1>&2; \
+ exit 1; } || :
+
+sc_cast_of_argument_to_free:
+ @grep -E '\<free \(\(' $(srcdir)/{lib,src}/*.[chly] && \
+ { echo '$(ME): don'\''t cast free argument' 1>&2; \
+ exit 1; } || :
+
+sc_cast_of_x_alloc_return_value:
+ @grep -E --exclude=$(srcdir)/lib/regex.c \
+ '\*\) *x(m|c|re)alloc\>' $(srcdir)/{lib,src}/*.[chy] && \
+ { echo '$(ME): don'\''t cast x*alloc return value' 1>&2; \
+ exit 1; } || :
+
+sc_space_tab:
+ @( cvsu --list ) > /dev/null 2>&1 || : && \
+ grep '[ ] ' \
+ $$(cvsu --list | grep -vEf .x-$@ ) && \
+ { echo '$(ME): found SPACE-TAB sequence; remove the SPACE' \
+ 1>&2; exit 1; } || :
+
+# Using EXIT_SUCCESS as the first argument to error is misleading,
+# since when that parameter is 0, error does not exit. Use `0' instead.
+sc_error_exit_success:
+ @grep -F 'error (EXIT_SUCCESS,' \
+ $$(find -type f -name '*.[chly]') && \
+ { echo '$(ME): found error (EXIT_SUCCESS' 1>&2; \
+ exit 1; } || :
+
+# FIXME: merge this with sc_system_h_headers below.
+# xalloc.h is included via system.h, so should not be included
+# directly by any file in src/.
+sc_xalloc_h_in_src:
+ @if test -f $(srcdir)/src/sys2.h; then \
+ if grep 'xalloc\.h' $(srcdir)/src/*.c; then \
+ exit 1; \
+ fi; \
+ fi
+
+# FIXME: warn about definitions of EXIT_FAILURE, EXIT_SUCCESS, STREQ
+
+# Each nonempty line must start with a year number, or a TAB.
+sc_changelog:
+ @grep '^[^12 ]' $$(find . -name ChangeLog -maxdepth 2) && \
+ { echo '$(ME): found unexpected prefix in a ChangeLog' 1>&2; \
+ exit 1; } || :
+
+header_regexp = \
+ alloca\
+ |closeout\
+ |ctype\
+ |dirent\
+ |errno\
+ |fcntl\
+ |inttypes\
+ |limits\
+ |locale\
+ |pathmax\
+ |std(lib|bool)\
+ |string\
+ |sys/(stat|dir|time)\
+ |time\
+ |unistd\
+ |utime\
+ |version-etc\
+ |xalloc
+h_re := $(shell echo '$(header_regexp)'|tr -d ' ')
+
+# Files in src/ should not include directly any of
+# the headers already included via system.h.
+# Get list of candidates with this:
+# grep -h include src/sys*.h|sed 's/.*include //'|sort -
+sc_system_h_headers:
+ @( cvsu --list ) > /dev/null 2>&1 || : && \
+ grep -E '^# *include ["<]($(h_re))\.h[">]' \
+ $$(cvsu --list src | grep -Ev 'sys(2|tem)\.h$$') \
+ && { echo '$(ME): the above are already included via system.h'\
+ 1>&2; exit 1; } || :
+
+sc_sun_os_names:
+ @( cvsu --list ) > /dev/null 2>&1 || : && \
+ grep -Ei \
+ 'solaris[^[:alnum:]]*2\.(7|8|9|[1-9][0-9])|sunos[^[:alnum:]][6-9]' \
+ $$(cvsu --list | grep -vEf .x-$@ ) && \
+ { echo '$(ME): found misuse of Sun OS version numbers' 1>&2; \
+ exit 1; } || :
+
+# Ensure that date's --help output stays in sync with the info
+# documentation for GNU strftime. The only exception is %N,
+# which date accepts but GNU strftime does not.
+extract_char = sed 's/^[^%][^%]*%\(.\).*/\1/'
+strftime-check:
+ if test -f $(srcdir)/src/date.c; then \
+ grep '^ %. ' $(srcdir)/src/date.c | sort \
+ | $(extract_char) > $@-src; \
+ { echo N; \
+ info libc date calendar format | grep '^ `%.'\' \
+ | $(extract_char); } | sort > $@-info; \
+ diff -u $@-src $@-info || exit 1; \
+ rm -f $@-src $@-info; \
+ fi
+
+# 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.
+makefile-check:
+ grep -E '@[A-Z_0-9]+@' `find . -name Makefile.am` \
+ && { echo 'Makefile.maint: use $(...), not @...@' 1>&2; exit 1; } || :