| 1 | #!./miniperl -w
 | 
|---|
| 2 | use strict;
 | 
|---|
| 3 | use vars qw(%Config $Config_SH_expanded);
 | 
|---|
| 4 | 
 | 
|---|
| 5 | my $how_many_common = 22;
 | 
|---|
| 6 | 
 | 
|---|
| 7 | # commonly used names to precache (and hence lookup fastest)
 | 
|---|
| 8 | my %Common;
 | 
|---|
| 9 | 
 | 
|---|
| 10 | while ($how_many_common--) {
 | 
|---|
| 11 |     $_ = <DATA>;
 | 
|---|
| 12 |     chomp;
 | 
|---|
| 13 |     /^(\S+):\s*(\d+)$/ or die "Malformed line '$_'";
 | 
|---|
| 14 |     $Common{$1} = $1;
 | 
|---|
| 15 | }
 | 
|---|
| 16 | 
 | 
|---|
| 17 | # names of things which may need to have slashes changed to double-colons
 | 
|---|
| 18 | my %Extensions = map {($_,$_)}
 | 
|---|
| 19 |                  qw(dynamic_ext static_ext extensions known_extensions);
 | 
|---|
| 20 | 
 | 
|---|
| 21 | # allowed opts as well as specifies default and initial values
 | 
|---|
| 22 | my %Allowed_Opts = (
 | 
|---|
| 23 |     'cross'    => '', # --cross=PLATFORM - crosscompiling for PLATFORM
 | 
|---|
| 24 |     'glossary' => 1,  # --no-glossary  - no glossary file inclusion,
 | 
|---|
| 25 |                       #                  for compactness
 | 
|---|
| 26 |     'heavy' => '',   # pathname of the Config_heavy.pl file
 | 
|---|
| 27 | );
 | 
|---|
| 28 | 
 | 
|---|
| 29 | sub opts {
 | 
|---|
| 30 |     # user specified options
 | 
|---|
| 31 |     my %given_opts = (
 | 
|---|
| 32 |         # --opt=smth
 | 
|---|
| 33 |         (map {/^--([\-_\w]+)=(.*)$/} @ARGV),
 | 
|---|
| 34 |         # --opt --no-opt --noopt
 | 
|---|
| 35 |         (map {/^no-?(.*)$/i?($1=>0):($_=>1)} map {/^--([\-_\w]+)$/} @ARGV),
 | 
|---|
| 36 |     );
 | 
|---|
| 37 | 
 | 
|---|
| 38 |     my %opts = (%Allowed_Opts, %given_opts);
 | 
|---|
| 39 | 
 | 
|---|
| 40 |     for my $opt (grep {!exists $Allowed_Opts{$_}} keys %given_opts) {
 | 
|---|
| 41 |         die "option '$opt' is not recognized";
 | 
|---|
| 42 |     }
 | 
|---|
| 43 |     @ARGV = grep {!/^--/} @ARGV;
 | 
|---|
| 44 | 
 | 
|---|
| 45 |     return %opts;
 | 
|---|
| 46 | }
 | 
|---|
| 47 | 
 | 
|---|
| 48 | 
 | 
|---|
| 49 | my %Opts = opts();
 | 
|---|
| 50 | 
 | 
|---|
| 51 | my ($Config_PM, $Config_heavy);
 | 
|---|
| 52 | my $Glossary = $ARGV[1] || 'Porting/Glossary';
 | 
|---|
| 53 | 
 | 
|---|
| 54 | if ($Opts{cross}) {
 | 
|---|
| 55 |   # creating cross-platform config file
 | 
|---|
| 56 |   mkdir "xlib";
 | 
|---|
| 57 |   mkdir "xlib/$Opts{cross}";
 | 
|---|
| 58 |   $Config_PM = $ARGV[0] || "xlib/$Opts{cross}/Config.pm";
 | 
|---|
| 59 | }
 | 
|---|
| 60 | else {
 | 
|---|
| 61 |   $Config_PM = $ARGV[0] || 'lib/Config.pm';
 | 
|---|
| 62 | }
 | 
|---|
| 63 | if ($Opts{heavy}) {
 | 
|---|
| 64 |   $Config_heavy = $Opts{heavy};
 | 
|---|
| 65 | }
 | 
|---|
| 66 | else {
 | 
|---|
| 67 |   ($Config_heavy = $Config_PM) =~ s!\.pm$!_heavy.pl!;
 | 
|---|
| 68 |   die "Can't automatically determine name for Config_heavy.pl from '$Config_PM'"
 | 
|---|
| 69 |     if $Config_heavy eq $Config_PM;
 | 
|---|
| 70 | }
 | 
|---|
| 71 | 
 | 
|---|
| 72 | open CONFIG, ">$Config_PM" or die "Can't open $Config_PM: $!\n";
 | 
|---|
| 73 | open CONFIG_HEAVY, ">$Config_heavy" or die "Can't open $Config_heavy: $!\n";
 | 
|---|
| 74 | 
 | 
|---|
| 75 | print CONFIG_HEAVY <<'ENDOFBEG';
 | 
|---|
| 76 | # This file was created by configpm when Perl was built. Any changes
 | 
|---|
| 77 | # made to this file will be lost the next time perl is built.
 | 
|---|
| 78 | 
 | 
|---|
| 79 | package Config;
 | 
|---|
| 80 | use strict;
 | 
|---|
| 81 | # use warnings; Pulls in Carp
 | 
|---|
| 82 | # use vars pulls in Carp
 | 
|---|
| 83 | ENDOFBEG
 | 
|---|
| 84 | 
 | 
|---|
| 85 | my $myver = sprintf "v%vd", $^V;
 | 
|---|
| 86 | 
 | 
|---|
| 87 | printf CONFIG <<'ENDOFBEG', ($myver) x 3;
 | 
|---|
| 88 | # This file was created by configpm when Perl was built. Any changes
 | 
|---|
| 89 | # made to this file will be lost the next time perl is built.
 | 
|---|
| 90 | 
 | 
|---|
| 91 | package Config;
 | 
|---|
| 92 | use strict;
 | 
|---|
| 93 | # use warnings; Pulls in Carp
 | 
|---|
| 94 | # use vars pulls in Carp
 | 
|---|
| 95 | @Config::EXPORT = qw(%%Config);
 | 
|---|
| 96 | @Config::EXPORT_OK = qw(myconfig config_sh config_vars config_re);
 | 
|---|
| 97 | 
 | 
|---|
| 98 | # Need to stub all the functions to make code such as print Config::config_sh
 | 
|---|
| 99 | # keep working
 | 
|---|
| 100 | 
 | 
|---|
| 101 | sub myconfig;
 | 
|---|
| 102 | sub config_sh;
 | 
|---|
| 103 | sub config_vars;
 | 
|---|
| 104 | sub config_re;
 | 
|---|
| 105 | 
 | 
|---|
| 106 | my %%Export_Cache = map {($_ => 1)} (@Config::EXPORT, @Config::EXPORT_OK);
 | 
|---|
| 107 | 
 | 
|---|
| 108 | our %%Config;
 | 
|---|
| 109 | 
 | 
|---|
| 110 | # Define our own import method to avoid pulling in the full Exporter:
 | 
|---|
| 111 | sub import {
 | 
|---|
| 112 |     my $pkg = shift;
 | 
|---|
| 113 |     @_ = @Config::EXPORT unless @_;
 | 
|---|
| 114 | 
 | 
|---|
| 115 |     my @funcs = grep $_ ne '%%Config', @_;
 | 
|---|
| 116 |     my $export_Config = @funcs < @_ ? 1 : 0;
 | 
|---|
| 117 | 
 | 
|---|
| 118 |     no strict 'refs';
 | 
|---|
| 119 |     my $callpkg = caller(0);
 | 
|---|
| 120 |     foreach my $func (@funcs) {
 | 
|---|
| 121 |         die sprintf qq{"%%s" is not exported by the %%s module\n},
 | 
|---|
| 122 |             $func, __PACKAGE__ unless $Export_Cache{$func};
 | 
|---|
| 123 |         *{$callpkg.'::'.$func} = \&{$func};
 | 
|---|
| 124 |     }
 | 
|---|
| 125 | 
 | 
|---|
| 126 |     *{"$callpkg\::Config"} = \%%Config if $export_Config;
 | 
|---|
| 127 |     return;
 | 
|---|
| 128 | }
 | 
|---|
| 129 | 
 | 
|---|
| 130 | die "Perl lib version (%s) doesn't match executable version ($])"
 | 
|---|
| 131 |     unless $^V;
 | 
|---|
| 132 | 
 | 
|---|
| 133 | $^V eq %s
 | 
|---|
| 134 |     or die "Perl lib version (%s) doesn't match executable version (" .
 | 
|---|
| 135 |         sprintf("v%%vd",$^V) . ")";
 | 
|---|
| 136 | 
 | 
|---|
| 137 | ENDOFBEG
 | 
|---|
| 138 | 
 | 
|---|
| 139 | 
 | 
|---|
| 140 | my @non_v    = ();
 | 
|---|
| 141 | my @v_others = ();
 | 
|---|
| 142 | my $in_v     = 0;
 | 
|---|
| 143 | my %Data     = ();
 | 
|---|
| 144 | 
 | 
|---|
| 145 | 
 | 
|---|
| 146 | my %seen_quotes;
 | 
|---|
| 147 | {
 | 
|---|
| 148 |   my ($name, $val);
 | 
|---|
| 149 |   open(CONFIG_SH, 'config.sh') || die "Can't open config.sh: $!";
 | 
|---|
| 150 |   while (<CONFIG_SH>) {
 | 
|---|
| 151 |     next if m:^#!/bin/sh:;
 | 
|---|
| 152 | 
 | 
|---|
| 153 |     # Catch PERL_CONFIG_SH=true and PERL_VERSION=n line from Configure.
 | 
|---|
| 154 |     s/^(\w+)=(true|\d+)\s*$/$1='$2'\n/ or m/^(\w+)='(.*)'$/;
 | 
|---|
| 155 |     my($k, $v) = ($1, $2);
 | 
|---|
| 156 | 
 | 
|---|
| 157 |     # grandfather PATCHLEVEL and SUBVERSION and CONFIG
 | 
|---|
| 158 |     if ($k) {
 | 
|---|
| 159 |         if ($k eq 'PERL_VERSION') {
 | 
|---|
| 160 |             push @v_others, "PATCHLEVEL='$v'\n";
 | 
|---|
| 161 |         }
 | 
|---|
| 162 |         elsif ($k eq 'PERL_SUBVERSION') {
 | 
|---|
| 163 |             push @v_others, "SUBVERSION='$v'\n";
 | 
|---|
| 164 |         }
 | 
|---|
| 165 |         elsif ($k eq 'PERL_CONFIG_SH') {
 | 
|---|
| 166 |             push @v_others, "CONFIG='$v'\n";
 | 
|---|
| 167 |         }
 | 
|---|
| 168 |     }
 | 
|---|
| 169 | 
 | 
|---|
| 170 |     # We can delimit things in config.sh with either ' or ". 
 | 
|---|
| 171 |     unless ($in_v or m/^(\w+)=(['"])(.*\n)/){
 | 
|---|
| 172 |         push(@non_v, "#$_"); # not a name='value' line
 | 
|---|
| 173 |         next;
 | 
|---|
| 174 |     }
 | 
|---|
| 175 |     my $quote = $2;
 | 
|---|
| 176 |     if ($in_v) { 
 | 
|---|
| 177 |         $val .= $_;
 | 
|---|
| 178 |     }
 | 
|---|
| 179 |     else { 
 | 
|---|
| 180 |         ($name,$val) = ($1,$3); 
 | 
|---|
| 181 |     }
 | 
|---|
| 182 |     $in_v = $val !~ /$quote\n/;
 | 
|---|
| 183 |     next if $in_v;
 | 
|---|
| 184 | 
 | 
|---|
| 185 |     s,/,::,g if $Extensions{$name};
 | 
|---|
| 186 | 
 | 
|---|
| 187 |     $val =~ s/$quote\n?\z//;
 | 
|---|
| 188 | 
 | 
|---|
| 189 |     my $line = "$name=$quote$val$quote\n";
 | 
|---|
| 190 |     push(@v_others, $line);
 | 
|---|
| 191 |     $seen_quotes{$quote}++;
 | 
|---|
| 192 |   }
 | 
|---|
| 193 |   close CONFIG_SH;
 | 
|---|
| 194 | }
 | 
|---|
| 195 | 
 | 
|---|
| 196 | # This is somewhat grim, but I want the code for parsing config.sh here and
 | 
|---|
| 197 | # now so that I can expand $Config{ivsize} and $Config{ivtype}
 | 
|---|
| 198 | 
 | 
|---|
| 199 | my $fetch_string = <<'EOT';
 | 
|---|
| 200 | 
 | 
|---|
| 201 | # Search for it in the big string
 | 
|---|
| 202 | sub fetch_string {
 | 
|---|
| 203 |     my($self, $key) = @_;
 | 
|---|
| 204 | 
 | 
|---|
| 205 | EOT
 | 
|---|
| 206 | 
 | 
|---|
| 207 | if ($seen_quotes{'"'}) {
 | 
|---|
| 208 |     # We need the full ' and " code
 | 
|---|
| 209 |     $fetch_string .= <<'EOT';
 | 
|---|
| 210 |     my $quote_type = "'";
 | 
|---|
| 211 |     my $marker = "$key=";
 | 
|---|
| 212 | 
 | 
|---|
| 213 |     # Check for the common case, ' delimited
 | 
|---|
| 214 |     my $start = index($Config_SH_expanded, "\n$marker$quote_type");
 | 
|---|
| 215 |     # If that failed, check for " delimited
 | 
|---|
| 216 |     if ($start == -1) {
 | 
|---|
| 217 |         $quote_type = '"';
 | 
|---|
| 218 |         $start = index($Config_SH_expanded, "\n$marker$quote_type");
 | 
|---|
| 219 |     }
 | 
|---|
| 220 | EOT
 | 
|---|
| 221 | } else {
 | 
|---|
| 222 |     $fetch_string .= <<'EOT';
 | 
|---|
| 223 |     # We only have ' delimted.
 | 
|---|
| 224 |     my $start = index($Config_SH_expanded, "\n$key=\'");
 | 
|---|
| 225 | EOT
 | 
|---|
| 226 | }
 | 
|---|
| 227 | $fetch_string .= <<'EOT';
 | 
|---|
| 228 |     # Start can never be -1 now, as we've rigged the long string we're
 | 
|---|
| 229 |     # searching with an initial dummy newline.
 | 
|---|
| 230 |     return undef if $start == -1;
 | 
|---|
| 231 | 
 | 
|---|
| 232 |     $start += length($key) + 3;
 | 
|---|
| 233 | 
 | 
|---|
| 234 | EOT
 | 
|---|
| 235 | if (!$seen_quotes{'"'}) {
 | 
|---|
| 236 |     # Don't need the full ' and " code, or the eval expansion.
 | 
|---|
| 237 |     $fetch_string .= <<'EOT';
 | 
|---|
| 238 |     my $value = substr($Config_SH_expanded, $start,
 | 
|---|
| 239 |                        index($Config_SH_expanded, "'\n", $start)
 | 
|---|
| 240 |                        - $start);
 | 
|---|
| 241 | EOT
 | 
|---|
| 242 | } else {
 | 
|---|
| 243 |     $fetch_string .= <<'EOT';
 | 
|---|
| 244 |     my $value = substr($Config_SH_expanded, $start,
 | 
|---|
| 245 |                        index($Config_SH_expanded, "$quote_type\n", $start)
 | 
|---|
| 246 |                        - $start);
 | 
|---|
| 247 | 
 | 
|---|
| 248 |     # If we had a double-quote, we'd better eval it so escape
 | 
|---|
| 249 |     # sequences and such can be interpolated. Since the incoming
 | 
|---|
| 250 |     # value is supposed to follow shell rules and not perl rules,
 | 
|---|
| 251 |     # we escape any perl variable markers
 | 
|---|
| 252 |     if ($quote_type eq '"') {
 | 
|---|
| 253 |         $value =~ s/\$/\\\$/g;
 | 
|---|
| 254 |         $value =~ s/\@/\\\@/g;
 | 
|---|
| 255 |         eval "\$value = \"$value\"";
 | 
|---|
| 256 |     }
 | 
|---|
| 257 | EOT
 | 
|---|
| 258 | }
 | 
|---|
| 259 | $fetch_string .= <<'EOT';
 | 
|---|
| 260 |     # So we can say "if $Config{'foo'}".
 | 
|---|
| 261 |     $value = undef if $value eq 'undef';
 | 
|---|
| 262 |     $self->{$key} = $value; # cache it
 | 
|---|
| 263 | }
 | 
|---|
| 264 | EOT
 | 
|---|
| 265 | 
 | 
|---|
| 266 | eval $fetch_string;
 | 
|---|
| 267 | die if $@;
 | 
|---|
| 268 | 
 | 
|---|
| 269 | # Calculation for the keys for byteorder
 | 
|---|
| 270 | # This is somewhat grim, but I need to run fetch_string here.
 | 
|---|
| 271 | our $Config_SH_expanded = join "\n", '', @v_others;
 | 
|---|
| 272 | 
 | 
|---|
| 273 | my $t = fetch_string ({}, 'ivtype');
 | 
|---|
| 274 | my $s = fetch_string ({}, 'ivsize');
 | 
|---|
| 275 | 
 | 
|---|
| 276 | # byteorder does exist on its own but we overlay a virtual
 | 
|---|
| 277 | # dynamically recomputed value.
 | 
|---|
| 278 | 
 | 
|---|
| 279 | # However, ivtype and ivsize will not vary for sane fat binaries
 | 
|---|
| 280 | 
 | 
|---|
| 281 | my $f = $t eq 'long' ? 'L!' : $s == 8 ? 'Q': 'I';
 | 
|---|
| 282 | 
 | 
|---|
| 283 | my $byteorder_code;
 | 
|---|
| 284 | if ($s == 4 || $s == 8) {
 | 
|---|
| 285 |     my $list = join ',', reverse(2..$s);
 | 
|---|
| 286 |     my $format = 'a'x$s;
 | 
|---|
| 287 |     $byteorder_code = <<"EOT";
 | 
|---|
| 288 | 
 | 
|---|
| 289 | my \$i = 0;
 | 
|---|
| 290 | foreach my \$c ($list) { \$i |= ord(\$c); \$i <<= 8 }
 | 
|---|
| 291 | \$i |= ord(1);
 | 
|---|
| 292 | our \$byteorder = join('', unpack('$format', pack('$f', \$i)));
 | 
|---|
| 293 | EOT
 | 
|---|
| 294 | } else {
 | 
|---|
| 295 |     $byteorder_code = "our \$byteorder = '?'x$s;\n";
 | 
|---|
| 296 | }
 | 
|---|
| 297 | 
 | 
|---|
| 298 | print CONFIG_HEAVY @non_v, "\n";
 | 
|---|
| 299 | 
 | 
|---|
| 300 | # copy config summary format from the myconfig.SH script
 | 
|---|
| 301 | print CONFIG_HEAVY "our \$summary = <<'!END!';\n";
 | 
|---|
| 302 | open(MYCONFIG,"<myconfig.SH") || die "open myconfig.SH failed: $!";
 | 
|---|
| 303 | 1 while defined($_ = <MYCONFIG>) && !/^Summary of/;
 | 
|---|
| 304 | do { print CONFIG_HEAVY $_ } until !defined($_ = <MYCONFIG>) || /^\s*$/;
 | 
|---|
| 305 | close(MYCONFIG);
 | 
|---|
| 306 | 
 | 
|---|
| 307 | print CONFIG_HEAVY "\n!END!\n", <<'EOT';
 | 
|---|
| 308 | my $summary_expanded;
 | 
|---|
| 309 | 
 | 
|---|
| 310 | sub myconfig {
 | 
|---|
| 311 |     return $summary_expanded if $summary_expanded;
 | 
|---|
| 312 |     ($summary_expanded = $summary) =~ s{\$(\w+)}
 | 
|---|
| 313 |                  { my $c = $Config::Config{$1}; defined($c) ? $c : 'undef' }ge;
 | 
|---|
| 314 |     $summary_expanded;
 | 
|---|
| 315 | }
 | 
|---|
| 316 | 
 | 
|---|
| 317 | local *_ = \my $a;
 | 
|---|
| 318 | $_ = <<'!END!';
 | 
|---|
| 319 | EOT
 | 
|---|
| 320 | 
 | 
|---|
| 321 | print CONFIG_HEAVY join('', sort @v_others), "!END!\n";
 | 
|---|
| 322 | 
 | 
|---|
| 323 | # Only need the dynamic byteorder code in Config.pm if 'byteorder' is one of
 | 
|---|
| 324 | # the precached keys
 | 
|---|
| 325 | if ($Common{byteorder}) {
 | 
|---|
| 326 |     print CONFIG $byteorder_code;
 | 
|---|
| 327 | } else {
 | 
|---|
| 328 |     print CONFIG_HEAVY $byteorder_code;
 | 
|---|
| 329 | }
 | 
|---|
| 330 | 
 | 
|---|
| 331 | print CONFIG_HEAVY <<'EOT';
 | 
|---|
| 332 | s/(byteorder=)(['"]).*?\2/$1$2$Config::byteorder$2/m;
 | 
|---|
| 333 | 
 | 
|---|
| 334 | my $config_sh_len = length $_;
 | 
|---|
| 335 | 
 | 
|---|
| 336 | our $Config_SH_expanded = "\n$_" . << 'EOVIRTUAL';
 | 
|---|
| 337 | EOT
 | 
|---|
| 338 | 
 | 
|---|
| 339 | foreach my $prefix (qw(ccflags ldflags)) {
 | 
|---|
| 340 |     my $value = fetch_string ({}, $prefix);
 | 
|---|
| 341 |     my $withlargefiles = fetch_string ({}, $prefix . "_uselargefiles");
 | 
|---|
| 342 |     $value =~ s/\Q$withlargefiles\E\b//;
 | 
|---|
| 343 |     print CONFIG_HEAVY "${prefix}_nolargefiles='$value'\n";
 | 
|---|
| 344 | }
 | 
|---|
| 345 | 
 | 
|---|
| 346 | foreach my $prefix (qw(libs libswanted)) {
 | 
|---|
| 347 |     my $value = fetch_string ({}, $prefix);
 | 
|---|
| 348 |     my @lflibswanted
 | 
|---|
| 349 |        = split(' ', fetch_string ({}, 'libswanted_uselargefiles'));
 | 
|---|
| 350 |     if (@lflibswanted) {
 | 
|---|
| 351 |         my %lflibswanted;
 | 
|---|
| 352 |         @lflibswanted{@lflibswanted} = ();
 | 
|---|
| 353 |         if ($prefix eq 'libs') {
 | 
|---|
| 354 |             my @libs = grep { /^-l(.+)/ &&
 | 
|---|
| 355 |                             not exists $lflibswanted{$1} }
 | 
|---|
| 356 |                                     split(' ', fetch_string ({}, 'libs'));
 | 
|---|
| 357 |             $value = join(' ', @libs);
 | 
|---|
| 358 |         } else {
 | 
|---|
| 359 |             my @libswanted = grep { not exists $lflibswanted{$_} }
 | 
|---|
| 360 |                                   split(' ', fetch_string ({}, 'libswanted'));
 | 
|---|
| 361 |             $value = join(' ', @libswanted);
 | 
|---|
| 362 |         }
 | 
|---|
| 363 |     }
 | 
|---|
| 364 |     print CONFIG_HEAVY "${prefix}_nolargefiles='$value'\n";
 | 
|---|
| 365 | }
 | 
|---|
| 366 | 
 | 
|---|
| 367 | print CONFIG_HEAVY "EOVIRTUAL\n";
 | 
|---|
| 368 | 
 | 
|---|
| 369 | print CONFIG_HEAVY $fetch_string;
 | 
|---|
| 370 | 
 | 
|---|
| 371 | print CONFIG <<'ENDOFEND';
 | 
|---|
| 372 | 
 | 
|---|
| 373 | sub FETCH {
 | 
|---|
| 374 |     my($self, $key) = @_;
 | 
|---|
| 375 | 
 | 
|---|
| 376 |     # check for cached value (which may be undef so we use exists not defined)
 | 
|---|
| 377 |     return $self->{$key} if exists $self->{$key};
 | 
|---|
| 378 | 
 | 
|---|
| 379 |     return $self->fetch_string($key);
 | 
|---|
| 380 | }
 | 
|---|
| 381 | ENDOFEND
 | 
|---|
| 382 | 
 | 
|---|
| 383 | print CONFIG_HEAVY <<'ENDOFEND';
 | 
|---|
| 384 | 
 | 
|---|
| 385 | my $prevpos = 0;
 | 
|---|
| 386 | 
 | 
|---|
| 387 | sub FIRSTKEY {
 | 
|---|
| 388 |     $prevpos = 0;
 | 
|---|
| 389 |     substr($Config_SH_expanded, 1, index($Config_SH_expanded, '=') - 1 );
 | 
|---|
| 390 | }
 | 
|---|
| 391 | 
 | 
|---|
| 392 | sub NEXTKEY {
 | 
|---|
| 393 | ENDOFEND
 | 
|---|
| 394 | if ($seen_quotes{'"'}) {
 | 
|---|
| 395 | print CONFIG_HEAVY <<'ENDOFEND';
 | 
|---|
| 396 |     # Find out how the current key's quoted so we can skip to its end.
 | 
|---|
| 397 |     my $quote = substr($Config_SH_expanded,
 | 
|---|
| 398 |                        index($Config_SH_expanded, "=", $prevpos)+1, 1);
 | 
|---|
| 399 |     my $pos = index($Config_SH_expanded, qq($quote\n), $prevpos) + 2;
 | 
|---|
| 400 | ENDOFEND
 | 
|---|
| 401 | } else {
 | 
|---|
| 402 |     # Just ' quotes, so it's much easier.
 | 
|---|
| 403 | print CONFIG_HEAVY <<'ENDOFEND';
 | 
|---|
| 404 |     my $pos = index($Config_SH_expanded, qq('\n), $prevpos) + 2;
 | 
|---|
| 405 | ENDOFEND
 | 
|---|
| 406 | }
 | 
|---|
| 407 | print CONFIG_HEAVY <<'ENDOFEND';
 | 
|---|
| 408 |     my $len = index($Config_SH_expanded, "=", $pos) - $pos;
 | 
|---|
| 409 |     $prevpos = $pos;
 | 
|---|
| 410 |     $len > 0 ? substr($Config_SH_expanded, $pos, $len) : undef;
 | 
|---|
| 411 | }
 | 
|---|
| 412 | 
 | 
|---|
| 413 | sub EXISTS {
 | 
|---|
| 414 |     return 1 if exists($_[0]->{$_[1]});
 | 
|---|
| 415 | 
 | 
|---|
| 416 |     return(index($Config_SH_expanded, "\n$_[1]='") != -1
 | 
|---|
| 417 | ENDOFEND
 | 
|---|
| 418 | if ($seen_quotes{'"'}) {
 | 
|---|
| 419 | print CONFIG_HEAVY <<'ENDOFEND';
 | 
|---|
| 420 |            or index($Config_SH_expanded, "\n$_[1]=\"") != -1
 | 
|---|
| 421 | ENDOFEND
 | 
|---|
| 422 | }
 | 
|---|
| 423 | print CONFIG_HEAVY <<'ENDOFEND';
 | 
|---|
| 424 |           );
 | 
|---|
| 425 | }
 | 
|---|
| 426 | 
 | 
|---|
| 427 | sub STORE  { die "\%Config::Config is read-only\n" }
 | 
|---|
| 428 | *DELETE = \&STORE;
 | 
|---|
| 429 | *CLEAR  = \&STORE;
 | 
|---|
| 430 | 
 | 
|---|
| 431 | 
 | 
|---|
| 432 | sub config_sh {
 | 
|---|
| 433 |     substr $Config_SH_expanded, 1, $config_sh_len;
 | 
|---|
| 434 | }
 | 
|---|
| 435 | 
 | 
|---|
| 436 | sub config_re {
 | 
|---|
| 437 |     my $re = shift;
 | 
|---|
| 438 |     return map { chomp; $_ } grep eval{ /^(?:$re)=/ }, split /^/,
 | 
|---|
| 439 |     $Config_SH_expanded;
 | 
|---|
| 440 | }
 | 
|---|
| 441 | 
 | 
|---|
| 442 | sub config_vars {
 | 
|---|
| 443 |     # implements -V:cfgvar option (see perlrun -V:)
 | 
|---|
| 444 |     foreach (@_) {
 | 
|---|
| 445 |         # find optional leading, trailing colons; and query-spec
 | 
|---|
| 446 |         my ($notag,$qry,$lncont) = m/^(:)?(.*?)(:)?$/;  # flags fore and aft, 
 | 
|---|
| 447 |         # map colon-flags to print decorations
 | 
|---|
| 448 |         my $prfx = $notag ? '': "$qry=";                # tag-prefix for print
 | 
|---|
| 449 |         my $lnend = $lncont ? ' ' : ";\n";              # line ending for print
 | 
|---|
| 450 | 
 | 
|---|
| 451 |         # all config-vars are by definition \w only, any \W means regex
 | 
|---|
| 452 |         if ($qry =~ /\W/) {
 | 
|---|
| 453 |             my @matches = config_re($qry);
 | 
|---|
| 454 |             print map "$_$lnend", @matches ? @matches : "$qry: not found"               if !$notag;
 | 
|---|
| 455 |             print map { s/\w+=//; "$_$lnend" } @matches ? @matches : "$qry: not found"  if  $notag;
 | 
|---|
| 456 |         } else {
 | 
|---|
| 457 |             my $v = (exists $Config::Config{$qry}) ? $Config::Config{$qry}
 | 
|---|
| 458 |                                                    : 'UNKNOWN';
 | 
|---|
| 459 |             $v = 'undef' unless defined $v;
 | 
|---|
| 460 |             print "${prfx}'${v}'$lnend";
 | 
|---|
| 461 |         }
 | 
|---|
| 462 |     }
 | 
|---|
| 463 | }
 | 
|---|
| 464 | 
 | 
|---|
| 465 | # Called by the real AUTOLOAD
 | 
|---|
| 466 | sub launcher {
 | 
|---|
| 467 |     undef &AUTOLOAD;
 | 
|---|
| 468 |     goto \&$Config::AUTOLOAD;
 | 
|---|
| 469 | }
 | 
|---|
| 470 | 
 | 
|---|
| 471 | 1;
 | 
|---|
| 472 | ENDOFEND
 | 
|---|
| 473 | 
 | 
|---|
| 474 | if ($^O eq 'os2') {
 | 
|---|
| 475 |     print CONFIG <<'ENDOFSET';
 | 
|---|
| 476 | my %preconfig;
 | 
|---|
| 477 | if ($OS2::is_aout) {
 | 
|---|
| 478 |     my ($value, $v) = $Config_SH_expanded =~ m/^used_aout='(.*)'\s*$/m;
 | 
|---|
| 479 |     for (split ' ', $value) {
 | 
|---|
| 480 |         ($v) = $Config_SH_expanded =~ m/^aout_$_='(.*)'\s*$/m;
 | 
|---|
| 481 |         $preconfig{$_} = $v eq 'undef' ? undef : $v;
 | 
|---|
| 482 |     }
 | 
|---|
| 483 | }
 | 
|---|
| 484 | $preconfig{d_fork} = undef unless $OS2::can_fork; # Some funny cases can't
 | 
|---|
| 485 | sub TIEHASH { bless {%preconfig} }
 | 
|---|
| 486 | ENDOFSET
 | 
|---|
| 487 |     # Extract the name of the DLL from the makefile to avoid duplication
 | 
|---|
| 488 |     my ($f) = grep -r, qw(GNUMakefile Makefile);
 | 
|---|
| 489 |     my $dll;
 | 
|---|
| 490 |     if (open my $fh, '<', $f) {
 | 
|---|
| 491 |         while (<$fh>) {
 | 
|---|
| 492 |             $dll = $1, last if /^PERL_DLL_BASE\s*=\s*(\S*)\s*$/;
 | 
|---|
| 493 |         }
 | 
|---|
| 494 |     }
 | 
|---|
| 495 |     print CONFIG <<ENDOFSET if $dll;
 | 
|---|
| 496 | \$preconfig{dll_name} = '$dll';
 | 
|---|
| 497 | ENDOFSET
 | 
|---|
| 498 | } else {
 | 
|---|
| 499 |     print CONFIG <<'ENDOFSET';
 | 
|---|
| 500 | sub TIEHASH {
 | 
|---|
| 501 |     bless $_[1], $_[0];
 | 
|---|
| 502 | }
 | 
|---|
| 503 | ENDOFSET
 | 
|---|
| 504 | }
 | 
|---|
| 505 | 
 | 
|---|
| 506 | foreach my $key (keys %Common) {
 | 
|---|
| 507 |     my $value = fetch_string ({}, $key);
 | 
|---|
| 508 |     # Is it safe on the LHS of => ?
 | 
|---|
| 509 |     my $qkey = $key =~ /^[A-Za-z_][A-Za-z0-9_]*$/ ? $key : "'$key'";
 | 
|---|
| 510 |     if (defined $value) {
 | 
|---|
| 511 |         # Quote things for a '' string
 | 
|---|
| 512 |         $value =~ s!\\!\\\\!g;
 | 
|---|
| 513 |         $value =~ s!'!\\'!g;
 | 
|---|
| 514 |         $value = "'$value'";
 | 
|---|
| 515 |     } else {
 | 
|---|
| 516 |         $value = "undef";
 | 
|---|
| 517 |     }
 | 
|---|
| 518 |     $Common{$key} = "$qkey => $value";
 | 
|---|
| 519 | }
 | 
|---|
| 520 | 
 | 
|---|
| 521 | if ($Common{byteorder}) {
 | 
|---|
| 522 |     $Common{byteorder} = 'byteorder => $byteorder';
 | 
|---|
| 523 | }
 | 
|---|
| 524 | my $fast_config = join '', map { "    $_,\n" } sort values %Common;
 | 
|---|
| 525 | 
 | 
|---|
| 526 | # Sanity check needed to stop an infite loop if Config_heavy.pl fails to define
 | 
|---|
| 527 | # &launcher for some reason (eg it got truncated)
 | 
|---|
| 528 | print CONFIG sprintf <<'ENDOFTIE', $fast_config;
 | 
|---|
| 529 | 
 | 
|---|
| 530 | sub DESTROY { }
 | 
|---|
| 531 | 
 | 
|---|
| 532 | sub AUTOLOAD {
 | 
|---|
| 533 |     require 'Config_heavy.pl';
 | 
|---|
| 534 |     goto \&launcher unless $Config::AUTOLOAD =~ /launcher$/;
 | 
|---|
| 535 |     die "&Config::AUTOLOAD failed on $Config::AUTOLOAD";
 | 
|---|
| 536 | }
 | 
|---|
| 537 | 
 | 
|---|
| 538 | # tie returns the object, so the value returned to require will be true.
 | 
|---|
| 539 | tie %%Config, 'Config', {
 | 
|---|
| 540 | %s};
 | 
|---|
| 541 | ENDOFTIE
 | 
|---|
| 542 | 
 | 
|---|
| 543 | 
 | 
|---|
| 544 | open(CONFIG_POD, ">lib/Config.pod") or die "Can't open lib/Config.pod: $!";
 | 
|---|
| 545 | print CONFIG_POD <<'ENDOFTAIL';
 | 
|---|
| 546 | =head1 NAME
 | 
|---|
| 547 | 
 | 
|---|
| 548 | Config - access Perl configuration information
 | 
|---|
| 549 | 
 | 
|---|
| 550 | =head1 SYNOPSIS
 | 
|---|
| 551 | 
 | 
|---|
| 552 |     use Config;
 | 
|---|
| 553 |     if ($Config{usethreads}) {
 | 
|---|
| 554 |         print "has thread support\n"
 | 
|---|
| 555 |     } 
 | 
|---|
| 556 | 
 | 
|---|
| 557 |     use Config qw(myconfig config_sh config_vars config_re);
 | 
|---|
| 558 | 
 | 
|---|
| 559 |     print myconfig();
 | 
|---|
| 560 | 
 | 
|---|
| 561 |     print config_sh();
 | 
|---|
| 562 | 
 | 
|---|
| 563 |     print config_re();
 | 
|---|
| 564 | 
 | 
|---|
| 565 |     config_vars(qw(osname archname));
 | 
|---|
| 566 | 
 | 
|---|
| 567 | 
 | 
|---|
| 568 | =head1 DESCRIPTION
 | 
|---|
| 569 | 
 | 
|---|
| 570 | The Config module contains all the information that was available to
 | 
|---|
| 571 | the C<Configure> program at Perl build time (over 900 values).
 | 
|---|
| 572 | 
 | 
|---|
| 573 | Shell variables from the F<config.sh> file (written by Configure) are
 | 
|---|
| 574 | stored in the readonly-variable C<%Config>, indexed by their names.
 | 
|---|
| 575 | 
 | 
|---|
| 576 | Values stored in config.sh as 'undef' are returned as undefined
 | 
|---|
| 577 | values.  The perl C<exists> function can be used to check if a
 | 
|---|
| 578 | named variable exists.
 | 
|---|
| 579 | 
 | 
|---|
| 580 | =over 4
 | 
|---|
| 581 | 
 | 
|---|
| 582 | =item myconfig()
 | 
|---|
| 583 | 
 | 
|---|
| 584 | Returns a textual summary of the major perl configuration values.
 | 
|---|
| 585 | See also C<-V> in L<perlrun/Switches>.
 | 
|---|
| 586 | 
 | 
|---|
| 587 | =item config_sh()
 | 
|---|
| 588 | 
 | 
|---|
| 589 | Returns the entire perl configuration information in the form of the
 | 
|---|
| 590 | original config.sh shell variable assignment script.
 | 
|---|
| 591 | 
 | 
|---|
| 592 | =item config_re($regex)
 | 
|---|
| 593 | 
 | 
|---|
| 594 | Like config_sh() but returns, as a list, only the config entries who's
 | 
|---|
| 595 | names match the $regex.
 | 
|---|
| 596 | 
 | 
|---|
| 597 | =item config_vars(@names)
 | 
|---|
| 598 | 
 | 
|---|
| 599 | Prints to STDOUT the values of the named configuration variable. Each is
 | 
|---|
| 600 | printed on a separate line in the form:
 | 
|---|
| 601 | 
 | 
|---|
| 602 |   name='value';
 | 
|---|
| 603 | 
 | 
|---|
| 604 | Names which are unknown are output as C<name='UNKNOWN';>.
 | 
|---|
| 605 | See also C<-V:name> in L<perlrun/Switches>.
 | 
|---|
| 606 | 
 | 
|---|
| 607 | =back
 | 
|---|
| 608 | 
 | 
|---|
| 609 | =head1 EXAMPLE
 | 
|---|
| 610 | 
 | 
|---|
| 611 | Here's a more sophisticated example of using %Config:
 | 
|---|
| 612 | 
 | 
|---|
| 613 |     use Config;
 | 
|---|
| 614 |     use strict;
 | 
|---|
| 615 | 
 | 
|---|
| 616 |     my %sig_num;
 | 
|---|
| 617 |     my @sig_name;
 | 
|---|
| 618 |     unless($Config{sig_name} && $Config{sig_num}) {
 | 
|---|
| 619 |         die "No sigs?";
 | 
|---|
| 620 |     } else {
 | 
|---|
| 621 |         my @names = split ' ', $Config{sig_name};
 | 
|---|
| 622 |         @sig_num{@names} = split ' ', $Config{sig_num};
 | 
|---|
| 623 |         foreach (@names) {
 | 
|---|
| 624 |             $sig_name[$sig_num{$_}] ||= $_;
 | 
|---|
| 625 |         }   
 | 
|---|
| 626 |     }
 | 
|---|
| 627 | 
 | 
|---|
| 628 |     print "signal #17 = $sig_name[17]\n";
 | 
|---|
| 629 |     if ($sig_num{ALRM}) { 
 | 
|---|
| 630 |         print "SIGALRM is $sig_num{ALRM}\n";
 | 
|---|
| 631 |     }   
 | 
|---|
| 632 | 
 | 
|---|
| 633 | =head1 WARNING
 | 
|---|
| 634 | 
 | 
|---|
| 635 | Because this information is not stored within the perl executable
 | 
|---|
| 636 | itself it is possible (but unlikely) that the information does not
 | 
|---|
| 637 | relate to the actual perl binary which is being used to access it.
 | 
|---|
| 638 | 
 | 
|---|
| 639 | The Config module is installed into the architecture and version
 | 
|---|
| 640 | specific library directory ($Config{installarchlib}) and it checks the
 | 
|---|
| 641 | perl version number when loaded.
 | 
|---|
| 642 | 
 | 
|---|
| 643 | The values stored in config.sh may be either single-quoted or
 | 
|---|
| 644 | double-quoted. Double-quoted strings are handy for those cases where you
 | 
|---|
| 645 | need to include escape sequences in the strings. To avoid runtime variable
 | 
|---|
| 646 | interpolation, any C<$> and C<@> characters are replaced by C<\$> and
 | 
|---|
| 647 | C<\@>, respectively. This isn't foolproof, of course, so don't embed C<\$>
 | 
|---|
| 648 | or C<\@> in double-quoted strings unless you're willing to deal with the
 | 
|---|
| 649 | consequences. (The slashes will end up escaped and the C<$> or C<@> will
 | 
|---|
| 650 | trigger variable interpolation)
 | 
|---|
| 651 | 
 | 
|---|
| 652 | =head1 GLOSSARY
 | 
|---|
| 653 | 
 | 
|---|
| 654 | Most C<Config> variables are determined by the C<Configure> script
 | 
|---|
| 655 | on platforms supported by it (which is most UNIX platforms).  Some
 | 
|---|
| 656 | platforms have custom-made C<Config> variables, and may thus not have
 | 
|---|
| 657 | some of the variables described below, or may have extraneous variables
 | 
|---|
| 658 | specific to that particular port.  See the port specific documentation
 | 
|---|
| 659 | in such cases.
 | 
|---|
| 660 | 
 | 
|---|
| 661 | ENDOFTAIL
 | 
|---|
| 662 | 
 | 
|---|
| 663 | if ($Opts{glossary}) {
 | 
|---|
| 664 |   open(GLOS, "<$Glossary") or die "Can't open $Glossary: $!";
 | 
|---|
| 665 | }
 | 
|---|
| 666 | my %seen = ();
 | 
|---|
| 667 | my $text = 0;
 | 
|---|
| 668 | $/ = '';
 | 
|---|
| 669 | 
 | 
|---|
| 670 | sub process {
 | 
|---|
| 671 |   if (s/\A(\w*)\s+\(([\w.]+)\):\s*\n(\t?)/=item C<$1>\n\nFrom F<$2>:\n\n/m) {
 | 
|---|
| 672 |     my $c = substr $1, 0, 1;
 | 
|---|
| 673 |     unless ($seen{$c}++) {
 | 
|---|
| 674 |       print CONFIG_POD <<EOF if $text;
 | 
|---|
| 675 | =back
 | 
|---|
| 676 | 
 | 
|---|
| 677 | EOF
 | 
|---|
| 678 |       print CONFIG_POD <<EOF;
 | 
|---|
| 679 | =head2 $c
 | 
|---|
| 680 | 
 | 
|---|
| 681 | =over 4
 | 
|---|
| 682 | 
 | 
|---|
| 683 | EOF
 | 
|---|
| 684 |      $text = 1;
 | 
|---|
| 685 |     }
 | 
|---|
| 686 |   }
 | 
|---|
| 687 |   elsif (!$text || !/\A\t/) {
 | 
|---|
| 688 |     warn "Expected a Configure variable header",
 | 
|---|
| 689 |       ($text ? " or another paragraph of description" : () );
 | 
|---|
| 690 |   }
 | 
|---|
| 691 |   s/n't/n\00t/g;                # leave can't, won't etc untouched
 | 
|---|
| 692 |   s/^\t\s+(.*)/\n$1/gm;         # Indented lines ===> new paragraph
 | 
|---|
| 693 |   s/^(?<!\n\n)\t(.*)/$1/gm;     # Not indented lines ===> text
 | 
|---|
| 694 |   s{([\'\"])(?=[^\'\"\s]*[./][^\'\"\s]*\1)([^\'\"\s]+)\1}(F<$2>)g; # '.o'
 | 
|---|
| 695 |   s{([\'\"])([^\'\"\s]+)\1}(C<$2>)g; # "date" command
 | 
|---|
| 696 |   s{\'([A-Za-z_\- *=/]+)\'}(C<$1>)g; # 'ln -s'
 | 
|---|
| 697 |   s{
 | 
|---|
| 698 |      (?<! [\w./<\'\"] )         # Only standalone file names
 | 
|---|
| 699 |      (?! e \. g \. )            # Not e.g.
 | 
|---|
| 700 |      (?! \. \. \. )             # Not ...
 | 
|---|
| 701 |      (?! \d )                   # Not 5.004
 | 
|---|
| 702 |      (?! read/ )                # Not read/write
 | 
|---|
| 703 |      (?! etc\. )                # Not etc.
 | 
|---|
| 704 |      (?! I/O )                  # Not I/O
 | 
|---|
| 705 |      (
 | 
|---|
| 706 |         \$ ?                    # Allow leading $
 | 
|---|
| 707 |         [\w./]* [./] [\w./]*    # Require . or / inside
 | 
|---|
| 708 |      )
 | 
|---|
| 709 |      (?<! \. (?= [\s)] ) )      # Do not include trailing dot
 | 
|---|
| 710 |      (?! [\w/] )                # Include all of it
 | 
|---|
| 711 |    }
 | 
|---|
| 712 |    (F<$1>)xg;                   # /usr/local
 | 
|---|
| 713 |   s/((?<=\s)~\w*)/F<$1>/g;      # ~name
 | 
|---|
| 714 |   s/(?<![.<\'\"])\b([A-Z_]{2,})\b(?![\'\"])/C<$1>/g;    # UNISTD
 | 
|---|
| 715 |   s/(?<![.<\'\"])\b(?!the\b)(\w+)\s+macro\b/C<$1> macro/g; # FILE_cnt macro
 | 
|---|
| 716 |   s/n[\0]t/n't/g;               # undo can't, won't damage
 | 
|---|
| 717 | }
 | 
|---|
| 718 | 
 | 
|---|
| 719 | if ($Opts{glossary}) {
 | 
|---|
| 720 |     <GLOS>;                             # Skip the "DO NOT EDIT"
 | 
|---|
| 721 |     <GLOS>;                             # Skip the preamble
 | 
|---|
| 722 |   while (<GLOS>) {
 | 
|---|
| 723 |     process;
 | 
|---|
| 724 |     print CONFIG_POD;
 | 
|---|
| 725 |   }
 | 
|---|
| 726 | }
 | 
|---|
| 727 | 
 | 
|---|
| 728 | print CONFIG_POD <<'ENDOFTAIL';
 | 
|---|
| 729 | 
 | 
|---|
| 730 | =back
 | 
|---|
| 731 | 
 | 
|---|
| 732 | =head1 NOTE
 | 
|---|
| 733 | 
 | 
|---|
| 734 | This module contains a good example of how to use tie to implement a
 | 
|---|
| 735 | cache and an example of how to make a tied variable readonly to those
 | 
|---|
| 736 | outside of it.
 | 
|---|
| 737 | 
 | 
|---|
| 738 | =cut
 | 
|---|
| 739 | 
 | 
|---|
| 740 | ENDOFTAIL
 | 
|---|
| 741 | 
 | 
|---|
| 742 | close(CONFIG_HEAVY);
 | 
|---|
| 743 | close(CONFIG);
 | 
|---|
| 744 | close(GLOS);
 | 
|---|
| 745 | close(CONFIG_POD);
 | 
|---|
| 746 | 
 | 
|---|
| 747 | # Now create Cross.pm if needed
 | 
|---|
| 748 | if ($Opts{cross}) {
 | 
|---|
| 749 |   open CROSS, ">lib/Cross.pm" or die "Can not open >lib/Cross.pm: $!";
 | 
|---|
| 750 |   my $cross = <<'EOS';
 | 
|---|
| 751 | # typical invocation:
 | 
|---|
| 752 | #   perl -MCross Makefile.PL
 | 
|---|
| 753 | #   perl -MCross=wince -V:cc
 | 
|---|
| 754 | package Cross;
 | 
|---|
| 755 | 
 | 
|---|
| 756 | sub import {
 | 
|---|
| 757 |   my ($package,$platform) = @_;
 | 
|---|
| 758 |   unless (defined $platform) {
 | 
|---|
| 759 |     # if $platform is not specified, then use last one when
 | 
|---|
| 760 |     # 'configpm; was invoked with --cross option
 | 
|---|
| 761 |     $platform = '***replace-marker***';
 | 
|---|
| 762 |   }
 | 
|---|
| 763 |   @INC = map {/\blib\b/?(do{local $_=$_;s/\blib\b/xlib\/$platform/;$_},$_):($_)} @INC;
 | 
|---|
| 764 |   $::Cross::platform = $platform;
 | 
|---|
| 765 | }
 | 
|---|
| 766 | 
 | 
|---|
| 767 | 1;
 | 
|---|
| 768 | EOS
 | 
|---|
| 769 |   $cross =~ s/\*\*\*replace-marker\*\*\*/$Opts{cross}/g;
 | 
|---|
| 770 |   print CROSS $cross;
 | 
|---|
| 771 |   close CROSS;
 | 
|---|
| 772 | }
 | 
|---|
| 773 | 
 | 
|---|
| 774 | # Now do some simple tests on the Config.pm file we have created
 | 
|---|
| 775 | unshift(@INC,'lib');
 | 
|---|
| 776 | require $Config_PM;
 | 
|---|
| 777 | require $Config_heavy;
 | 
|---|
| 778 | import Config;
 | 
|---|
| 779 | 
 | 
|---|
| 780 | die "$0: $Config_PM not valid"
 | 
|---|
| 781 |         unless $Config{'PERL_CONFIG_SH'} eq 'true';
 | 
|---|
| 782 | 
 | 
|---|
| 783 | die "$0: error processing $Config_PM"
 | 
|---|
| 784 |         if defined($Config{'an impossible name'})
 | 
|---|
| 785 |         or $Config{'PERL_CONFIG_SH'} ne 'true' # test cache
 | 
|---|
| 786 |         ;
 | 
|---|
| 787 | 
 | 
|---|
| 788 | die "$0: error processing $Config_PM"
 | 
|---|
| 789 |         if eval '$Config{"cc"} = 1'
 | 
|---|
| 790 |         or eval 'delete $Config{"cc"}'
 | 
|---|
| 791 |         ;
 | 
|---|
| 792 | 
 | 
|---|
| 793 | 
 | 
|---|
| 794 | exit 0;
 | 
|---|
| 795 | # Popularity of various entries in %Config, based on a large build and test
 | 
|---|
| 796 | # run of code in the Fotango build system:
 | 
|---|
| 797 | __DATA__
 | 
|---|
| 798 | path_sep:       8490
 | 
|---|
| 799 | d_readlink:     7101
 | 
|---|
| 800 | d_symlink:      7101
 | 
|---|
| 801 | archlibexp:     4318
 | 
|---|
| 802 | sitearchexp:    4305
 | 
|---|
| 803 | sitelibexp:     4305
 | 
|---|
| 804 | privlibexp:     4163
 | 
|---|
| 805 | ldlibpthname:   4041
 | 
|---|
| 806 | libpth: 2134
 | 
|---|
| 807 | archname:       1591
 | 
|---|
| 808 | exe_ext:        1256
 | 
|---|
| 809 | scriptdir:      1155
 | 
|---|
| 810 | version:        1116
 | 
|---|
| 811 | useithreads:    1002
 | 
|---|
| 812 | osvers: 982
 | 
|---|
| 813 | osname: 851
 | 
|---|
| 814 | inc_version_list:       783
 | 
|---|
| 815 | dont_use_nlink: 779
 | 
|---|
| 816 | intsize:        759
 | 
|---|
| 817 | usevendorprefix:        642
 | 
|---|
| 818 | dlsrc:  624
 | 
|---|
| 819 | cc:     541
 | 
|---|
| 820 | lib_ext:        520
 | 
|---|
| 821 | so:     512
 | 
|---|
| 822 | ld:     501
 | 
|---|
| 823 | ccdlflags:      500
 | 
|---|
| 824 | ldflags:        495
 | 
|---|
| 825 | obj_ext:        495
 | 
|---|
| 826 | cccdlflags:     493
 | 
|---|
| 827 | lddlflags:      493
 | 
|---|
| 828 | ar:     492
 | 
|---|
| 829 | dlext:  492
 | 
|---|
| 830 | libc:   492
 | 
|---|
| 831 | ranlib: 492
 | 
|---|
| 832 | full_ar:        491
 | 
|---|
| 833 | vendorarchexp:  491
 | 
|---|
| 834 | vendorlibexp:   491
 | 
|---|
| 835 | installman1dir: 489
 | 
|---|
| 836 | installman3dir: 489
 | 
|---|
| 837 | installsitebin: 489
 | 
|---|
| 838 | installsiteman1dir:     489
 | 
|---|
| 839 | installsiteman3dir:     489
 | 
|---|
| 840 | installvendorman1dir:   489
 | 
|---|
| 841 | installvendorman3dir:   489
 | 
|---|
| 842 | d_flexfnam:     474
 | 
|---|
| 843 | eunicefix:      360
 | 
|---|
| 844 | d_link: 347
 | 
|---|
| 845 | installsitearch:        344
 | 
|---|
| 846 | installscript:  341
 | 
|---|
| 847 | installprivlib: 337
 | 
|---|
| 848 | binexp: 336
 | 
|---|
| 849 | installarchlib: 336
 | 
|---|
| 850 | installprefixexp:       336
 | 
|---|
| 851 | installsitelib: 336
 | 
|---|
| 852 | installstyle:   336
 | 
|---|
| 853 | installvendorarch:      336
 | 
|---|
| 854 | installvendorbin:       336
 | 
|---|
| 855 | installvendorlib:       336
 | 
|---|
| 856 | man1ext:        336
 | 
|---|
| 857 | man3ext:        336
 | 
|---|
| 858 | sh:     336
 | 
|---|
| 859 | siteprefixexp:  336
 | 
|---|
| 860 | installbin:     335
 | 
|---|
| 861 | usedl:  332
 | 
|---|
| 862 | ccflags:        285
 | 
|---|
| 863 | startperl:      232
 | 
|---|
| 864 | optimize:       231
 | 
|---|
| 865 | usemymalloc:    229
 | 
|---|
| 866 | cpprun: 228
 | 
|---|
| 867 | sharpbang:      228
 | 
|---|
| 868 | perllibs:       225
 | 
|---|
| 869 | usesfio:        224
 | 
|---|
| 870 | usethreads:     220
 | 
|---|
| 871 | perlpath:       218
 | 
|---|
| 872 | extensions:     217
 | 
|---|
| 873 | usesocks:       208
 | 
|---|
| 874 | shellflags:     198
 | 
|---|
| 875 | make:   191
 | 
|---|
| 876 | d_pwage:        189
 | 
|---|
| 877 | d_pwchange:     189
 | 
|---|
| 878 | d_pwclass:      189
 | 
|---|
| 879 | d_pwcomment:    189
 | 
|---|
| 880 | d_pwexpire:     189
 | 
|---|
| 881 | d_pwgecos:      189
 | 
|---|
| 882 | d_pwpasswd:     189
 | 
|---|
| 883 | d_pwquota:      189
 | 
|---|
| 884 | gccversion:     189
 | 
|---|
| 885 | libs:   186
 | 
|---|
| 886 | useshrplib:     186
 | 
|---|
| 887 | cppflags:       185
 | 
|---|
| 888 | ptrsize:        185
 | 
|---|
| 889 | shrpenv:        185
 | 
|---|
| 890 | static_ext:     185
 | 
|---|
| 891 | use5005threads: 185
 | 
|---|
| 892 | uselargefiles:  185
 | 
|---|
| 893 | alignbytes:     184
 | 
|---|
| 894 | byteorder:      184
 | 
|---|
| 895 | ccversion:      184
 | 
|---|
| 896 | config_args:    184
 | 
|---|
| 897 | cppminus:       184
 | 
|---|