maint.mk: syntax-check: prohibit HAVE_<header>_H that are always true
[pspp] / top / maint.mk
index c663bce0c871e83cd5902d888c72da6060dd8a06..159fe8310e7443ddcaff6765963c7ef9e4cb2143 100644 (file)
@@ -139,7 +139,7 @@ $(sc_z_rules_): %.z: %
        start=$$(cat .sc-start-$*);                                     \
        rm -f .sc-start-$*;                                             \
        awk -v s=$$start -v e=$$end                                     \
-         'END {printf "%.2f: $* done\n", e - s}' < /dev/null
+         '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.
@@ -645,6 +645,34 @@ sc_useless_cpp_parens:
        halt='found useless parentheses in cpp directive'               \
          $(_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_ := \
+  $(shell cd $(gnulib_dir)/lib && ls -1 *.in.h|sed 's/\.in\.h$$/ \\/')
+
+# Convert the list of names to upper case, and replace each space with "|".
+az_ = abcdefghijklmnopqrstuvwxyz
+AZ_ = ABCDEFGHIJKLMNOPQRSTUVWXYZ
+gl_header_upper_case_or_ := \
+  $(shell echo $(gl_assured_headers_)                                  \
+    | tr $(az_)/.- $(AZ_)___                                           \
+    | tr -s ' ' '|'                                                    \
+   )
+gl_have_header_regex_ = HAVE_($(gl_header_upper_case_or_))_H
+sc_prohibit_always_true_header_tests:
+       @prohibit='\<$(gl_have_header_regex_)\>'                        \
+       halt='do not test the above HAVE_<header>_H symbol(s);\n'\
+'  with the corresponding gnulib module, they are always true'         \
+         $(_sc_search_regexp)
+
+# 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 GPL.
 sc_GPL_version:
        @prohibit='either ''version [^3]'                               \
@@ -660,9 +688,10 @@ sc_GFDL_version:
          $(_sc_search_regexp)
 
 # Don't use Texinfo @acronym{} as it is not a good idea.
+texinfo_suffix_re_ ?= \.(txi|texi(nfo)?)$$
 sc_texinfo_acronym:
-       @prohibit='@acronym{'                                           \
-       in_vc_files='\.texi$$'                                          \
+       @prohibit='@acronym\{'                                          \
+       in_vc_files='$(texinfo_suffix_re_)'                             \
        halt='found use of Texinfo @acronym{}'                          \
          $(_sc_search_regexp)
 
@@ -693,16 +722,18 @@ sc_prohibit_cvs_keyword:
 #   perl -pi -0777 -e 's/\n\n+$/\n/' files...
 #
 detect_empty_lines_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 $$two;                                                          \
-    defined $$p and $$p = sysread F, $$two, 2;                         \
-    close F;                                                           \
-    $$c = "ignore read failure";                                       \
-    $$p && $$two eq "\n\n" and (print $$f), $$fail=1;                  \
-    } END { exit defined $$fail }
+  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" and (print $$f), $$fail=1;     \
+    }                                                                  \
+  END { exit defined $$fail }
 sc_prohibit_empty_lines_at_EOF:
        @perl -le '$(detect_empty_lines_at_EOF_)' $$($(VC_LIST_EXCEPT)) \
           || { echo '$(ME): the above files end with empty line(s)'     \