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
8 # VMS is probably not handled properly here, due to their own
9 # rather elaborate DCL scripting.
18 my $err = shift and select STDERR;
19 print "usage: $0 [--list] [--regen] [--default=value]\n";
28 "help|?" => sub { usage (0); },
31 "default=s" => \$default,
34 require 'regen/regen_lib.pl' if $opt_r;
36 my $MASTER_CFG = "config_h.SH";
37 # Inclusive bounds on the main part of the file, $section == 1 below:
38 my $first = qr/^Author=/;
42 # we check from MANIFEST whether they are expected to be present.
43 # We can't base our check on $], because that's the version of the
44 # perl that we are running, not the version of the source tree.
45 "Cross/config.sh-arm-linux",
51 "plan9/config_sh.sample",
54 "win32/config.gc64nox",
65 open my $fh, '<', $MASTER_CFG;
67 while (/[^\\]\$([a-z]\w+)/g) {
69 next if $v =~ /^(CONFIG_H|CONFIG_SH)$/;
74 @MASTER_CFG = sort keys %seen;
80 open my $fh, '<', 'MANIFEST';
82 $MANIFEST{$1}++ if /^(.+?)\t/;
87 for my $cfg (sort @CFG) {
88 unless (exists $MANIFEST{$cfg}) {
89 print STDERR "[skipping not-expected '$cfg']\n";
96 open my $fh, '<', $cfg;
98 if ($cfg eq 'configure.com') {
99 ++$cfg{startperl}; # Cheat.
102 next if /^\#/ || /^\s*$/ || /^\:/;
103 s/(\s*!.*|\s*)$//; # remove trailing comments or whitespace
104 ++$cfg{$1} if /^\$\s+WC "(\w+)='(?:.*)'"$/;
109 die "$cfg:$.:section=$section:$_" unless $section == 0;
112 push @{$lines[$section]}, $_;
113 next if /^\#/ || /^\s*$/ || /^\:/;
115 die "$cfg:$.:section=$section:$_" unless $section == 1;
120 # (optionally with a trailing comment)
121 if (/^(\w+)=(?:'.*'|[^'].*)(?: #.*)?$/) {
131 if ($cfg eq 'configure.com'
132 || join("", @{$lines[1]}) eq join("", sort @{$lines[1]})) {
133 # All is good with the world.
134 } elsif ($opt_r || $opt_l) {
135 # A reference to an empty array is true, hence this flags the
136 # file for later attention by --regen and --list, even if
137 # nothing is missing. Actual sort and output are done later.
140 print "$cfg: unsorted\n"
143 for my $v (@MASTER_CFG) {
144 # This only creates a reference in $missing if something is missing:
145 push @$missing, $v unless exists $cfg{$v};
150 # print the name once, however many problems
152 } elsif ($opt_r && $cfg ne 'configure.com') {
153 if (defined $default) {
154 push @{$lines[1]}, map {"$_='$default'\n"} @$missing;
156 print "$cfg: missing '$_', use --default to add it\n"
160 @{$lines[1]} = sort @{$lines[1]};
161 my $fh = open_new($cfg);
162 print $fh @{$_} foreach @lines;
163 close_and_rename($fh);
165 print "$cfg: missing '$_'\n" foreach @$missing;