Commit | Line | Data |
---|---|---|
acad74ad | 1 | #!/usr/bin/perl |
522c08cc | 2 | |
522c08cc RGS |
3 | # Check that the various config.sh-clones have (at least) all the |
4 | # same symbols as the top-level config_h.SH so that the (potentially) | |
5 | # needed symbols are not lagging after how Configure thinks the world | |
6 | # is laid out. | |
7 | # | |
a0e39d89 AT |
8 | # VMS is probably not handled properly here, due to their own |
9 | # rather elaborate DCL scripting. | |
522c08cc RGS |
10 | # |
11 | ||
12 | use strict; | |
acad74ad | 13 | use warnings; |
4ccedf19 | 14 | use autodie; |
acad74ad MB |
15 | |
16 | sub usage | |
17 | { | |
18 | my $err = shift and select STDERR; | |
818a19bd | 19 | print "usage: $0 [--list] [--regen] [--default=value]\n"; |
acad74ad MB |
20 | exit $err; |
21 | } # usage | |
22 | ||
23 | use Getopt::Long; | |
24 | my $opt_l = 0; | |
7ee20c71 | 25 | my $opt_r = 0; |
818a19bd | 26 | my $default; |
6692294e NC |
27 | my $tap = 0; |
28 | my $test; | |
acad74ad MB |
29 | GetOptions ( |
30 | "help|?" => sub { usage (0); }, | |
31 | "l|list!" => \$opt_l, | |
7ee20c71 | 32 | "regen" => \$opt_r, |
818a19bd | 33 | "default=s" => \$default, |
6692294e | 34 | "tap" => \$tap, |
acad74ad | 35 | ) or usage (1); |
522c08cc | 36 | |
0d70e70b MB |
37 | $default and $default =~ s/^'(.*)'$/$1/; # Will be quoted on generation |
38 | ||
3d7c117d | 39 | require './regen/regen_lib.pl' if $opt_r; |
7ee20c71 | 40 | |
522c08cc | 41 | my $MASTER_CFG = "config_h.SH"; |
7ee20c71 NC |
42 | # Inclusive bounds on the main part of the file, $section == 1 below: |
43 | my $first = qr/^Author=/; | |
44 | my $last = qr/^zip=/; | |
522c08cc RGS |
45 | |
46 | my @CFG = ( | |
522c08cc | 47 | # we check from MANIFEST whether they are expected to be present. |
bb0fc361 NC |
48 | # We can't base our check on $], because that's the version of the |
49 | # perl that we are running, not the version of the source tree. | |
522c08cc | 50 | "Cross/config.sh-arm-linux", |
522c08cc RGS |
51 | "NetWare/config.wc", |
52 | "symbian/config.sh", | |
53 | "uconfig.sh", | |
fc09a9a0 | 54 | "uconfig64.sh", |
522c08cc | 55 | "plan9/config_sh.sample", |
522c08cc RGS |
56 | "win32/config.gc", |
57 | "win32/config.vc", | |
26d21fa1 | 58 | "win32/config.ce", |
a0e39d89 | 59 | "configure.com", |
d73cfe96 | 60 | "Porting/config.sh", |
522c08cc RGS |
61 | ); |
62 | ||
2dcb77c2 | 63 | my @MASTER_CFG; |
4ccedf19 | 64 | { |
2dcb77c2 | 65 | my %seen; |
4ccedf19 NC |
66 | open my $fh, '<', $MASTER_CFG; |
67 | while (<$fh>) { | |
2eacba2f | 68 | while (/[^\\]\$([a-z]\w+)/g) { |
522c08cc RGS |
69 | my $v = $1; |
70 | next if $v =~ /^(CONFIG_H|CONFIG_SH)$/; | |
2dcb77c2 | 71 | $seen{$v}++; |
522c08cc RGS |
72 | } |
73 | } | |
4ccedf19 | 74 | close $fh; |
2dcb77c2 | 75 | @MASTER_CFG = sort keys %seen; |
522c08cc RGS |
76 | } |
77 | ||
522c08cc RGS |
78 | my %MANIFEST; |
79 | ||
4ccedf19 NC |
80 | { |
81 | open my $fh, '<', 'MANIFEST'; | |
82 | while (<$fh>) { | |
83 | $MANIFEST{$1}++ if /^(.+?)\t/; | |
84 | } | |
85 | close $fh; | |
86 | } | |
522c08cc | 87 | |
6692294e NC |
88 | printf "1..%d\n", 2 * @CFG if $tap; |
89 | ||
68cf6151 | 90 | for my $cfg (sort @CFG) { |
522c08cc | 91 | unless (exists $MANIFEST{$cfg}) { |
a76803d0 | 92 | print STDERR "[skipping not-expected '$cfg']\n"; |
522c08cc RGS |
93 | next; |
94 | } | |
95 | my %cfg; | |
7ee20c71 NC |
96 | my $section = 0; |
97 | my @lines; | |
4ccedf19 NC |
98 | |
99 | open my $fh, '<', $cfg; | |
f4ca0be2 NC |
100 | |
101 | if ($cfg eq 'configure.com') { | |
102 | ++$cfg{startperl}; # Cheat. | |
103 | ||
104 | while (<$fh>) { | |
105 | next if /^\#/ || /^\s*$/ || /^\:/; | |
4ccedf19 | 106 | s/(\s*!.*|\s*)$//; # remove trailing comments or whitespace |
f4ca0be2 | 107 | ++$cfg{$1} if /^\$\s+WC "(\w+)='(?:.*)'"$/; |
4ccedf19 | 108 | } |
f4ca0be2 NC |
109 | } else { |
110 | while (<$fh>) { | |
7ee20c71 NC |
111 | if ($_ =~ $first) { |
112 | die "$cfg:$.:section=$section:$_" unless $section == 0; | |
113 | $section = 1; | |
114 | } | |
115 | push @{$lines[$section]}, $_; | |
f4ca0be2 | 116 | next if /^\#/ || /^\s*$/ || /^\:/; |
7ee20c71 NC |
117 | if ($_ =~ $last) { |
118 | die "$cfg:$.:section=$section:$_" unless $section == 1; | |
119 | $section = 2; | |
120 | } | |
f4ca0be2 NC |
121 | # foo='bar' |
122 | # foo=bar | |
58f1e530 NC |
123 | # (optionally with a trailing comment) |
124 | if (/^(\w+)=(?:'.*'|[^'].*)(?: #.*)?$/) { | |
f4ca0be2 NC |
125 | ++$cfg{$1}; |
126 | } else { | |
127 | warn "$cfg:$.:$_"; | |
128 | } | |
4ccedf19 NC |
129 | } |
130 | } | |
131 | close $fh; | |
132 | ||
6692294e | 133 | ++$test; |
e1bac119 | 134 | my $missing; |
6692294e NC |
135 | if ($cfg eq 'configure.com') { |
136 | print "ok $test # skip $cfg doesn't need to be sorted\n" | |
137 | if $tap; | |
138 | } elsif (join("", @{$lines[1]}) eq join("", sort @{$lines[1]})) { | |
139 | print "ok $test - $cfg sorted\n" | |
140 | if $tap; | |
141 | } elsif ($tap) { | |
142 | print "not ok $test - $cfg is not sorted\n"; | |
e1bac119 NC |
143 | } elsif ($opt_r || $opt_l) { |
144 | # A reference to an empty array is true, hence this flags the | |
145 | # file for later attention by --regen and --list, even if | |
146 | # nothing is missing. Actual sort and output are done later. | |
147 | $missing = []; | |
148 | } else { | |
149 | print "$cfg: unsorted\n" | |
7ee20c71 | 150 | } |
e1bac119 | 151 | |
1750d3ff | 152 | for my $v (@MASTER_CFG) { |
e1bac119 NC |
153 | # This only creates a reference in $missing if something is missing: |
154 | push @$missing, $v unless exists $cfg{$v}; | |
1750d3ff | 155 | } |
e1bac119 | 156 | |
6692294e | 157 | ++$test; |
e1bac119 | 158 | if ($missing) { |
6692294e NC |
159 | if ($tap) { |
160 | print "not ok $test - $cfg missing keys @$missing\n"; | |
161 | } elsif ($opt_l) { | |
e1bac119 NC |
162 | # print the name once, however many problems |
163 | print "$cfg\n"; | |
164 | } elsif ($opt_r && $cfg ne 'configure.com') { | |
165 | if (defined $default) { | |
166 | push @{$lines[1]}, map {"$_='$default'\n"} @$missing; | |
167 | } else { | |
168 | print "$cfg: missing '$_', use --default to add it\n" | |
169 | foreach @$missing; | |
170 | } | |
171 | ||
172 | @{$lines[1]} = sort @{$lines[1]}; | |
173 | my $fh = open_new($cfg); | |
174 | print $fh @{$_} foreach @lines; | |
175 | close_and_rename($fh); | |
176 | } else { | |
177 | print "$cfg: missing '$_'\n" foreach @$missing; | |
178 | } | |
6692294e NC |
179 | } elsif ($tap) { |
180 | print "ok $test - $cfg has no missing keys\n"; | |
7ee20c71 | 181 | } |
522c08cc | 182 | } |