#!/usr/bin/perl use strict; use warnings; use Cwd "abs_path"; use File::Basename; use FindBin; my $p5_metaconfig_base = abs_path "$FindBin::Bin/../"; chdir "$p5_metaconfig_base/perl" or die "Cannot use $p5_metaconfig_base/perl to find config.sh\n"; my @config = sort { -M $a <=> -M $b } grep { -s } qw( config.sh uconfig.sh Porting/config.sh ); @config or die "Build (and test) perl before generating the Glossary\n"; # Get the list of config.sh symbols. Be sure this is up to date! # (I run the Porting/mksample script first to be sure.) $config[0] eq "config.sh" or warn "Using $config[0] instead of config.sh - Did you build?\n"; my $wanted = abs_path $config[0]; chdir "$p5_metaconfig_base/U" or die "Cannot use $p5_metaconfig_base/U to find the units\n"; my @perl_units = map { abs_path $_ } (sort glob "*/*.U"), sort glob "../dist/U/*.U"; open my $wfh, "<", $wanted or die "$0: open $wanted: $!\n"; my @WANTED = map { $_->[0] } sort { $a->[1] cmp $b->[1] } map { [ $_, lc $_ ] } <$wfh>; close $wfh; print <<'EOM'; !!!!!!! DO NOT EDIT THIS FILE !!!!!!! This file is built by metaconfig. This file contains a description of all the shell variables whose value is determined by the Configure script. Variables intended for use in C programs (e.g. I_UNISTD) are already described in config_h.SH. [`configpm' generates pod documentation for Config.pm from this file--please try to keep the formatting regular.] EOM my ($Loc, %expl, %file, %predef); foreach my $file (@perl_units) { open my $fh, "<", $file or die "$0: open $file: $!"; my $base = basename ($file); $Loc = $file, next if $base eq "Loc.U" and not defined $Loc; my @var; while (<$fh>) { if (m/^\?S:\w+[ \t:]/ .. m/^\?S:\.$/) { s/[ \t]+$//; if (m/^\?S:.$/) { my ($var) = ((shift @var) =~ /^(\w+)/); unless (exists $expl{$var}) { $expl{$var} = [ @var, "\n" ]; $file{$var} = $base; } @var = (); } else { s/^\?S://; # Remove leading ?S: markers. s/^\s+(?=.)/\t/; # Ensure all lines begin with tabs. push @var, $_; } } } close $fh or die "$0: close $file: $!"; } defined $Loc or die "$0: Couldn't locate Loc.U: $!"; open my $fh, "<", $Loc or die "$0: open $Loc: $!"; while (<$fh>) { m/^\?(\w+):\1$/ and ($expl{$1}, $file{$1}) = (1, "Loc.U"); } close $fh or die "$0: close $Loc: $!"; { local $/ = "\n\n"; for () { m/^(\w+)/; $predef{$1} = $_; } } for (@WANTED) { chomp; m/^#/ and next; # Skip comments m/^:/ and next; # Skip comments m/^$/ and next; # Skip empty sections my ($var, $val) = split /=/, $_, 2; if (exists $expl{$var}) { if ($file{$var} eq "Loc.U") { print "$var (Loc.U):\n"; if ($val eq "''") { # If we didn't have d_portable, this info might be # useful, but it still won't help with non-standard # stuff if perl is built on one system but installed # on others (this is common with Linux distributions, # for example). print <