]> xenbits.xensource.com Git - libvirt.git/commitdiff
syntax-check: rewrite prohibit-duplicate-header in perl
authorJán Tomko <jtomko@redhat.com>
Wed, 15 Jun 2016 16:01:24 +0000 (18:01 +0200)
committerJán Tomko <jtomko@redhat.com>
Thu, 23 Jun 2016 10:48:40 +0000 (12:48 +0200)
Invoke the script only once instead of once for every file.

build-aux/prohibit-duplicate-header.pl [new file with mode: 0644]
cfg.mk

diff --git a/build-aux/prohibit-duplicate-header.pl b/build-aux/prohibit-duplicate-header.pl
new file mode 100644 (file)
index 0000000..f9ab3f5
--- /dev/null
@@ -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 31da9f95f09c572c428a0d23a2a0f3c28700a869..5d9b554c67bfd82655e3e08135e3792143d9ea64 100644 (file)
--- 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 || \