This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Re: [PATCH] perlreguts.pod: use the unicode name for ß and show the codepoint
[perl5.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            "Cross/config.sh-arm-linux",
22            "epoc/config.sh",
23            "NetWare/config.wc",
24            "symbian/config.sh",
25            "uconfig.sh",
26            "plan9/config_sh.sample",
27            "vos/config.alpha.def",
28            "vos/config.ga.def",
29            "win32/config.bc",
30            "win32/config.gc",
31            "win32/config.vc",
32            "win32/config.vc64",
33            "win32/config.ce",
34            "wince/config.ce",
35            "configure.com",
36           );
37
38 sub read_file {
39     my ($fn, $sub) = @_;
40     if (open(my $fh, $fn)) {
41         local $_;
42         while (<$fh>) {
43             &$sub;
44         }
45     } else {
46         die "$0: Failed to open '$fn' for reading: $!\n";
47     }
48 }
49
50 sub config_h_SH_reader {
51     my $cfg = shift;
52     return sub {
53         while (/[^\\]\$([a-z]\w+)/g) {
54             my $v = $1;
55             next if $v =~ /^(CONFIG_H|CONFIG_SH)$/;
56             $cfg->{$v}++;
57         }
58     }
59 }
60
61 read_file($MASTER_CFG,
62           config_h_SH_reader(\%MASTER_CFG));
63
64 my %MANIFEST;
65
66 read_file("MANIFEST",
67           sub {
68               $MANIFEST{$1}++ if /^(.+?)\t/;
69           });
70
71 my @MASTER_CFG = sort keys %MASTER_CFG;
72
73 sub check_cfg {
74     my ($fn, $cfg) = @_;
75     for my $v (@MASTER_CFG) {
76         print "$fn: missing '$v'\n" unless exists $cfg->{$v};
77     }
78 }
79
80 for my $cfg (@CFG) {
81     unless (exists $MANIFEST{$cfg}) {
82         print "[skipping not-expected '$cfg']\n";
83         next;
84     }
85     my %cfg;
86     read_file($cfg,
87               sub {
88                   return if /^\#/ || /^\s*$/;
89                   if ($cfg eq 'configure.com') {
90                       s/(\s*!.*|\s*)$//; # remove trailing comments or whitespace
91                       return if ! /^\$\s+WC "(\w+)='(.*)'"$/;
92                   }
93                   # foo='bar'
94                   # foo=bar
95                   # $foo='bar' # VOS 5.8.x specialty
96                   # $foo=bar   # VOS 5.8.x specialty
97                   if (/^\$?(\w+)='(.*)'$/) {
98                       $cfg{$1}++;
99                   }
100                   elsif (/^\$?(\w+)=(.*)$/) {
101                       $cfg{$1}++;
102                   }
103                   elsif (/^\$\s+WC "(\w+)='(.*)'"$/) {
104                       $cfg{$1}++;
105                   } else {
106                       warn "$cfg:$.:$_";
107                   }
108               });
109     if ($cfg eq 'configure.com') {
110         $cfg{startperl}++; # Cheat.
111     }
112     check_cfg($cfg, \%cfg);
113 }