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