summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MANIFEST1
-rw-r--r--Porting/README.pod5
-rwxr-xr-xPorting/checkcfguse.pl99
-rw-r--r--Porting/exec-bit.txt1
4 files changed, 106 insertions, 0 deletions
diff --git a/MANIFEST b/MANIFEST
index 864dd4a0df..87ca47bbc8 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -4729,6 +4729,7 @@ Porting/check83.pl Check whether we are 8.3-friendly
Porting/checkansi.pl Check source code for ANSI-C violations
Porting/checkAUTHORS.pl Check that the AUTHORS file is complete
Porting/checkcfgvar.pl Check that config scripts define all symbols
+Porting/checkcfguse.pl Check that config symbols are being used
Porting/check-cpan-pollution Check for commits that may wrongly touch CPAN distros
Porting/checkpodencoding.pl Check POD encoding
Porting/checkURL.pl Check whether we have working URLs
diff --git a/Porting/README.pod b/Porting/README.pod
index 84020f6303..21a0414e96 100644
--- a/Porting/README.pod
+++ b/Porting/README.pod
@@ -42,6 +42,11 @@ Check source code for ANSI-C violations.
Used by F<t/porting/authors.t> to ensure the F<AUTHORS> list is up to date.
+=head2 F<checkcfguse.pl>
+
+Check where the symbols defined in the various F<config.sh>-clones
+are being used. VMS is probably not handled properly here.
+
=head2 F<checkcfgvar.pl>
Check that the various F<config.sh>-clones have (at least) all the same
diff --git a/Porting/checkcfguse.pl b/Porting/checkcfguse.pl
new file mode 100755
index 0000000000..af3dd12cb1
--- /dev/null
+++ b/Porting/checkcfguse.pl
@@ -0,0 +1,99 @@
+#!/usr/bin/perl -w
+
+#
+# checkcfguse.pl
+#
+# (1) finds all the Configure/config symbols
+#
+# (2) greps for their use in the core files and shows which ones.
+#
+
+use strict;
+use warnings;
+
+my %SYM;
+
+my @PAT =
+ (
+ [
+ # The format is:
+ # (1) aref of filename glob patterns
+ # (2) aref of qr patterns, the submatch $1 is the symbol name
+ [
+ "config_h.SH",
+ ],
+ [
+ qr/^#\$(\w+)\s+(\w+)/,
+ ],
+ ],
+ [
+ [
+ "NetWare/config_H.??",
+ "Porting/config.sh",
+ "plan9/config_h.sample",
+ "win32/config_H.??",
+ ],
+ qr{^(?:\Q/*\E)?#(?:define|undef)\s+(\w+)},
+ ],
+ [
+ [
+ "configure.com",
+ ],
+ qr{^(\w+)="(?:define|undef)"},
+ ],
+ );
+
+{
+ print STDERR "$0: Looking for symbols...\n";
+ for my $pat (@PAT) {
+ for my $fn (map { glob($_) } @{ $pat->[0] }) {
+ if (open(my $fh, $fn)) {
+ while (<$fh>) {
+ for my $p (@$pat) {
+ for my $sym (/$p/g) {
+ $SYM{$sym}{$fn}++;
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+printf(STDERR "$0: Found %d symbols\n", scalar keys %SYM);
+
+print STDERR "$0: Looking for their uses...\n";
+
+# Much too noisy grepping.
+delete $SYM{'_'};
+delete $SYM{'const'};
+
+my $SYM = join("|", sort { length($b) <=> length($a) || $a cmp $b } keys %SYM);
+
+open(my $mani, "MANIFEST") or die "$0: Failed to open MANIFEST\n";
+
+my %found;
+while (<$mani>) {
+ if (/^(\S+)\s+/) {
+ my $fn = $1;
+ # Skip matches from the config files themselves,
+ # from metaconfig generated files that refer to
+ # the config symbols, and from pods.
+ next if $fn =~ m{^(?:config_h.SH|Configure|configure\.com|Porting/(?:config|Glossary)|(?:NetWare|plan9|win32)/(?:config|(?:GNU)?[Mm]akefile)|uconfig)|\.pod$};
+ open my $fh, $fn or die qq[$0: Failed to open $fn: $!];
+ while (<$fh>) {
+ while (/\b($SYM)\b/go) {
+ $found{$1}{$fn}++;
+ }
+ }
+ }
+}
+
+for my $sym (sort keys %SYM) {
+ if (exists $found{$sym}) {
+ my @found = keys %{$found{$sym}};
+ print "$sym\t", join(" ", sort @found), "\n";
+ } else {
+ print "$sym\n";
+ }
+}
diff --git a/Porting/exec-bit.txt b/Porting/exec-bit.txt
index a0c91e0bce..4504c52cd5 100644
--- a/Porting/exec-bit.txt
+++ b/Porting/exec-bit.txt
@@ -38,6 +38,7 @@ Porting/checkAUTHORS.pl
Porting/checkURL.pl
Porting/checkVERSION.pl
Porting/checkansi.pl
+Porting/checkcfguse.pl
Porting/checkcfgvar.pl
Porting/checkpodencoding.pl
Porting/cmpVERSION.pl