This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Bump version for 5.35.11
[perl5.git] / Porting / checkcfguse.pl
1 #!/usr/bin/perl -w
2
3 #
4 # checkcfguse.pl
5 #
6 # (1) finds all the Configure/config symbols
7 #
8 # (2) greps for their use in the core files and shows which ones.
9 #
10
11 use strict;
12 use warnings;
13
14 my %SYM;
15
16 my @PAT =
17     (
18      [
19       # The format is:
20       # (1) aref of filename glob patterns
21       # (2) aref of qr patterns, the submatch $1 is the symbol name
22       [
23        "config_h.SH",
24       ],
25       [
26        qr/^#\$(\w+)\s+(\w+)/,
27       ],
28      ],
29      [
30       [
31        "Porting/config.sh",
32        "plan9/config_h.sample",
33        "win32/config_H.??",
34       ],
35       qr{^(?:\Q/*\E)?#(?:define|undef)\s+(\w+)},
36      ],
37      [
38       [
39        "configure.com",
40       ],
41       qr{^(\w+)="(?:define|undef)"},
42      ],
43     );
44
45 {
46   print STDERR "$0: Looking for symbols...\n";
47   for my $pat (@PAT) {
48     for my $fn (map { glob($_) } @{ $pat->[0] }) {
49       if (open(my $fh, '<', $fn)) {
50         while (<$fh>) {
51           for my $p (@$pat) {
52             for my $sym (/$p/g) {
53               $SYM{$sym}{$fn}++;
54             }
55           }
56         }
57       }
58     }
59   }
60 }
61
62 printf(STDERR "$0: Found %d symbols\n", scalar keys %SYM);
63
64 print STDERR "$0: Looking for their uses...\n";
65
66 # Much too noisy grepping.
67 delete $SYM{'_'};
68 delete $SYM{'const'};
69
70 my $SYM = join("|", sort { length($b) <=> length($a) || $a cmp $b } keys %SYM);
71
72 open(my $mani, '<', "MANIFEST") or die "$0: Failed to open MANIFEST\n";
73
74 my %found;
75 while (<$mani>) {
76   if (/^(\S+)\s+/) {
77     my $fn = $1;
78     # Skip matches from the config files themselves,
79     # from metaconfig generated files that refer to
80     # the config symbols, and from pods.
81     next if $fn =~ m{^(?:config_h.SH|Configure|configure\.com|Porting/(?:config|Glossary)|(?:plan9|win32)/(?:config|(?:GNU)?[Mm]akefile)|uconfig)|\.pod$};
82     open my $fh, '<', $fn or die qq[$0: Failed to open $fn: $!];
83     while (<$fh>) {
84       while (/\b($SYM)\b/go) {
85         $found{$1}{$fn}++;
86       }
87     }
88   }
89 }
90
91 for my $sym (sort keys %SYM) {
92   if (exists $found{$sym}) {
93     my @found = keys %{$found{$sym}};
94     print "$sym\t", join(" ", sort @found), "\n";
95   } else {
96     print "$sym\n";
97   }
98 }