diff options
author | Jarkko Hietaniemi <jhi@iki.fi> | 2015-08-15 11:24:58 -0400 |
---|---|---|
committer | Jarkko Hietaniemi <jhi@iki.fi> | 2015-10-02 18:34:56 -0400 |
commit | 95318fb638d5803b82c05a3976715fa2f1e4623e (patch) | |
tree | dfa5289f557759e48ae5539a84c8352d83be60c4 /Porting/checkcfguse.pl | |
parent | ce03658379770b2057c4b3c20e5e3f66d771e965 (diff) | |
download | perl-95318fb638d5803b82c05a3976715fa2f1e4623e.tar.gz |
Script for checking config symbol use.
Diffstat (limited to 'Porting/checkcfguse.pl')
-rwxr-xr-x | Porting/checkcfguse.pl | 99 |
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"; + } +} |