VC_LIST = $(GIT) ls-files
VC_LIST_ALWAYS_EXCLUDE_REGEX ?= ^$$
_dot_escaped_srcdir = $(subst .,.,$(srcdir))
ifeq ($(srcdir),.) _prepend_srcdir_prefix = else _prepend_srcdir_prefix = | sed 's|^|$(srcdir)/|' endif
_sc_excl = \ $(or $(exclude_file_name_regexp--$@),^build-aux/sanity.mk$$|gnulib$$|^slingshot$$) 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)
-include $(srcdir)/$(_build-aux)/sanity-cfg.mk
_cfg_mk := $(wildcard $(srcdir)/cfg.mk)
syntax-check-rules := $(sort $(shell sed -n 's/^(sc_[a-zA-Z0-9_-]):./\1/p' \ $(srcdir)/$(ME) $(_cfg_mk) $(srcdir)/$(_build-aux)/*.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)
$(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 $@)
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
local-check := \ $(patsubst sc_%, sc_%.z, \ $(filter-out $(local-checks-to-skip), $(local-checks-available)))
syntax-check: $(local-check)
export require = export prohibit = export exclude = export in_vc_files = export in_files = export containing = export non_containing = export halt = export with_grep_options =
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
sc_avoid_if_before_free: @test -f $(srcdir)/$(_build-aux)/useless-if-before-free && \ $(srcdir)/$(_build-aux)/useless-if-before-free \ $(useless_free_options) \ $$($(VC_LIST_EXCEPT) | grep -v useless-if-before-free) && \ { echo '$(ME): found useless "if" before "free" above' 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 xalloc return value" \ $(_sc_search_regexp)
sc_cast_of_alloca_return_value: @prohibit='*) *alloca>' \ halt="don't cast alloca return value" \ $(_sc_search_regexp)
sc_space_tab: @prohibit='[ ] ' \ halt='found SPACE-TAB sequence; remove the SPACE' \ $(_sc_search_regexp)
sc_prohibit_atoi_atof: @prohibit='\<([fs]?scanf|ato([filq]|ll)) (' \ halt='do not use scan''f, ato''f, ato''i, ato''l, ato''ll or ato''q' \ $(_sc_search_regexp)
sp_ = strcmp (.+) sc_prohibit_strcmp: @prohibit='! strcmp (|\<$(sp_) [!=]=|[!=]= $(sp_)' \ exclude='# define STRN?EQ(' \ halt='replace strcmp calls above with STREQ/STRNEQ' \ $(_sc_search_regexp)
sc_prohibit_strncpy: @prohibit='\<strncpy ( [^)]' \ halt='do not use strncpy, period' \ $(_sc_search_regexp)
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)
sc_error_exit_success: @prohibit='error *(EXIT_SUCCESS,' \ in_vc_files='.[chly]$$' \ halt='found error (EXIT_SUCCESS' \ $(_sc_search_regexp)
sc_error_message_warn_fatal: @grep -nEA2 '[^rp]error *(' $$($(VC_LIST_EXCEPT)) \ | grep -E '"Warning|"Fatal|"fatal' && \ { echo '$(ME): use FATAL, WARNING or warning' 1>&2; \ exit 1; } || :
sc_error_message_uppercase: @grep -nEA2 '[^rp]error *(' $$($(VC_LIST_EXCEPT)) \ | grep -E '"[A-Z]' \ | grep -vE '"FATAL|"WARNING|"Java|"C#|PRIuMAX' && \ { echo '$(ME): found capitalized error message' 1>&2; \ exit 1; } || :
sc_error_message_period: @grep -nEA2 '[^rp]error *(' $$($(VC_LIST_EXCEPT)) \ | grep -E '[^."]."' && \ { echo '$(ME): found error message ending in period' 1>&2; \ exit 1; } || :
sc_file_system: @prohibit=file''system \ ignore_case=1 \ halt='found use of "file''system"; spell it "file system"' \ $(_sc_search_regexp)
sc_makefile: @prohibit=make''flie \ ignore_case=1 \ halt='found misspelled "make''flie"; use "makefile" instead' \ $(_sc_search_regexp)
sc_prohibit_have_config_h: @prohibit='^# if.HAVE''_CONFIG_H' \ halt='found use of HAVE''_CONFIG_H; remove' \ $(_sc_search_regexp)
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)
sc_require_config_h_first: @if $(VC_LIST_EXCEPT) | grep -l '.c$$' > /dev/null; then \ fail=0; \ for i in $$($(VC_LIST_EXCEPT) | grep '.c$$'); do \ grep '^# include>' $$i | sed 1q \ | grep -E '^# include $(config_h_header)' > /dev/null \ || { echo $$i; fail=1; }; \ done; \ test $$fail = 1 && \ { 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)
define _sc_header_without_use
dummy=; : so we do not need a semicolon before each use; \
h_esc=echo '[<"]'"$$h"'[">]'|sed 's/\./\\\\./g'
; \
if $(VC_LIST_EXCEPT) | grep -l '.c$$' > /dev/null; then \
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
sc_prohibit_assert_without_use: @h='assert.h' re='\<assert *(' $(_sc_header_without_use)
sc_prohibit_close_stream_without_use: @h='close-stream.h' re='\<close_stream *(' $(_sc_header_without_use)
sc_prohibit_getopt_without_use: @h='getopt.h' re='\<getopt(_long)? *(' $(_sc_header_without_use)
sc_prohibit_quotearg_without_use: @h='quotearg.h' re='\<quotearg(_[^ ]+)? *(' $(_sc_header_without_use)
sc_prohibit_quote_without_use: @h='quote.h' re='\<quote((_n)? *(|_quoting_options>)' \ $(_sc_header_without_use)
sc_prohibit_long_options_without_use: @h='long-options.h' re='\<parse_long_options *(' \ $(_sc_header_without_use)
sc_prohibit_inttostr_without_use: @h='inttostr.h' re='\<(off|[iu]max|uint)tostr *(' \ $(_sc_header_without_use)
sc_prohibit_ignore_value_without_use: @h='ignore-value.h' re='\<ignore_(value|ptr) *(' \ $(_sc_header_without_use)
sc_prohibit_error_without_use: @h='error.h' \ re='\<error(_at_line|_print_progname|_one_per_line|_message_count)? *('\ $(_sc_header_without_use)
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)
hash_re = \ clear|delete|free|get(first|next)|insert|lookup|print_statistics|reset_tuning hash_fn = \<($(_hash_re)) *( _hash_struct = (struct )?\<[Hh]ash(table|tuning)> sc_prohibit_hash_without_use: @h='hash.h' \ re='$(_hash_fn)|$(_hash_struct)'\ $(_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 *(' $(_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)>' \ $(_sc_header_without_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)
_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)))
_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
_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)))
sc_prohibit_signal_without_use: @h='signal.h' \ re='\<($(_sig_function_re)) *(|\<($(_sig_syms_re))>' \ $(_sc_header_without_use)
sc_prohibit_stdio--_without_use: @h='stdio--.h' re='\<((f(re)?|p)open|tmpfile) *(' \ $(_sc_header_without_use)
sc_prohibit_stdio-safer_without_use: @h='stdio-safer.h' re='\<((f(re)?|p)open|tmpfile)_safer *(' \ $(_sc_header_without_use)
sc_prohibit_strings_without_use: @h='strings.h' \ re='\<(strn?casecmp|ffs(ll)?)>' \ $(_sc_header_without_use)
_intprops_names = \ TYPE_IS_INTEGER TYPE_TWOS_COMPLEMENT TYPE_ONES_COMPLEMENT \ TYPE_SIGNED_MAGNITUDE TYPE_SIGNED TYPE_MINIMUM TYPE_MAXIMUM \ INT_BITS_STRLEN_BOUND INT_STRLEN_BOUND INT_BUFSIZE_BOUND \ INT_ADD_RANGE_OVERFLOW INT_SUBTRACT_RANGE_OVERFLOW \ INT_NEGATE_RANGE_OVERFLOW INT_MULTIPLY_RANGE_OVERFLOW \ INT_DIVIDE_RANGE_OVERFLOW INT_REMAINDER_RANGE_OVERFLOW \ INT_LEFT_SHIFT_RANGE_OVERFLOW INT_ADD_OVERFLOW INT_SUBTRACT_OVERFLOW \ INT_NEGATE_OVERFLOW INT_MULTIPLY_OVERFLOW INT_DIVIDE_OVERFLOW \ INT_REMAINDER_OVERFLOW INT_LEFT_SHIFT_OVERFLOW _intprops_syms_re = $(subst $(_sp),|,$(strip $(_intprops_names)))
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
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)
sc_prohibit_dirent_without_use: @h='dirent.h' \ re='\<($(_dirent_syms_re))>' \ $(_sc_header_without_use)
sc_prohibit_verify_without_use: @h='verify.h' \ re='\<(verify(true|expr)?|static_assert) *(' \ $(_sc_header_without_use)
sc_prohibit_xfreopen_without_use: @h='xfreopen.h' re='\<xfreopen *(' $(_sc_header_without_use)
sc_obsolete_symbols: @prohibit='\<(HAVE''_FCNTL_H|O''_NDELAY)>' \ halt='do not use HAVE''_FCNTL_H or O'_NDELAY \ $(_sc_search_regexp)
sc_changelog: @prohibit='^[^12 ]' \ in_vc_files='^ChangeLog$$' \ halt='found unexpected prefix in a ChangeLog' \ $(_sc_search_regexp)
sc_program_name: @require='set_program_name (m?argv[0]);' \ in_vc_files='.c$$' \ containing='\<main (' \ halt='the above files do not call set_program_name' \ $(_sc_search_regexp)
sc_bindtextdomain: @require='bindtextdomain (' \ in_vc_files='.c$$' \ containing='\<main (' \ halt='the above files do not call bindtextdomain' \ $(_sc_search_regexp)
Exit_witness_file ?= tests/test-lib.sh Exit_base := $(notdir $(Exit_witness_file)) sc_require_test_exit_idiom: @if test -f $(srcdir)/$(Exit_witness_file); then \ die=0; \ for i in $$(grep -l -F 'srcdir/$(Exit_base)' \ $$($(VC_LIST) tests)); do \ tail -n1 $$i | grep '^Exit .' > /dev/null \ && : || { die=1; echo $$i; } \ done; \ test $$die = 1 && \ { echo 1>&2 '$(ME): the final line in each of the above is not:'; \ echo 1>&2 'Exit something'; \ exit 1; } || :; \ fi
sc_trailing_blank: @prohibit='[ ]$$' \ halt='found trailing blank(s)' \ exclude='^Binary file .* matches$$' \ $(_sc_search_regexp)
longopt_re = --[a-z][0-9A-Za-z-]([?=[0-9A-Za-z-]]?)? sc_two_space_separator_in_usage: @prohibit='^ (-[A-Za-z],)? $(longopt_re) [^ ].\$$' \ halt='help2man requires at least two spaces between an option and its description'\ $(_sc_search_regexp)
gl_translatable_diag_func_re ?= error
sc_unmarked_diagnostics: @prohibit='\<$(gl_translatable_diag_func_re) ([^"]"[^"]*[a-z]{3}' \ exclude='(|ngettext ?)(' \ halt='found unmarked diagnostic(s)' \ $(_sc_search_regexp)
sc_useless_cpp_parens: @prohibit='^# if .defined *(' \ halt='found useless parentheses in cpp directive' \ $(_sc_search_regexp)
gl_assured_headers_ = \ cd $(gnulib_dir)/lib && echo *.in.h|sed 's/.in.h//g'
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='#[ ]if(n?def|.\<defined)>[ (]+HAVE_DECL_' \ halt='HAVE_DECL macros are always defined' \ $(_sc_search_regexp)
gl_other_headers_ ?= \ intprops.h \ openat.h \ stat-macros.h
gl_extract_significant_defines_ = \ /^# define ([^_ (][^ (])(\s*(|\s+\w+)/\ && $$2 !~ /(?:rpl_|used_without)/\ && $$1 !~ /^(?:NSIG|ENODATA)$$/\ && $$1 !~ /^(?:SA_RESETHAND|SA_RESTART)$$/\ and print $$1
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
sc_prohibit_always-defined_macros: @if test -d $(gnulib_dir); then \ case $$(echo all: | grep -l -f - Makefile) in Makefile);; *) \ echo '$(ME): skipping $@: you lack GNU grep' 1>&2; exit 0;; \ esac; \ $(def_sym_regex) | grep -E -f - $$($(VC_LIST_EXCEPT)) \ && { echo '$(ME): define the above via some gnulib .h file' \ 1>&2; exit 1; } || :; \ fi
sc_prohibit_backup_files: @$(VC_LIST) | grep '~$$' && \ { echo '$(ME): found version controlled backup file' 1>&2; \ exit 1; } || :
sc_GPL_version: @prohibit='either ''version [^3]' \ halt='GPL vN, N!=3' \ $(_sc_search_regexp)
_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)
texinfo_suffix_re_ ?= .(txi|texi(nfo)?)$$ sc_texinfo_acronym: @prohibit='@acronym{' \ in_vc_files='$(texinfo_suffix_re_)' \ halt='found use of Texinfo @acronym{}' \ $(_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)
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: @perl -le '$(require_exactly_one_NL_at_EOF_)' $$($(VC_LIST_EXCEPT)) \ || { echo '$(ME): empty line(s) or no newline at EOF' \ 1>&2; exit 1; } || :
sc_prohibit_stat_st_blocks: @prohibit='[.>]st_blocks' \ halt='do not use st_blocks; use ST_NBLOCKS' \ $(_sc_search_regexp)
sc_prohibit_S_IS_definition: @prohibit='^ # define S_IS' \ halt='do not define S_IS macros; include <sys/stat.h>' \ $(_sc_search_regexp)
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_)
ignore_doubled_word_match_RE_ ?= ^$$
sc_prohibit_doubled_word: @perl -n -0777 $(prohibit_doubled_word_) $$($(VC_LIST_EXCEPT)) \ | grep -vE '$(ignore_doubled_word_match_RE_)' \ | grep . && { echo '$(ME): doubled words' 1>&2; exit 1; } || :
bad_xref_re_ ?= (?:[\w,:;] +|(?:see|also)\s+)\@xref{ bad_pxref_re_ ?= (?:[.!?]|(?:see|also))\s+\@pxref{ prohibit_undesirable_word_seq_RE_ ?= \ /(?:\bcan\s+not\b|$(bad_xref_re_)|$(bad_pxref_re_))/gims prohibit_undesirable_word_seq_ = \ -e 'while ($(prohibit_undesirable_word_seq_RE_))' \ $(perl_filename_lineno_text_)
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"
sc_prohibit_test_minus_ao: @prohibit='(\<test| [+) .+ -[ao] ' \ halt='$(_ptm1); $(_ptm2)' \ $(_sc_search_regexp)
sc_prohibit_test_double_equal: @prohibit='(\<test| [+) .+ == ' \ containing='#! /bin/[a-z]sh' \ halt='use "test x = x", not "test x =''= x"' \ $(_sc_search_regexp)
sc_proper_name_utf8_requires_ICONV: @progs=$$(grep -l 'proper_name_utf8 ''("' $$($(VC_LIST_EXCEPT)));\ 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
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)
sc_immutable_NEWS: @if test -f $(srcdir)/NEWS; then \ test "$(NEWS_hash)" = '$(old_NEWS_hash)' && : || \ { echo '$(ME): you have modified old NEWS' 1>&2; exit 1; }; \ fi
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'
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; \
files=; \
for file in $$($(VC_LIST_EXCEPT)) $(generated_files); do \
test -r $$file || continue; \
case $$file in \
.m4|.mk) continue ;; \
.?|.??) ;; \
) continue;; \
esac; \
case $$file in \
*.[ch]) \
base=expr " $$file" : ' \(.*\)\..'
; \
{ test -f $$base.l || test -f $$base.y; } && continue;; \
esac; \
files="$$files $$file"; \
done; \
grep -E -l '$(_gl_translatable_string_re)' $$files \
| 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
msg = 'Do not use ":" above; use $$(PATH_SEPARATOR) instead' sc_makefile_path_separator_check: @prohibit='PATH[=].*:' \ in_vc_files='akefile|.mk$$' \ halt=$(msg) \ $(_sc_search_regexp)
v_etc_file = $(gnulib_dir)/lib/version-etc.c sample-test = tests/sample-test texi = doc/$(PACKAGE).texi
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)' Free' \ in_vc_files=$(texi) \ halt='out of date copyright in $(texi); update it' \ $(_sc_search_regexp)
sc_Wundef_boolean: @prohibit='^#define.*(yes|no|true|false)$$' \ in_files='$(CONFIG_INCLUDE)' \ halt='Use 0 or 1 for macro values' \ $(_sc_search_regexp)
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 http://bugzilla.redhat.com/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 http://bugzilla.redhat.com/CVE-2012-3386 for details') \ $(_sc_search_regexp)
EXTRA_DIST += \ $(_build-aux)/sanity.mk \ $(NOTHING_ELSE)