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