summaryrefslogtreecommitdiff
path: root/Porting/checkcfguse.pl
diff options
context:
space:
mode:
authorJarkko Hietaniemi <jhi@iki.fi>2015-08-15 11:24:58 -0400
committerJarkko Hietaniemi <jhi@iki.fi>2015-10-02 18:34:56 -0400
commit95318fb638d5803b82c05a3976715fa2f1e4623e (patch)
treedfa5289f557759e48ae5539a84c8352d83be60c4 /Porting/checkcfguse.pl
parentce03658379770b2057c4b3c20e5e3f66d771e965 (diff)
downloadperl-95318fb638d5803b82c05a3976715fa2f1e4623e.tar.gz
Script for checking config symbol use.
Diffstat (limited to 'Porting/checkcfguse.pl')
-rwxr-xr-xPorting/checkcfguse.pl99
1 files changed, 99 insertions, 0 deletions
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";
+ }
+}