This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
If forking during global destruction, the child needs to close all
[perl5.git] / configpm
CommitLineData
a0d0e21e 1#!./miniperl -w
2f4f46ad
NC
2use strict;
3use vars qw(%Config $Config_SH_expanded);
8990e307 4
a8e1d30b
NC
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
NC
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
NC
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
NC
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
NC
48
49my %Opts = opts();
50
2d9d8159 51my ($Config_PM, $Config_heavy);
5435c704
NC
52my $Glossary = $ARGV[1] || 'Porting/Glossary';
53
54if ($Opts{cross}) {
18f68570
VK
55 # creating cross-platform config file
56 mkdir "xlib";
5435c704
NC
57 mkdir "xlib/$Opts{cross}";
58 $Config_PM = $ARGV[0] || "xlib/$Opts{cross}/Config.pm";
18f68570
VK
59}
60else {
5435c704 61 $Config_PM = $ARGV[0] || 'lib/Config.pm';
18f68570 62}
2d9d8159
NC
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
NC
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
NC
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
NC
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
NC
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
NC
106my %%Export_Cache = map {($_ => 1)} (@Config::EXPORT, @Config::EXPORT_OK);
107
108our %%Config;
e3d0cac0
IZ
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
MS
115 my @funcs = grep $_ ne '%%Config', @_;
116 my $export_Config = @funcs < @_ ? 1 : 0;
5435c704 117
2f4f46ad 118 no strict 'refs';
a48f8c77
MS
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
MS
126 *{"$callpkg\::Config"} = \%%Config if $export_Config;
127 return;
e3d0cac0
IZ
128}
129
5435c704
NC
130die "Perl lib version (%s) doesn't match executable version ($])"
131 unless $^V;
de98c553 132
5435c704 133$^V eq %s
a48f8c77
MS
134 or die "Perl lib version (%s) doesn't match executable version (" .
135 sprintf("v%%vd",$^V) . ")";
a0d0e21e 136
8990e307
LW
137ENDOFBEG
138
16d20bd9 139
5435c704 140my @non_v = ();
5435c704
NC
141my @v_others = ();
142my $in_v = 0;
143my %Data = ();
144
a0d0e21e 145
1a9ca827 146my %seen_quotes;
2f4f46ad
NC
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
GS
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
JH
166 push @v_others, "CONFIG='$v'\n";
167 }
cceca5ed 168 }
5435c704 169
435ec615
HM
170 # We can delimit things in config.sh with either ' or ".
171 unless ($in_v or m/^(\w+)=(['"])(.*\n)/){
a0d0e21e
LW
172 push(@non_v, "#$_"); # not a name='value' line
173 next;
174 }
2f4f46ad 175 my $quote = $2;
5435c704
NC
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
NC
192 }
193 close CONFIG_SH;
5435c704 194}
2f4f46ad 195
1a9ca827
NC
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
NC
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
NC
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
NC
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
NC
293EOT
294} else {
2d9d8159 295 $byteorder_code = "our \$byteorder = '?'x$s;\n";
8468119f
NC
296}
297
88fe16b2
NC
298my @need_relocation;
299
300if (fetch_string({},'userelocatableinc')) {
91f668c3
NC
301 foreach my $what (qw(archlibexp
302 privlibexp
303 sitearchexp
304 sitelibexp
88fe16b2 305 sitelib_stem
91f668c3
NC
306 vendorarchexp
307 vendorlibexp
88fe16b2
NC
308 vendorlib_stem)) {
309 push @need_relocation, $what if fetch_string({}, $what) =~ m!^\.\.\./!;
310 }
88fe16b2
NC
311}
312
313my %need_relocation;
314@need_relocation{@need_relocation} = @need_relocation;
315
91f668c3
NC
316# This can have .../ anywhere:
317if (fetch_string({}, 'otherlibdirs') =~ m!\.\.\./!) {
318 $need_relocation{otherlibdirs} = 'otherlibdirs';
319}
320
88fe16b2
NC
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
NC
351 # otherlibdirs only features in the hash
352 foreach (keys %need_relocation) {
88fe16b2
NC
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
EM
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
EM
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
NC
385local *_ = \my $a;
386$_ = <<'!END!';
3c81428c 387EOT
388
deeea481 389print CONFIG_HEAVY join('', sort @v_others), "!END!\n";
2855b621
NC
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
NC
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
NC
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
NC
414}
415
2d9d8159 416print CONFIG_HEAVY <<'EOT';
2d9d8159 417s/(byteorder=)(['"]).*?\2/$1$2$Config::byteorder$2/m;
43d06990
NC
418
419my $config_sh_len = length $_;
3be00128 420
06482b90 421our $Config_SH_expanded : unique = "\n$_" . << 'EOVIRTUAL';
8468119f
NC
422EOT
423
06482b90
NC
424foreach my $prefix (qw(ccflags ldflags)) {
425 my $value = fetch_string ({}, $prefix);
426 my $withlargefiles = fetch_string ({}, $prefix . "_uselargefiles");
27da23d5
JH
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
NC
433foreach my $prefix (qw(libs libswanted)) {
434 my $value = fetch_string ({}, $prefix);
27da23d5
JH
435 my $withlf = fetch_string ({}, 'libswanted_uselargefiles');
436 next unless defined $withlf;
06482b90
NC
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
NC
454}
455
2d9d8159 456print CONFIG_HEAVY "EOVIRTUAL\n";
06482b90 457
2d9d8159 458print CONFIG_HEAVY $fetch_string;
06482b90
NC
459
460print CONFIG <<'ENDOFEND';
461
2d9d8159 462sub FETCH {
5435c704
NC
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
NC
470ENDOFEND
471
472print CONFIG_HEAVY <<'ENDOFEND';
1a9ca827 473
3c81428c 474my $prevpos = 0;
475
a0d0e21e
LW
476sub FIRSTKEY {
477 $prevpos = 0;
2ddb7828 478 substr($Config_SH_expanded, 1, index($Config_SH_expanded, '=') - 1 );
a0d0e21e
LW
479}
480
481sub NEXTKEY {
1a9ca827
NC
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
NC
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
NC
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
NC
503 return 1 if exists($_[0]->{$_[1]});
504
1a9ca827
NC
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
LW
514}
515
3c81428c 516sub STORE { die "\%Config::Config is read-only\n" }
5435c704
NC
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
NC
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
JC
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
JC
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
NC
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
NC
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
MS
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
IZ
585\$preconfig{dll_name} = '$dll';
586ENDOFSET
9193ea20 587} else {
a48f8c77 588 print CONFIG <<'ENDOFSET';
5435c704
NC
589sub TIEHASH {
590 bless $_[1], $_[0];
591}
9193ea20 592ENDOFSET
593}
594
a8e1d30b
NC
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
NC
604 if ($key eq 'otherlibdirs') {
605 $value = "join (':', map {relocate_inc(\$_)} split (':', $value))";
606 } elsif ($need_relocation{$key}) {
88fe16b2
NC
607 $value = "relocate_inc($value)";
608 }
a8e1d30b
NC
609 } else {
610 $value = "undef";
611 }
612 $Common{$key} = "$qkey => $value";
613}
2855b621
NC
614
615if ($Common{byteorder}) {
616 $Common{byteorder} = 'byteorder => $byteorder';
617}
618my $fast_config = join '', map { " $_,\n" } sort values %Common;
5435c704 619
8468119f 620print CONFIG sprintf <<'ENDOFTIE', $fast_config;
9193ea20 621
fb73857a 622sub DESTROY { }
623
2d9d8159 624sub AUTOLOAD {
c1b2b415 625 require 'Config_heavy.pl';
2d9d8159
NC
626 goto \&launcher;
627 die "&Config::AUTOLOAD failed on $Config::AUTOLOAD";
628}
629
2c165900 630# tie returns the object, so the value returned to require will be true.
5435c704 631tie %%Config, 'Config', {
a8e1d30b 632%s};
5435c704
NC
633ENDOFTIE
634
748a9306 635
5435c704
NC
636open(CONFIG_POD, ">lib/Config.pod") or die "Can't open lib/Config.pod: $!";
637print CONFIG_POD <<'ENDOFTAIL';
3c81428c 638=head1 NAME
a0d0e21e 639
3c81428c 640Config - access Perl configuration information
641
642=head1 SYNOPSIS
643
644 use Config;
63f18be6
NC
645 if ($Config{usethreads}) {
646 print "has thread support\n"
3c81428c 647 }
648
a48f8c77 649 use Config qw(myconfig config_sh config_vars config_re);
3c81428c 650
651 print myconfig();
652
653 print config_sh();
654
a48f8c77
MS
655 print config_re();
656
3c81428c 657 config_vars(qw(osname archname));
658
659
660=head1 DESCRIPTION
661
662The Config module contains all the information that was available to
663the C<Configure> program at Perl build time (over 900 values).
664
665Shell variables from the F<config.sh> file (written by Configure) are
666stored in the readonly-variable C<%Config>, indexed by their names.
667
668Values stored in config.sh as 'undef' are returned as undefined
1fef88e7 669values. The perl C<exists> function can be used to check if a
3c81428c 670named variable exists.
671
672=over 4
673
674=item myconfig()
675
676Returns a textual summary of the major perl configuration values.
677See also C<-V> in L<perlrun/Switches>.
678
679=item config_sh()
680
681Returns the entire perl configuration information in the form of the
682original config.sh shell variable assignment script.
683
a48f8c77
MS
684=item config_re($regex)
685
686Like config_sh() but returns, as a list, only the config entries who's
687names match the $regex.
688
3c81428c 689=item config_vars(@names)
690
691Prints to STDOUT the values of the named configuration variable. Each is
692printed on a separate line in the form:
693
694 name='value';
695
696Names which are unknown are output as C<name='UNKNOWN';>.
697See also C<-V:name> in L<perlrun/Switches>.
698
699=back
700
701=head1 EXAMPLE
702
703Here's a more sophisticated example of using %Config:
704
705 use Config;
743c51bc
W
706 use strict;
707
708 my %sig_num;
709 my @sig_name;
710 unless($Config{sig_name} && $Config{sig_num}) {
711 die "No sigs?";
712 } else {
713 my @names = split ' ', $Config{sig_name};
714 @sig_num{@names} = split ' ', $Config{sig_num};
715 foreach (@names) {
716 $sig_name[$sig_num{$_}] ||= $_;
717 }
718 }
3c81428c 719
743c51bc
W
720 print "signal #17 = $sig_name[17]\n";
721 if ($sig_num{ALRM}) {
722 print "SIGALRM is $sig_num{ALRM}\n";
3c81428c 723 }
724
725=head1 WARNING
726
727Because this information is not stored within the perl executable
728itself it is possible (but unlikely) that the information does not
729relate to the actual perl binary which is being used to access it.
730
731The Config module is installed into the architecture and version
732specific library directory ($Config{installarchlib}) and it checks the
733perl version number when loaded.
734
435ec615
HM
735The values stored in config.sh may be either single-quoted or
736double-quoted. Double-quoted strings are handy for those cases where you
737need to include escape sequences in the strings. To avoid runtime variable
738interpolation, any C<$> and C<@> characters are replaced by C<\$> and
739C<\@>, respectively. This isn't foolproof, of course, so don't embed C<\$>
740or C<\@> in double-quoted strings unless you're willing to deal with the
741consequences. (The slashes will end up escaped and the C<$> or C<@> will
742trigger variable interpolation)
743
ebc74a4b
GS
744=head1 GLOSSARY
745
746Most C<Config> variables are determined by the C<Configure> script
747on platforms supported by it (which is most UNIX platforms). Some
748platforms have custom-made C<Config> variables, and may thus not have
749some of the variables described below, or may have extraneous variables
750specific to that particular port. See the port specific documentation
751in such cases.
752
ebc74a4b
GS
753ENDOFTAIL
754
5435c704
NC
755if ($Opts{glossary}) {
756 open(GLOS, "<$Glossary") or die "Can't open $Glossary: $!";
18f68570 757}
2f4f46ad
NC
758my %seen = ();
759my $text = 0;
fb87c415
IZ
760$/ = '';
761
762sub process {
aade5aff
YST
763 if (s/\A(\w*)\s+\(([\w.]+)\):\s*\n(\t?)/=item C<$1>\n\nFrom F<$2>:\n\n/m) {
764 my $c = substr $1, 0, 1;
765 unless ($seen{$c}++) {
5435c704 766 print CONFIG_POD <<EOF if $text;
fb87c415 767=back
ebc74a4b 768
fb87c415 769EOF
5435c704 770 print CONFIG_POD <<EOF;
fb87c415
IZ
771=head2 $c
772
bbc7dcd2 773=over 4
fb87c415
IZ
774
775EOF
aade5aff
YST
776 $text = 1;
777 }
778 }
779 elsif (!$text || !/\A\t/) {
780 warn "Expected a Configure variable header",
781 ($text ? " or another paragraph of description" : () );
fb87c415
IZ
782 }
783 s/n't/n\00t/g; # leave can't, won't etc untouched
9b22980b 784 s/^\t\s+(.*)/\n$1/gm; # Indented lines ===> new paragraph
fb87c415
IZ
785 s/^(?<!\n\n)\t(.*)/$1/gm; # Not indented lines ===> text
786 s{([\'\"])(?=[^\'\"\s]*[./][^\'\"\s]*\1)([^\'\"\s]+)\1}(F<$2>)g; # '.o'
787 s{([\'\"])([^\'\"\s]+)\1}(C<$2>)g; # "date" command
788 s{\'([A-Za-z_\- *=/]+)\'}(C<$1>)g; # 'ln -s'
789 s{
790 (?<! [\w./<\'\"] ) # Only standalone file names
791 (?! e \. g \. ) # Not e.g.
792 (?! \. \. \. ) # Not ...
793 (?! \d ) # Not 5.004
a1151a3c
RGS
794 (?! read/ ) # Not read/write
795 (?! etc\. ) # Not etc.
796 (?! I/O ) # Not I/O
797 (
798 \$ ? # Allow leading $
799 [\w./]* [./] [\w./]* # Require . or / inside
800 )
801 (?<! \. (?= [\s)] ) ) # Do not include trailing dot
fb87c415
IZ
802 (?! [\w/] ) # Include all of it
803 }
804 (F<$1>)xg; # /usr/local
805 s/((?<=\s)~\w*)/F<$1>/g; # ~name
806 s/(?<![.<\'\"])\b([A-Z_]{2,})\b(?![\'\"])/C<$1>/g; # UNISTD
807 s/(?<![.<\'\"])\b(?!the\b)(\w+)\s+macro\b/C<$1> macro/g; # FILE_cnt macro
808 s/n[\0]t/n't/g; # undo can't, won't damage
ebc74a4b
GS
809}
810
5435c704 811if ($Opts{glossary}) {
7701ffb5
JH
812 <GLOS>; # Skip the "DO NOT EDIT"
813 <GLOS>; # Skip the preamble
18f68570
VK
814 while (<GLOS>) {
815 process;
5435c704 816 print CONFIG_POD;
18f68570 817 }
fb87c415 818}
ebc74a4b 819
5435c704 820print CONFIG_POD <<'ENDOFTAIL';
ebc74a4b
GS
821
822=back
823
3c81428c 824=head1 NOTE
825
826This module contains a good example of how to use tie to implement a
827cache and an example of how to make a tied variable readonly to those
828outside of it.
829
830=cut
a0d0e21e 831
9193ea20 832ENDOFTAIL
a0d0e21e 833
2d9d8159 834close(CONFIG_HEAVY);
a0d0e21e 835close(CONFIG);
ebc74a4b 836close(GLOS);
5435c704 837close(CONFIG_POD);
a0d0e21e 838
18f68570 839# Now create Cross.pm if needed
5435c704 840if ($Opts{cross}) {
18f68570 841 open CROSS, ">lib/Cross.pm" or die "Can not open >lib/Cross.pm: $!";
47bcb90d
VK
842 my $cross = <<'EOS';
843# typical invocation:
844# perl -MCross Makefile.PL
845# perl -MCross=wince -V:cc
846package Cross;
847
848sub import {
849 my ($package,$platform) = @_;
850 unless (defined $platform) {
851 # if $platform is not specified, then use last one when
852 # 'configpm; was invoked with --cross option
853 $platform = '***replace-marker***';
854 }
855 @INC = map {/\blib\b/?(do{local $_=$_;s/\blib\b/xlib\/$platform/;$_},$_):($_)} @INC;
e2a02c1e 856 $::Cross::platform = $platform;
18f68570 857}
47bcb90d 858
18f68570
VK
8591;
860EOS
5435c704 861 $cross =~ s/\*\*\*replace-marker\*\*\*/$Opts{cross}/g;
47bcb90d 862 print CROSS $cross;
18f68570
VK
863 close CROSS;
864}
865
a0d0e21e
LW
866# Now do some simple tests on the Config.pm file we have created
867unshift(@INC,'lib');
27da23d5 868unshift(@INC,'xlib/symbian') if $Opts{cross};
5435c704 869require $Config_PM;
ae7e4cc1 870require $Config_heavy;
a0d0e21e
LW
871import Config;
872
5435c704 873die "$0: $Config_PM not valid"
a02608de 874 unless $Config{'PERL_CONFIG_SH'} eq 'true';
a0d0e21e 875
5435c704 876die "$0: error processing $Config_PM"
a0d0e21e 877 if defined($Config{'an impossible name'})
a02608de 878 or $Config{'PERL_CONFIG_SH'} ne 'true' # test cache
a0d0e21e
LW
879 ;
880
5435c704 881die "$0: error processing $Config_PM"
a0d0e21e
LW
882 if eval '$Config{"cc"} = 1'
883 or eval 'delete $Config{"cc"}'
884 ;
885
886
85e6fe83 887exit 0;
a8e1d30b
NC
888# Popularity of various entries in %Config, based on a large build and test
889# run of code in the Fotango build system:
890__DATA__
891path_sep: 8490
892d_readlink: 7101
893d_symlink: 7101
894archlibexp: 4318
895sitearchexp: 4305
896sitelibexp: 4305
897privlibexp: 4163
898ldlibpthname: 4041
899libpth: 2134
900archname: 1591
901exe_ext: 1256
902scriptdir: 1155
903version: 1116
904useithreads: 1002
905osvers: 982
906osname: 851
907inc_version_list: 783
908dont_use_nlink: 779
909intsize: 759
910usevendorprefix: 642
911dlsrc: 624
912cc: 541
913lib_ext: 520
914so: 512
915ld: 501
916ccdlflags: 500
917ldflags: 495
918obj_ext: 495
919cccdlflags: 493
920lddlflags: 493
921ar: 492
922dlext: 492
923libc: 492
924ranlib: 492
925full_ar: 491
926vendorarchexp: 491
927vendorlibexp: 491
928installman1dir: 489
929installman3dir: 489
930installsitebin: 489
931installsiteman1dir: 489
932installsiteman3dir: 489
933installvendorman1dir: 489
934installvendorman3dir: 489
935d_flexfnam: 474
936eunicefix: 360
937d_link: 347
938installsitearch: 344
939installscript: 341
940installprivlib: 337
941binexp: 336
942installarchlib: 336
943installprefixexp: 336
944installsitelib: 336
945installstyle: 336
946installvendorarch: 336
947installvendorbin: 336
948installvendorlib: 336
949man1ext: 336
950man3ext: 336
951sh: 336
952siteprefixexp: 336
953installbin: 335
954usedl: 332
955ccflags: 285
956startperl: 232
957optimize: 231
958usemymalloc: 229
959cpprun: 228
960sharpbang: 228
961perllibs: 225
962usesfio: 224
963usethreads: 220
964perlpath: 218
965extensions: 217
966usesocks: 208
967shellflags: 198
968make: 191
969d_pwage: 189
970d_pwchange: 189
971d_pwclass: 189
972d_pwcomment: 189
973d_pwexpire: 189
974d_pwgecos: 189
975d_pwpasswd: 189
976d_pwquota: 189
977gccversion: 189
978libs: 186
979useshrplib: 186
980cppflags: 185
981ptrsize: 185
982shrpenv: 185
983static_ext: 185
984use5005threads: 185
985uselargefiles: 185
986alignbytes: 184
987byteorder: 184
988ccversion: 184
989config_args: 184
990cppminus: 184