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 13use strict; 14 15my $MASTER_CFG = "config_h.SH"; 16my %MASTER_CFG; 17 18my @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 40sub 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 52sub 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 63read_file($MASTER_CFG, 64 config_h_SH_reader(\%MASTER_CFG)); 65 66my %MANIFEST; 67 68read_file("MANIFEST", 69 sub { 70 $MANIFEST{$1}++ if /^(.+?)\t/; 71 }); 72 73my @MASTER_CFG = sort keys %MASTER_CFG; 74 75sub 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 82for 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} 116