X-Git-Url: https://erislabs.net/gitweb/?a=blobdiff_plain;f=top%2Fmaint.mk;h=c838516e548e983f8e9d3973fce60cd25568e018;hb=c9ff025783e5374226ffbf7940f40ce7db6852ed;hp=793915cc7f036930373cde8f1ed88082afd36472;hpb=811627be3732ccbdaaea86b0dafdda1748375671;p=gnulib.git diff --git a/top/maint.mk b/top/maint.mk index 793915cc7..c838516e5 100644 --- a/top/maint.mk +++ b/top/maint.mk @@ -568,6 +568,16 @@ sc_prohibit_signal_without_use: 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: @@ -595,6 +605,10 @@ sc_prohibit_stddef_without_use: re='\<($(_stddef_syms_re)) *\(' \ $(_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='\' \ halt='do not use HAVE''_FCNTL_H or O'_NDELAY \ @@ -646,12 +660,6 @@ sc_require_test_exit_idiom: exit 1; } || :; \ fi -sc_the_the: - @prohibit='\' \ - ignore_case=1 \ - halt='found use of "the ''the";' \ - $(_sc_search_regexp) - sc_trailing_blank: @prohibit='[ ]$$' \ halt='found trailing blank(s)' \ @@ -840,16 +848,21 @@ sc_prohibit_S_IS_definition: halt='do not define S_IS* macros; include ' \ $(_sc_search_regexp) -prohibit_doubled_word_RE_ ?= \ - /\b(then?|[iao]n|i[fst]|but|f?or|at|and|[dt]o)\s+\1\b/gims -prohibit_doubled_word_ = \ - -e 'while ($(prohibit_doubled_word_RE_))' \ +# 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_word_RE_ ?= \ + /\b(then?|[iao]n|i[fst]|but|f?or|at|and|[dt]o)\s+\1\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. @@ -860,10 +873,24 @@ sc_prohibit_doubled_word: | grep -vE '$(ignore_doubled_word_match_RE_)' \ | grep . && { echo '$(ME): doubled words' 1>&2; exit 1; } || : -sc_prohibit_can_not: - @prohibit='\' \ - halt='use "cannot", not "can'' not"' \ - $(_sc_search_regexp) +# A regular expression matching undesirable combinations of words like +# "can not"; this matches them even when the two words appear on different +# lines, but not when there is an intervening delimiter like "#" or "*". +prohibit_undesirable_word_seq_RE_ ?= \ + /\bcan\s+not\b/gims +prohibit_undesirable_word_seq_ = \ + -e 'while ($(prohibit_undesirable_word_seq_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_undesirable_word_sequence_RE_ ?= ^$$ + +sc_prohibit_undesirable_word_seq: + @perl -n -0777 $(prohibit_undesirable_word_seq_) \ + $$($(VC_LIST_EXCEPT)) \ + | grep -vE '$(ignore_undesirable_word_sequence_RE_)' | grep . \ + && { echo '$(ME): undesirable word sequence' >&2; exit 1; } || : _ptm1 = use "test C1 && test C2", not "test C1 -''a C2" _ptm2 = use "test C1 || test C2", not "test C1 -''o C2" @@ -1334,8 +1361,8 @@ _gl_TS_dir ?= src ALL_RECURSIVE_TARGETS += sc_tight_scope sc_tight_scope: tight-scope.mk @grep noinst_HEADERS $(_gl_TS_dir)/Makefile.am > /dev/null 2>&1 \ - && $(MAKE) -s -C $(_gl_TS_dir) \ - -f Makefile -f '$(abs_srcdir)/tight-scope.mk' $@-0 \ + && $(MAKE) -s -C $(_gl_TS_dir) -f Makefile \ + -f '$(abs_srcdir)/tight-scope.mk' _gl_tight_scope \ || : @rm -f $< @@ -1349,17 +1376,29 @@ ifeq (a,b) # Most functions should have static scope. # Any that don't must be marked with `extern', but `main' # and `usage' are exceptions: they're always extern, but -# do not need to be marked. +# do not need to be marked. Symbols matching `__.*' are +# reserved by the compiler, so are automatically excluded below. _gl_TS_unmarked_extern_functions ?= main usage -_gl_TS_function_regex ?= \ - ^(?:extern|XTERN) +(?:void|(?:struct |const |enum )?\S+) +\**(\S+) +\( +_gl_TS_function_match ?= \ + /^(?:extern|XTERN) +(?:void|(?:struct |const |enum )?\S+) +\**(\S+) +\(/ # The second nm|grep checks for file-scope variables with `extern' scope. # Without gnulib's progname module, you might put program_name here. +# Symbols matching `__.*' are reserved by the compiler, +# so are automatically excluded below. _gl_TS_unmarked_extern_vars ?= -_gl_TS_var_regex ?= ^(?:extern|XTERN) .*?\**(\w+)(\[.*?\])?; -.PHONY: sc_tight_scope-0 -sc_tight_scope-0: $(bin_PROGRAMS) + +# NOTE: the _match variables are perl expressions -- not mere regular +# expressions -- so that you can extend them to match other patterns +# and easily extract matched variable names. +# For example, if your project declares some global variables via +# a macro like this: GLOBAL(type, var_name, initializer), then you +# can override this definition to automatically extract those names: +# export _gl_TS_var_match = \ +# /^(?:extern|XTERN) .*?\**(\w+)(\[.*?\])?;/ || /\bGLOBAL\(.*?,\s*(.*?),/ +_gl_TS_var_match ?= /^(?:extern|XTERN) .*?\**(\w+)(\[.*?\])?;/ +.PHONY: _gl_tight_scope +_gl_tight_scope: $(bin_PROGRAMS) t=exceptions-$$$$; \ trap 's=$$?; rm -f $$t; exit $$s' 0; \ for sig in 1 2 3 13 15; do \ @@ -1369,17 +1408,17 @@ sc_tight_scope-0: $(bin_PROGRAMS) test -f $$f && d= || d=$(srcdir)/; echo $$d$$f; done`; \ hdr=`for f in $(noinst_HEADERS); do \ test -f $$f && d= || d=$(srcdir)/; echo $$d$$f; done`; \ - ( printf '^%s$$\n' $(_gl_TS_unmarked_extern_functions); \ + ( printf '^%s$$\n' '__.*' $(_gl_TS_unmarked_extern_functions); \ grep -h -A1 '^extern .*[^;]$$' $$src \ | grep -vE '^(extern |--)' | sed 's/ .*//'; \ - perl -lne '/$(_gl_TS_function_regex)/' \ + perl -lne '$(_gl_TS_function_match)' \ -e 'and print $$1' $$hdr; \ ) | sort -u | sed 's/^/^/;s/$$/$$/' > $$t; \ nm -e *.$(OBJEXT) | sed -n 's/.* T //p' | grep -Ev -f $$t \ && { echo the above functions should have static scope >&2; \ exit 1; } || : ; \ - ( printf '^%s$$\n' $(_gl_TS_unmarked_extern_vars); \ - perl -lne '/$(_gl_TS_var_regex)/ and print "^$$1\$$"' \ + ( printf '^%s$$\n' '__.*' $(_gl_TS_unmarked_extern_vars); \ + perl -lne '$(_gl_TS_var_match) and print "^$$1\$$"' \ $$hdr *.h ) | sort -u > $$t; \ nm -e *.$(OBJEXT) | sed -n 's/.* [BCDGRS] //p' \ | sort -u | grep -Ev -f $$t \