Invoke the script only once instead of once for every file.
---
 build-aux/prohibit-duplicate-header.pl | 22 ++++++++++++++++++++++
 cfg.mk                                 | 29 +++++------------------------
 2 files changed, 27 insertions(+), 24 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 297ca3a..69ab6fe 100644
--- a/cfg.mk
+++ b/cfg.mk
@@ -813,30 +813,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"'                         \
@@ -1100,6 +1076,11 @@ ifneq ($(_gl-Makefile),)
 syntax-check: $(top_srcdir)/HACKING spacing-check test-wrap-argv
 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

--
libvir-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to