bump Module::Build in Maintainers.pl
[perl.git] / Porting / checkcfgvar.pl
1 #!/usr/bin/perl -w
2
3 #
4 # Check that the various config.sh-clones have (at least) all the
5 # same symbols as the top-level config_h.SH so that the (potentially)
6 # needed symbols are not lagging after how Configure thinks the world
7 # is laid out.
8 #
9 # VMS is probably not handled properly here, due to their own
10 # rather elaborate DCL scripting.
11 #
12
13 use strict;
14
15 my $MASTER_CFG = "config_h.SH";
16 my %MASTER_CFG;
17
18 my @CFG = (
19            # This list contains both 5.8.x and 5.9.x files,
20            # we check from MANIFEST whether they are expected to be present.
21            # We can't base our check on $], because that's the version of the
22            # perl that we are running, not the version of the source tree.
23            "Cross/config.sh-arm-linux",
24            "epoc/config.sh",
25            "NetWare/config.wc",
26            "symbian/config.sh",
27            "uconfig.sh",
28            "plan9/config_sh.sample",
29            "vos/config.alpha.def",
30            "vos/config.ga.def",
31            "win32/config.bc",
32            "win32/config.gc",
33            "win32/config.vc",
34            "win32/config.vc64",
35            "win32/config.ce",
36            "configure.com",
37            "Porting/config.sh",
38           );
39
40 sub read_file {
41     my ($fn, $sub) = @_;
42     if (open(my $fh, $fn)) {
43         local $_;
44         while (<$fh>) {
45             &$sub;
46         }
47     } else {
48         die "$0: Failed to open '$fn' for reading: $!\n";
49     }
50 }
51
52 sub config_h_SH_reader {
53     my $cfg = shift;
54     return sub {
55         while (/[^\\]\$([a-z]\w+)/g) {
56             my $v = $1;
57             next if $v =~ /^(CONFIG_H|CONFIG_SH)$/;
58             $cfg->{$v}++;
59         }
60     }
61 }
62
63 read_file($MASTER_CFG,
64           config_h_SH_reader(\%MASTER_CFG));
65
66 my %MANIFEST;
67
68 read_file("MANIFEST",
69           sub {
70               $MANIFEST{$1}++ if /^(.+?)\t/;
71           });
72
73 my @MASTER_CFG = sort keys %MASTER_CFG;
74
75 sub check_cfg {
76     my ($fn, $cfg) = @_;
77     for my $v (@MASTER_CFG) {
78         print "$fn: missing '$v'\n" unless exists $cfg->{$v};
79     }
80 }
81
82 for my $cfg (@CFG) {
83     unless (exists $MANIFEST{$cfg}) {
84         print STDERR "[skipping not-expected '$cfg']\n";
85         next;
86     }
87     my %cfg;
88     read_file($cfg,
89               sub {
90                   return if /^\#/ || /^\s*$/ || /^\:/;
91                   if ($cfg eq 'configure.com') {
92                       s/(\s*!.*|\s*)$//; # remove trailing comments or whitespace
93                       return if ! /^\$\s+WC "(\w+)='(.*)'"$/;
94                   }
95                   # foo='bar'
96                   # foo=bar
97                   # $foo='bar' # VOS 5.8.x specialty
98                   # $foo=bar   # VOS 5.8.x specialty
99                   if (/^\$?(\w+)='(.*)'$/) {
100                       $cfg{$1}++;
101                   }
102                   elsif (/^\$?(\w+)=(.*)$/) {
103                       $cfg{$1}++;
104                   }
105                   elsif (/^\$\s+WC "(\w+)='(.*)'"$/) {
106                       $cfg{$1}++;
107                   } else {
108                       warn "$cfg:$.:$_";
109                   }
110               });
111     if ($cfg eq 'configure.com') {
112         $cfg{startperl}++; # Cheat.
113     }
114     check_cfg($cfg, \%cfg);
115 }