changeset 13329:256d057c7f1f

maint.mk: prohibit definition of symbols defined by gnulib * top/maint.mk (sc_prohibit_always-defined_macros): Reject the definition of symbols defined by gnulib.
author Jim Meyering <meyering@redhat.com>
date Sun, 09 May 2010 18:50:40 +0200
parents 1c0d89ded4f9
children fbf6aad1d20d
files ChangeLog top/maint.mk
diffstat 2 files changed, 50 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Sun May 09 18:51:48 2010 +0200
+++ b/ChangeLog	Sun May 09 18:50:40 2010 +0200
@@ -1,3 +1,9 @@
+2010-05-09  Jim Meyering  <meyering@redhat.com>
+
+	maint.mk: prohibit definition of symbols defined by gnulib
+	* top/maint.mk (sc_prohibit_always-defined_macros): Reject the
+	definition of symbols defined by gnulib.
+
 2010-05-09  Bruno Haible  <bruno@clisp.org>
 
 	acl: Avoid test failure on Cygwin-hosted mingw.
--- a/top/maint.mk	Sun May 09 18:51:48 2010 +0200
+++ b/top/maint.mk	Sun May 09 18:50:40 2010 +0200
@@ -665,6 +665,50 @@
 '  with the corresponding gnulib module, they are always true'		\
 	  $(_sc_search_regexp)
 
+# ==================================================================
+gl_other_headers_ ?= \
+  intprops.h	\
+  openat.h	\
+  stat-macros.h
+
+# Perl -lne code to extract "significant" cpp-defined symbols from a
+# gnulib header file, eliminating a few common false-positives.
+gl_extract_significant_defines_ = \
+  /^\# *define ([^_ (][^ (]*)(\s*\(|\s+\w+)/ && $$2 !~ /(?:rpl_|_used_without_)/\
+    and print $$1
+
+# Create a list of regular expressions matching the names
+# of macros that are guaranteed to be defined by parts of gnulib.
+.re-defmac:
+	@gen_h=$(gl_generated_headers_);				\
+	(cd $(gnulib_dir)/lib;						\
+	  for f in *.in.h $(gl_other_headers_); do			\
+	    perl -lne '$(gl_extract_significant_defines_)' $$f;		\
+	  done;								\
+	) | sort -u							\
+	  | grep -Ev '^ATTRIBUTE_NORETURN'				\
+	  | sed 's/^/^ *# *define /;s/$$/\\>/'				\
+	  > $@-t
+	@mv $@-t $@
+
+define gl_trap_
+  Exit () { set +e; (exit $$1); exit $$1; };				\
+  for sig in 1 2 3 13 15; do						\
+    eval "trap 'Exit $$(expr $$sig + 128)' $$sig";			\
+  done
+endef
+
+# Don't define macros that we already get from gnulib header files.
+sc_prohibit_always-defined_macros: .re-defmac
+	@if test -d $(gnulib_dir); then					\
+	  trap 'rc=$$?; rm -f .re-defmac; exit $$rc' 0;			\
+	  $(gl_trap_);							\
+	  grep -f .re-defmac $$($(VC_LIST_EXCEPT))			\
+	    && { echo '$(ME): define the above via some gnulib .h file'	\
+		  1>&2;  exit 1; } || :;				\
+	fi
+# ==================================================================
+
 # Prohibit checked in backup files.
 sc_prohibit_backup_files:
 	@$(VC_LIST) | grep '~$$' &&				\