changeset 18353:f5ee80c41809

maint.mk: speed up require_config_h_first Instead of spawning three processes per file, rewrite the check in perl and run it once for all the files. * top/maint.mk (perl_config_h_first_): Define. (sc_require_config_h_first): Use it in place of shell code.
author Ján Tomko <jtomko@redhat.com>
date Tue, 26 Jul 2016 16:28:16 +0200
parents c397b02b9e03
children 7d41849f49e3
files ChangeLog top/maint.mk
diffstat 2 files changed, 24 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Fri Jul 29 22:39:31 2016 -0700
+++ b/ChangeLog	Tue Jul 26 16:28:16 2016 +0200
@@ -1,3 +1,11 @@
+2016-07-30  Ján Tomko  <jtomko@redhat.com>
+
+	maint.mk: speed up require_config_h_first
+	Instead of spawning three processes per file,
+	rewrite the check in perl and run it once for all the files.
+	* top/maint.mk (perl_config_h_first_): Define.
+	(sc_require_config_h_first): Use it in place of shell code.
+
 2016-07-26  Ján Tomko  <jtomko@redhat.com>
 
 	maint.mk: speed up sc_po_check
--- a/top/maint.mk	Fri Jul 29 22:39:31 2016 -0700
+++ b/top/maint.mk	Tue Jul 26 16:28:16 2016 +0200
@@ -437,17 +437,26 @@
 	halt='the above files do not include <config.h>'		\
 	  $(_sc_search_regexp)
 
+# Print each file name for which the first #include does not match
+# $(config_h_header).  Like grep -m 1, this only looks at the first match.
+perl_config_h_first_ =							\
+  -e 'BEGIN {$$ret = 0}'						\
+  -e 'if (/^\# *include\b/) {'						\
+  -e '  if (not m{^\# *include $(config_h_header)}) {'			\
+  -e '    print "$$ARGV\n";'						\
+  -e '    $$ret = 1;'							\
+  -e '  }'								\
+  -e '  \# Move on to next file after first include'			\
+  -e '  close ARGV;'							\
+  -e '}'								\
+  -e 'END {exit $$ret}'
+
 # You must include <config.h> before including any other header file.
 # This can possibly be via a package-specific header, if given by cfg.mk.
 sc_require_config_h_first:
 	@if $(VC_LIST_EXCEPT) | grep '\.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 &&						\
+	  files=$$($(VC_LIST_EXCEPT) | grep '\.c$$') &&			\
+	  perl -n $(perl_config_h_first_) $$files ||			\
 	    { echo '$(ME): the above files include some other header'	\
 		'before <config.h>' 1>&2; exit 1; } || :;		\
 	else :;								\