# Do not save the original name or timestamp in the .tar.gz file.
# Use --rsyncable if available.
-GZIP_ENV = \
- "--no-name --best$$( \
- case $$(gzip --help) in \
- (*--rsyncable*) echo ' --rsyncable';; \
- esac \
- )"
+gzip_rsyncable = \
+ (gzip --help|grep rsyncable) >/dev/null 2>&1 && echo --rsyncable
+GZIP_ENV = "--no-name --best `$(gzip_rsyncable)`"
CVS = cvs
# 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 \
+ changelog-check strftime-check $(syntax-check-rules) \
+ makefile_path_separator_check \
makefile-check
.PHONY: $(local-checks-available)
sc_sun_os_names \
sc_system_h_headers \
sc_tight_scope \
- sc_trailing_space \
+ sc_trailing_blank \
+ sc_two_space_separator_in_usage \
sc_unmarked_diagnostics \
sc_useless_cpp_parens
# They provide no error checking mechanism.
# Instead, use strto* functions.
sc_prohibit_atoi_atof:
- @grep -nE '\<(ato[filq]|ato''ll)\>' $$($(CVS_LIST_EXCEPT)) && \
+ @grep -nE '\<ato([filq]|ll)\>' $$($(CVS_LIST_EXCEPT)) && \
{ echo '$(ME): do not use ato''f, ato''i, ato''l, ato''ll, or ato''q' \
1>&2; exit 1; } || :
'rewrite to use "file system"' 1>&2; \
exit 1; } || :
+sc_no_if_have_config_h:
+ @grep -n '^# *if HAVE_CONFIG_H' $$($(CVS_LIST_EXCEPT)) && \
+ { echo '$(ME): found use of #if HAVE_CONFIG_H; use #ifdef' \
+ 1>&2; exit 1; } || :
+
+# Nearly all .c files must include <config.h>.
+sc_require_config_h:
+ @grep -L '^# *include <config\.h>' \
+ $$($(CVS_LIST_EXCEPT) | grep '\.c$$') \
+ | grep . && \
+ { echo '$(ME): the above files do not include <config.h>' \
+ 1>&2; exit 1; } || :
+
+# Prohibit the inclusion of assert.h without an actual use of assert.
+sc_prohibit_assert_without_use:
+ @files=$$(grep -l '# *include <assert\.h>' \
+ $$($(CVS_LIST_EXCEPT) | grep '\.c$$')) && \
+ grep -L '\<assert (' $$files \
+ | grep . && \
+ { echo "$(ME): the above files include <assert.h> but don't use it" \
+ 1>&2; exit 1; } || :
+
sc_obsolete_symbols:
- @grep -nE '\<(\<(HAVE_FCNTL_H|O_NDELAY)\>' \
+ @grep -nE '\<(HAVE''_FCNTL_H|O''_NDELAY)\>' \
$$($(CVS_LIST_EXCEPT)) && \
- { echo '$(ME): do not use HAVE_FCNTL_H or O_NDELAY' \
+ { echo '$(ME): do not use HAVE''_FCNTL_H or O''_NDELAY' \
1>&2; exit 1; } || :
# FIXME: warn about definitions of EXIT_FAILURE, EXIT_SUCCESS, STREQ
dd_c = $(srcdir)/src/dd.c
sc_dd_max_sym_length:
ifneq ($(wildcard $(dd_c)),)
- @test -f $(dd_c) || exit 0; \
- len=$$( (sed -n '/conversions\[\] =$$/,/^};/p' $(dd_c); \
+ @len=$$( (sed -n '/conversions\[\] =$$/,/^};/p' $(dd_c);\
sed -n '/flags\[\] =$$/,/^};/p' $(dd_c) ) \
|sed -n '/"/s/^[^"]*"\([^"]*\)".*/\1/p' \
- | wc --max-line-length); \
+ | wc --max-line-length); \
max=$$(sed -n '/^#define LONGEST_SYMBOL /s///p' $(dd_c) \
|tr -d '"' | wc --max-line-length); \
if test "$$len" = "$$max"; then :; else \
# Files in src/ should not include directly any of
# the headers already included via system.h.
sc_system_h_headers: .re-list
- if test -f $(srcdir)/src/system.h; then \
+ @if test -f $(srcdir)/src/system.h; then \
trap 'rc=$$?; rm -f .re-list; exit $$rc' 0 1 2 3 15; \
grep -nE -f .re-list \
$$($(CVS_LIST) src | \
sc_tight_scope:
$(MAKE) -C src $@
-sc_trailing_space:
+sc_trailing_blank:
@grep -n '[ ]$$' $$($(CVS_LIST_EXCEPT)) && \
- { echo '$(ME): found trailing space(s)' \
+ { echo '$(ME): found trailing blank(s)' \
+ 1>&2; exit 1; } || :
+
+sc_two_space_separator_in_usage:
+ @grep -n '^ *--[a-z][0-9A-Za-z-]* [^ ].*\\$$' \
+ $$($(CVS_LIST_EXCEPT)) && \
+ { echo "$(ME): help2man requires at least two spaces between"; \
+ echo "$(ME): an option and its description"; \
1>&2; exit 1; } || :
# Look for diagnostics that aren't marked for translation.
sc_unmarked_diagnostics:
@grep -nE \
'\<error \([^"]*"[^"]*[a-z]{3}' $$($(CVS_LIST_EXCEPT)) \
- | grep -v '_(' && \
+ | grep -v '_''(' && \
{ echo '$(ME): found unmarked diagnostic(s)' 1>&2; \
exit 1; } || :
# Avoid useless parentheses like those in this example:
# #if defined (SYMBOL) || defined (SYM2)
sc_useless_cpp_parens:
- @grep '^# *if .*defined *(' $$($(CVS_LIST_EXCEPT)) && \
+ @grep -n '^# *if .*defined *(' $$($(CVS_LIST_EXCEPT)) && \
{ echo '$(ME): found useless parentheses in cpp directive' \
1>&2; exit 1; } || :
fi
changelog-check:
- if grep 'Version $(VERSION_REGEXP)\.$$' ChangeLog \
+ if head ChangeLog | grep 'Version $(VERSION_REGEXP)\.$$' \
>/dev/null; then \
:; \
else \
fi
m4-check:
- @grep 'AC_DEFUN([^[]' m4/*.m4 \
+ @grep -n 'AC_DEFUN([^[]' m4/*.m4 \
&& { echo 'Makefile.maint: quote the first arg to AC_DEFUN' 1>&2; \
exit 1; } || :
# Verify that all source files using _() are listed in po/POTFILES.in.
-# FIXME: don't hard-code src/false.c below; use a more general mechanism.
+# FIXME: don't hard-code file names below; use a more general mechanism.
po-check:
if test -f po/POTFILES.in; then \
grep -E -v '^(#|$$)' po/POTFILES.in \
| grep -v '^src/false\.c$$' | sort > $@-1; \
files=; \
- for file in lib/*.[chly] src/*.[chly]; do \
+ for file in $$($(CVS_LIST_EXCEPT)) lib/*.[ch]; do \
+ case $$file in \
+ djgpp/* | man/*) continue;; \
+ esac; \
case $$file in \
*.[ch]) \
base=`expr " $$file" : ' \(.*\)\..'`; \
esac; \
files="$$files $$file"; \
done; \
- grep -E -l '\bN?_\([^)"]*("|$$)' $$files | sort > $@-2; \
+ grep -E -l '\bN?_\([^)"]*("|$$)' $$files | sort -u > $@-2; \
diff -u $@-1 $@-2 || exit 1; \
rm -f $@-1 $@-2; \
fi
WGET = wget
WGETFLAGS = -C off
-tgz-md5 = $(shell md5sum < $(my_distdir).tar.gz|sed 's/ -//')
-tgz-sha1 = $(shell sha1sum < $(my_distdir).tar.gz|sed 's/ -//')
-bz2-md5 = $(shell md5sum < $(my_distdir).tar.bz2|sed 's/ -//')
-bz2-sha1 = $(shell sha1sum < $(my_distdir).tar.bz2|sed 's/ -//')
-xdelta-md5 = $(shell md5sum < $(xd-delta)|sed 's/ -//')
-xdelta-sha1 = $(shell sha1sum < $(xd-delta)|sed 's/ -//')
-tgz-size = $(shell du --human $(my_distdir).tar.gz|sed 's/\([MkK]\).*/ \1B/')
-bz2-size = $(shell du --human $(my_distdir).tar.bz2|sed 's/\([MkK]\).*/ \1B/')
-xd-size = $(shell du --human $(xd-delta)|sed 's/\([MkK]\).*/ \1B/')
-
rel-check:
tarz=/tmp/rel-check-tarz-$$$$; \
md5_tmp=/tmp/rel-check-md5-$$$$; \