[libvirt] [PATCHv2 1/2] syntax-check: rewrite prohibit-duplicate-header in perl

Ján Tomko jtomko at redhat.com
Thu Jun 23 04:23:36 UTC 2016


Invoke the script only once instead of once for every file.
---
 build-aux/prohibit-duplicate-header.pl | 22 ++++++++++++++++++++++
 cfg.mk                                 | 32 +++++++-------------------------
 2 files changed, 29 insertions(+), 25 deletions(-)
 create mode 100644 build-aux/prohibit-duplicate-header.pl

diff --git a/build-aux/prohibit-duplicate-header.pl b/build-aux/prohibit-duplicate-header.pl
new file mode 100644
index 0000000..f9ab3f5
--- /dev/null
+++ b/build-aux/prohibit-duplicate-header.pl
@@ -0,0 +1,22 @@
+#!/usr/bin/perl
+
+use strict;
+
+my $file = " ";
+my $ret = 0;
+my %includes = ( );
+
+while (<>) {
+    if (not $file eq $ARGV) {
+        %includes = ( );
+        $file = $ARGV;
+    }
+    if (/^# *include *[<"]([^>"]*\.h)[">]/) {
+        $includes{$1}++;
+        if ($includes{$1} == 2) {
+            $ret = 1;
+            print STDERR "$1 included multiple times in $ARGV\n";
+        }
+    }
+}
+exit $ret;
diff --git a/cfg.mk b/cfg.mk
index 31da9f9..5d9b554 100644
--- a/cfg.mk
+++ b/cfg.mk
@@ -814,30 +814,6 @@ sc_prohibit_exit_in_tests:
 	halt='use return, not exit(), in tests'				\
 	  $(_sc_search_regexp)
 
-# Don't include duplicate header in the source (either *.c or *.h)
-sc_prohibit_duplicate_header:
-	@fail=0; for i in $$($(VC_LIST_EXCEPT) | grep '\.[chx]$$'); do	\
-	  awk '/# *include.*\.h/ {					\
-	    match($$0, /[<"][^>"]*[">]/);				\
-	    arr[substr($$0, RSTART + 1, RLENGTH - 2)]++;		\
-	  }								\
-	  END {								\
-	    for (key in arr) {						\
-	      if (arr[key] > 1)	{					\
-		fail=1;							\
-		printf("%d %s are included\n", arr[key], key);		\
-	      }								\
-	    }								\
-	    if (fail == 1) {						\
-	      printf("duplicate header(s) in " FILENAME "\n");		\
-	      exit 1;							\
-	    }								\
-	  }' $$i || fail=1;						\
-	done;								\
-	if test $$fail -eq 1; then					\
-	  { echo '$(ME): avoid duplicate headers' 1>&2; exit 1; }	\
-	fi;
-
 # Don't include "libvirt/*.h" in "" form.
 sc_prohibit_include_public_headers_quote:
 	@prohibit='# *include *"libvirt/.*\.h"'				\
@@ -1098,9 +1074,15 @@ _autogen:
 
 # regenerate HACKING as part of the syntax-check
 ifneq ($(_gl-Makefile),)
-syntax-check: $(top_srcdir)/HACKING spacing-check test-wrap-argv
+syntax-check: $(top_srcdir)/HACKING spacing-check test-wrap-argv \
+	prohibit-duplicate-header
 endif
 
+# Don't include duplicate header in the source (either *.c or *.h)
+prohibit-duplicate-header:
+	$(AM_V_GEN)files=$$($(VC_LIST_EXCEPT) | grep '\.[chx]$$'); \
+	$(PERL) -W $(top_srcdir)/build-aux/prohibit-duplicate-header.pl $$files
+
 spacing-check:
 	$(AM_V_GEN)files=`$(VC_LIST) | grep '\.c$$'`; \
 	$(PERL) $(top_srcdir)/build-aux/check-spacing.pl $$files || \
-- 
2.7.3




More information about the libvir-list mailing list