This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix overload index mismatch in overloading logic.
[perl5.git] / configpm
CommitLineData
a0d0e21e 1#!./miniperl -w
962e59f3
DM
2#
3# configpm
4#
8ed6d636
VK
5# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
6# 2002, 2003, 2004, 2005, 2006, 2007 Larry Wall and others.
962e59f3
DM
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
DM
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
VK
26# Note that output directory is xlib/[cross-name]/ for cross-compiling
27#
962e59f3
DM
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
DM
35 --cross=PLATFORM cross-compile for a different platform
36 --no-glossary don't include Porting/Glossary in lib/Config.pod
962e59f3
DM
37EOF
38
2f4f46ad
NC
39use strict;
40use vars qw(%Config $Config_SH_expanded);
8990e307 41
a8e1d30b
NC
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
NC
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
NC
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
NC
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
DM
77 warn "option '$opt' is not recognized";
78 usage;
5435c704
NC
79 }
80 @ARGV = grep {!/^--/} @ARGV;
81
82 return %opts;
83}
18f68570 84
5435c704
NC
85
86my %Opts = opts();
87
8ed6d636 88my ($Config_SH, $Config_PM, $Config_heavy, $Config_POD);
d2d98f31 89my $Glossary = 'Porting/Glossary';
5435c704
NC
90
91if ($Opts{cross}) {
18f68570
VK
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
VK
96 $Config_POD = "xlib/$Opts{cross}/Config.pod";
97 $Config_SH = "Cross/config-$Opts{cross}.sh";
18f68570
VK
98}
99else {
d2d98f31 100 $Config_PM = "lib/Config.pm";
8ed6d636
VK
101 $Config_POD = "lib/Config.pod";
102 $Config_SH = "config.sh";
18f68570 103}
d2d98f31
VK
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
DM
108my $config_txt;
109my $heavy_txt;
2d9d8159 110
962e59f3 111$heavy_txt .= <<'ENDOFBEG';
2d9d8159
NC
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
NC
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
NC
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
NC
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
NC
142my %%Export_Cache = map {($_ => 1)} (@Config::EXPORT, @Config::EXPORT_OK);
143
144our %%Config;
e3d0cac0
IZ
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
MS
151 my @funcs = grep $_ ne '%%Config', @_;
152 my $export_Config = @funcs < @_ ? 1 : 0;
5435c704 153
2f4f46ad 154 no strict 'refs';
a48f8c77
MS
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
MS
162 *{"$callpkg\::Config"} = \%%Config if $export_Config;
163 return;
e3d0cac0
IZ
164}
165
5435c704
NC
166die "Perl lib version (%s) doesn't match executable version ($])"
167 unless $^V;
de98c553 168
5435c704 169$^V eq %s
a48f8c77
MS
170 or die "Perl lib version (%s) doesn't match executable version (" .
171 sprintf("v%%vd",$^V) . ")";
a0d0e21e 172
8990e307
LW
173ENDOFBEG
174
16d20bd9 175
5435c704 176my @non_v = ();
5435c704
NC
177my @v_others = ();
178my $in_v = 0;
179my %Data = ();
180
a0d0e21e 181
1a9ca827 182my %seen_quotes;
2f4f46ad
NC
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
GS
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
JH
202 push @v_others, "CONFIG='$v'\n";
203 }
cceca5ed 204 }
5435c704 205
435ec615
HM
206 # We can delimit things in config.sh with either ' or ".
207 unless ($in_v or m/^(\w+)=(['"])(.*\n)/){
a0d0e21e
LW
208 push(@non_v, "#$_"); # not a name='value' line
209 next;
210 }
2f4f46ad 211 my $quote = $2;
5435c704
NC
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
NC
228 }
229 close CONFIG_SH;
5435c704 230}
2f4f46ad 231
1a9ca827
NC
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
NC
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
NC
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
NC
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
NC
329EOT
330} else {
2d9d8159 331 $byteorder_code = "our \$byteorder = '?'x$s;\n";
8468119f
NC
332}
333
88fe16b2
NC
334my @need_relocation;
335
336if (fetch_string({},'userelocatableinc')) {
4d20abad
NC
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
NC
347 sitebinexp
348 sitehtml1direxp
349 sitehtml3direxp
91f668c3 350 sitelibexp
4d20abad
NC
351 siteman1direxp
352 siteman3direxp
353 sitescriptexp
91f668c3 354 vendorarchexp
4d20abad
NC
355 vendorbinexp
356 vendorhtml1direxp
357 vendorhtml3direxp
91f668c3 358 vendorlibexp
4d20abad
NC
359 vendorman1direxp
360 vendorman3direxp
361 vendorscriptexp
362
363 siteprefixexp
364 sitelib_stem
1d230ada
NC
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
NC
393 push @need_relocation, $what if fetch_string({}, $what) =~ m!^\.\.\./!;
394 }
88fe16b2
NC
395}
396
397my %need_relocation;
398@need_relocation{@need_relocation} = @need_relocation;
399
91f668c3
NC
400# This can have .../ anywhere:
401if (fetch_string({}, 'otherlibdirs') =~ m!\.\.\./!) {
402 $need_relocation{otherlibdirs} = 'otherlibdirs';
403}
404
88fe16b2
NC
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
NC
435 # otherlibdirs only features in the hash
436 foreach (keys %need_relocation) {
88fe16b2
NC
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
NC
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
EM
459 return $summary_expanded if $summary_expanded;
460 ($summary_expanded = $summary) =~ s{\$(\w+)}
46807d8e
YO
461 {
462 my $c;
463 if ($1 eq 'git_ancestor_line') {
464 if ($Config::Config{git_ancestor}) {
465 $c= "\n Ancestor: $Config::Config{git_ancestor}";
466 } else {
467 $c= "";
468 }
469 } else {
470 $c = $Config::Config{$1};
471 }
472 defined($c) ? $c : 'undef'
473 }ge;
90ec21fb 474 $summary_expanded;
3c81428c 475}
5435c704 476
8468119f
NC
477local *_ = \my $a;
478$_ = <<'!END!';
3c81428c 479EOT
480
962e59f3 481$heavy_txt .= join('', sort @v_others) . "!END!\n";
2855b621
NC
482
483# Only need the dynamic byteorder code in Config.pm if 'byteorder' is one of
484# the precached keys
485if ($Common{byteorder}) {
962e59f3 486 $config_txt .= $byteorder_code;
2855b621 487} else {
962e59f3 488 $heavy_txt .= $byteorder_code;
2855b621 489}
5435c704 490
88fe16b2 491if (@need_relocation) {
962e59f3
DM
492$heavy_txt .= 'foreach my $what (qw(' . join (' ', @need_relocation) .
493 ")) {\n" . <<'EOT';
8d962fa1 494 s/^($what=)(['"])(.*?)\2/$1 . $2 . relocate_inc($3) . $2/me;
88fe16b2
NC
495}
496EOT
91f668c3
NC
497# Currently it only makes sense to do the ... relocation on Unix, so there's
498# no need to emulate the "which separator for this platform" logic in perl.c -
499# ':' will always be applicable
500if ($need_relocation{otherlibdirs}) {
962e59f3 501$heavy_txt .= << 'EOT';
91f668c3
NC
502s{^(otherlibdirs=)(['"])(.*?)\2}
503 {$1 . $2 . join ':', map {relocate_inc($_)} split ':', $3 . $2}me;
504EOT
505}
88fe16b2
NC
506}
507
962e59f3 508$heavy_txt .= <<'EOT';
2d9d8159 509s/(byteorder=)(['"]).*?\2/$1$2$Config::byteorder$2/m;
43d06990
NC
510
511my $config_sh_len = length $_;
3be00128 512
e935c5a4 513our $Config_SH_expanded = "\n$_" . << 'EOVIRTUAL';
8468119f
NC
514EOT
515
06482b90
NC
516foreach my $prefix (qw(ccflags ldflags)) {
517 my $value = fetch_string ({}, $prefix);
518 my $withlargefiles = fetch_string ({}, $prefix . "_uselargefiles");
27da23d5
JH
519 if (defined $withlargefiles) {
520 $value =~ s/\Q$withlargefiles\E\b//;
962e59f3 521 $heavy_txt .= "${prefix}_nolargefiles='$value'\n";
27da23d5 522 }
06482b90 523}
5435c704 524
06482b90
NC
525foreach my $prefix (qw(libs libswanted)) {
526 my $value = fetch_string ({}, $prefix);
27da23d5
JH
527 my $withlf = fetch_string ({}, 'libswanted_uselargefiles');
528 next unless defined $withlf;
06482b90
NC
529 my @lflibswanted
530 = split(' ', fetch_string ({}, 'libswanted_uselargefiles'));
531 if (@lflibswanted) {
532 my %lflibswanted;
533 @lflibswanted{@lflibswanted} = ();
534 if ($prefix eq 'libs') {
535 my @libs = grep { /^-l(.+)/ &&
536 not exists $lflibswanted{$1} }
537 split(' ', fetch_string ({}, 'libs'));
538 $value = join(' ', @libs);
539 } else {
540 my @libswanted = grep { not exists $lflibswanted{$_} }
541 split(' ', fetch_string ({}, 'libswanted'));
542 $value = join(' ', @libswanted);
4b2ec495 543 }
435ec615 544 }
962e59f3 545 $heavy_txt .= "${prefix}_nolargefiles='$value'\n";
5435c704
NC
546}
547
962e59f3 548$heavy_txt .= "EOVIRTUAL\n";
06482b90 549
46807d8e
YO
550$heavy_txt .= <<'ENDOFGIT';
551require 'Config_git.pl';
552$Config_SH_expanded .= $Config::Git_Data;
553ENDOFGIT
554
962e59f3 555$heavy_txt .= $fetch_string;
06482b90 556
962e59f3 557$config_txt .= <<'ENDOFEND';
06482b90 558
2d9d8159 559sub FETCH {
5435c704
NC
560 my($self, $key) = @_;
561
562 # check for cached value (which may be undef so we use exists not defined)
563 return $self->{$key} if exists $self->{$key};
564
06482b90 565 return $self->fetch_string($key);
a0d0e21e 566}
2d9d8159
NC
567ENDOFEND
568
962e59f3 569$heavy_txt .= <<'ENDOFEND';
1a9ca827 570
3c81428c 571my $prevpos = 0;
572
a0d0e21e
LW
573sub FIRSTKEY {
574 $prevpos = 0;
2ddb7828 575 substr($Config_SH_expanded, 1, index($Config_SH_expanded, '=') - 1 );
a0d0e21e
LW
576}
577
578sub NEXTKEY {
1a9ca827
NC
579ENDOFEND
580if ($seen_quotes{'"'}) {
962e59f3 581$heavy_txt .= <<'ENDOFEND';
435ec615 582 # Find out how the current key's quoted so we can skip to its end.
3be00128
NC
583 my $quote = substr($Config_SH_expanded,
584 index($Config_SH_expanded, "=", $prevpos)+1, 1);
585 my $pos = index($Config_SH_expanded, qq($quote\n), $prevpos) + 2;
1a9ca827
NC
586ENDOFEND
587} else {
588 # Just ' quotes, so it's much easier.
962e59f3 589$heavy_txt .= <<'ENDOFEND';
1a9ca827
NC
590 my $pos = index($Config_SH_expanded, qq('\n), $prevpos) + 2;
591ENDOFEND
592}
962e59f3 593$heavy_txt .= <<'ENDOFEND';
3be00128 594 my $len = index($Config_SH_expanded, "=", $pos) - $pos;
a0d0e21e 595 $prevpos = $pos;
3be00128 596 $len > 0 ? substr($Config_SH_expanded, $pos, $len) : undef;
85e6fe83 597}
a0d0e21e 598
2ddb7828 599sub EXISTS {
5435c704
NC
600 return 1 if exists($_[0]->{$_[1]});
601
1a9ca827
NC
602 return(index($Config_SH_expanded, "\n$_[1]='") != -1
603ENDOFEND
604if ($seen_quotes{'"'}) {
962e59f3 605$heavy_txt .= <<'ENDOFEND';
1a9ca827
NC
606 or index($Config_SH_expanded, "\n$_[1]=\"") != -1
607ENDOFEND
608}
962e59f3 609$heavy_txt .= <<'ENDOFEND';
5435c704 610 );
a0d0e21e
LW
611}
612
3c81428c 613sub STORE { die "\%Config::Config is read-only\n" }
5435c704
NC
614*DELETE = \&STORE;
615*CLEAR = \&STORE;
a0d0e21e 616
3c81428c 617
618sub config_sh {
43d06990 619 substr $Config_SH_expanded, 1, $config_sh_len;
748a9306 620}
9193ea20 621
622sub config_re {
623 my $re = shift;
3be00128
NC
624 return map { chomp; $_ } grep eval{ /^(?:$re)=/ }, split /^/,
625 $Config_SH_expanded;
9193ea20 626}
627
3c81428c 628sub config_vars {
307dc113 629 # implements -V:cfgvar option (see perlrun -V:)
a48f8c77 630 foreach (@_) {
307dc113 631 # find optional leading, trailing colons; and query-spec
4a305f6a 632 my ($notag,$qry,$lncont) = m/^(:)?(.*?)(:)?$/; # flags fore and aft,
307dc113
JC
633 # map colon-flags to print decorations
634 my $prfx = $notag ? '': "$qry="; # tag-prefix for print
635 my $lnend = $lncont ? ' ' : ";\n"; # line ending for print
4a305f6a 636
307dc113 637 # all config-vars are by definition \w only, any \W means regex
4a305f6a
JC
638 if ($qry =~ /\W/) {
639 my @matches = config_re($qry);
640 print map "$_$lnend", @matches ? @matches : "$qry: not found" if !$notag;
641 print map { s/\w+=//; "$_$lnend" } @matches ? @matches : "$qry: not found" if $notag;
a48f8c77 642 } else {
2d9d8159
NC
643 my $v = (exists $Config::Config{$qry}) ? $Config::Config{$qry}
644 : 'UNKNOWN';
a48f8c77 645 $v = 'undef' unless defined $v;
4a305f6a 646 print "${prfx}'${v}'$lnend";
a48f8c77 647 }
3c81428c 648 }
649}
650
2d9d8159
NC
651# Called by the real AUTOLOAD
652sub launcher {
653 undef &AUTOLOAD;
654 goto \&$Config::AUTOLOAD;
655}
656
6571;
9193ea20 658ENDOFEND
659
660if ($^O eq 'os2') {
962e59f3 661 $config_txt .= <<'ENDOFSET';
9193ea20 662my %preconfig;
663if ($OS2::is_aout) {
3be00128 664 my ($value, $v) = $Config_SH_expanded =~ m/^used_aout='(.*)'\s*$/m;
9193ea20 665 for (split ' ', $value) {
3be00128 666 ($v) = $Config_SH_expanded =~ m/^aout_$_='(.*)'\s*$/m;
9193ea20 667 $preconfig{$_} = $v eq 'undef' ? undef : $v;
668 }
669}
764df951 670$preconfig{d_fork} = undef unless $OS2::can_fork; # Some funny cases can't
9193ea20 671sub TIEHASH { bless {%preconfig} }
672ENDOFSET
a48f8c77
MS
673 # Extract the name of the DLL from the makefile to avoid duplication
674 my ($f) = grep -r, qw(GNUMakefile Makefile);
675 my $dll;
676 if (open my $fh, '<', $f) {
677 while (<$fh>) {
678 $dll = $1, last if /^PERL_DLL_BASE\s*=\s*(\S*)\s*$/;
679 }
30500b05 680 }
962e59f3 681 $config_txt .= <<ENDOFSET if $dll;
30500b05
IZ
682\$preconfig{dll_name} = '$dll';
683ENDOFSET
9193ea20 684} else {
962e59f3 685 $config_txt .= <<'ENDOFSET';
5435c704
NC
686sub TIEHASH {
687 bless $_[1], $_[0];
688}
9193ea20 689ENDOFSET
690}
691
a8e1d30b
NC
692foreach my $key (keys %Common) {
693 my $value = fetch_string ({}, $key);
694 # Is it safe on the LHS of => ?
695 my $qkey = $key =~ /^[A-Za-z_][A-Za-z0-9_]*$/ ? $key : "'$key'";
696 if (defined $value) {
697 # Quote things for a '' string
698 $value =~ s!\\!\\\\!g;
699 $value =~ s!'!\\'!g;
700 $value = "'$value'";
91f668c3
NC
701 if ($key eq 'otherlibdirs') {
702 $value = "join (':', map {relocate_inc(\$_)} split (':', $value))";
703 } elsif ($need_relocation{$key}) {
88fe16b2
NC
704 $value = "relocate_inc($value)";
705 }
a8e1d30b
NC
706 } else {
707 $value = "undef";
708 }
709 $Common{$key} = "$qkey => $value";
710}
2855b621
NC
711
712if ($Common{byteorder}) {
713 $Common{byteorder} = 'byteorder => $byteorder';
714}
715my $fast_config = join '', map { " $_,\n" } sort values %Common;
5435c704 716
938af39e
NC
717# Sanity check needed to stop an infite loop if Config_heavy.pl fails to define
718# &launcher for some reason (eg it got truncated)
962e59f3 719$config_txt .= sprintf <<'ENDOFTIE', $fast_config;
9193ea20 720
fb73857a 721sub DESTROY { }
722
2d9d8159 723sub AUTOLOAD {
c1b2b415 724 require 'Config_heavy.pl';
938af39e 725 goto \&launcher unless $Config::AUTOLOAD =~ /launcher$/;
2d9d8159
NC
726 die "&Config::AUTOLOAD failed on $Config::AUTOLOAD";
727}
728
2c165900 729# tie returns the object, so the value returned to require will be true.
5435c704 730tie %%Config, 'Config', {
a8e1d30b 731%s};
5435c704
NC
732ENDOFTIE
733
748a9306 734
8ed6d636 735open(CONFIG_POD, ">$Config_POD") or die "Can't open $Config_POD: $!";
5435c704 736print CONFIG_POD <<'ENDOFTAIL';
3c81428c 737=head1 NAME
a0d0e21e 738
3c81428c 739Config - access Perl configuration information
740
741=head1 SYNOPSIS
742
743 use Config;
63f18be6
NC
744 if ($Config{usethreads}) {
745 print "has thread support\n"
3c81428c 746 }
747
a48f8c77 748 use Config qw(myconfig config_sh config_vars config_re);
3c81428c 749
750 print myconfig();
751
752 print config_sh();
753
a48f8c77
MS
754 print config_re();
755
3c81428c 756 config_vars(qw(osname archname));
757
758
759=head1 DESCRIPTION
760
761The Config module contains all the information that was available to
762the C<Configure> program at Perl build time (over 900 values).
763
764Shell variables from the F<config.sh> file (written by Configure) are
765stored in the readonly-variable C<%Config>, indexed by their names.
766
767Values stored in config.sh as 'undef' are returned as undefined
1fef88e7 768values. The perl C<exists> function can be used to check if a
3c81428c 769named variable exists.
770
771=over 4
772
773=item myconfig()
774
775Returns a textual summary of the major perl configuration values.
776See also C<-V> in L<perlrun/Switches>.
777
778=item config_sh()
779
780Returns the entire perl configuration information in the form of the
781original config.sh shell variable assignment script.
782
a48f8c77
MS
783=item config_re($regex)
784
785Like config_sh() but returns, as a list, only the config entries who's
786names match the $regex.
787
3c81428c 788=item config_vars(@names)
789
790Prints to STDOUT the values of the named configuration variable. Each is
791printed on a separate line in the form:
792
793 name='value';
794
795Names which are unknown are output as C<name='UNKNOWN';>.
796See also C<-V:name> in L<perlrun/Switches>.
797
798=back
799
800=head1 EXAMPLE
801
802Here's a more sophisticated example of using %Config:
803
804 use Config;
743c51bc
W
805 use strict;
806
807 my %sig_num;
808 my @sig_name;
809 unless($Config{sig_name} && $Config{sig_num}) {
810 die "No sigs?";
811 } else {
812 my @names = split ' ', $Config{sig_name};
813 @sig_num{@names} = split ' ', $Config{sig_num};
814 foreach (@names) {
815 $sig_name[$sig_num{$_}] ||= $_;
816 }
817 }
3c81428c 818
743c51bc
W
819 print "signal #17 = $sig_name[17]\n";
820 if ($sig_num{ALRM}) {
821 print "SIGALRM is $sig_num{ALRM}\n";
3c81428c 822 }
823
824=head1 WARNING
825
826Because this information is not stored within the perl executable
827itself it is possible (but unlikely) that the information does not
828relate to the actual perl binary which is being used to access it.
829
830The Config module is installed into the architecture and version
831specific library directory ($Config{installarchlib}) and it checks the
832perl version number when loaded.
833
435ec615
HM
834The values stored in config.sh may be either single-quoted or
835double-quoted. Double-quoted strings are handy for those cases where you
836need to include escape sequences in the strings. To avoid runtime variable
837interpolation, any C<$> and C<@> characters are replaced by C<\$> and
838C<\@>, respectively. This isn't foolproof, of course, so don't embed C<\$>
839or C<\@> in double-quoted strings unless you're willing to deal with the
840consequences. (The slashes will end up escaped and the C<$> or C<@> will
841trigger variable interpolation)
842
ebc74a4b
GS
843=head1 GLOSSARY
844
845Most C<Config> variables are determined by the C<Configure> script
846on platforms supported by it (which is most UNIX platforms). Some
847platforms have custom-made C<Config> variables, and may thus not have
848some of the variables described below, or may have extraneous variables
849specific to that particular port. See the port specific documentation
850in such cases.
851
c90cd22b
RGS
852=cut
853
ebc74a4b
GS
854ENDOFTAIL
855
5435c704
NC
856if ($Opts{glossary}) {
857 open(GLOS, "<$Glossary") or die "Can't open $Glossary: $!";
18f68570 858}
2f4f46ad
NC
859my %seen = ();
860my $text = 0;
fb87c415
IZ
861$/ = '';
862
863sub process {
aade5aff
YST
864 if (s/\A(\w*)\s+\(([\w.]+)\):\s*\n(\t?)/=item C<$1>\n\nFrom F<$2>:\n\n/m) {
865 my $c = substr $1, 0, 1;
866 unless ($seen{$c}++) {
5435c704 867 print CONFIG_POD <<EOF if $text;
fb87c415 868=back
ebc74a4b 869
c90cd22b
RGS
870=cut
871
fb87c415 872EOF
5435c704 873 print CONFIG_POD <<EOF;
fb87c415
IZ
874=head2 $c
875
bbc7dcd2 876=over 4
fb87c415 877
c90cd22b
RGS
878=cut
879
fb87c415 880EOF
aade5aff
YST
881 $text = 1;
882 }
883 }
884 elsif (!$text || !/\A\t/) {
885 warn "Expected a Configure variable header",
886 ($text ? " or another paragraph of description" : () );
fb87c415
IZ
887 }
888 s/n't/n\00t/g; # leave can't, won't etc untouched
9b22980b 889 s/^\t\s+(.*)/\n$1/gm; # Indented lines ===> new paragraph
fb87c415
IZ
890 s/^(?<!\n\n)\t(.*)/$1/gm; # Not indented lines ===> text
891 s{([\'\"])(?=[^\'\"\s]*[./][^\'\"\s]*\1)([^\'\"\s]+)\1}(F<$2>)g; # '.o'
892 s{([\'\"])([^\'\"\s]+)\1}(C<$2>)g; # "date" command
893 s{\'([A-Za-z_\- *=/]+)\'}(C<$1>)g; # 'ln -s'
894 s{
895 (?<! [\w./<\'\"] ) # Only standalone file names
896 (?! e \. g \. ) # Not e.g.
897 (?! \. \. \. ) # Not ...
898 (?! \d ) # Not 5.004
a1151a3c
RGS
899 (?! read/ ) # Not read/write
900 (?! etc\. ) # Not etc.
901 (?! I/O ) # Not I/O
902 (
903 \$ ? # Allow leading $
904 [\w./]* [./] [\w./]* # Require . or / inside
905 )
906 (?<! \. (?= [\s)] ) ) # Do not include trailing dot
fb87c415
IZ
907 (?! [\w/] ) # Include all of it
908 }
909 (F<$1>)xg; # /usr/local
910 s/((?<=\s)~\w*)/F<$1>/g; # ~name
911 s/(?<![.<\'\"])\b([A-Z_]{2,})\b(?![\'\"])/C<$1>/g; # UNISTD
912 s/(?<![.<\'\"])\b(?!the\b)(\w+)\s+macro\b/C<$1> macro/g; # FILE_cnt macro
913 s/n[\0]t/n't/g; # undo can't, won't damage
ebc74a4b
GS
914}
915
5435c704 916if ($Opts{glossary}) {
7701ffb5
JH
917 <GLOS>; # Skip the "DO NOT EDIT"
918 <GLOS>; # Skip the preamble
18f68570
VK
919 while (<GLOS>) {
920 process;
5435c704 921 print CONFIG_POD;
18f68570 922 }
fb87c415 923}
ebc74a4b 924
5435c704 925print CONFIG_POD <<'ENDOFTAIL';
ebc74a4b
GS
926
927=back
928
3c81428c 929=head1 NOTE
930
931This module contains a good example of how to use tie to implement a
932cache and an example of how to make a tied variable readonly to those
933outside of it.
934
935=cut
a0d0e21e 936
9193ea20 937ENDOFTAIL
a0d0e21e 938
962e59f3 939close(GLOS) if $Opts{glossary};
5435c704 940close(CONFIG_POD);
8ed6d636 941print "written $Config_POD\n";
962e59f3
DM
942
943my $orig_config_txt = "";
944my $orig_heavy_txt = "";
945{
946 local $/;
947 my $fh;
948 $orig_config_txt = <$fh> if open $fh, "<", $Config_PM;
949 $orig_heavy_txt = <$fh> if open $fh, "<", $Config_heavy;
950}
951
952if ($orig_config_txt ne $config_txt or $orig_heavy_txt ne $heavy_txt) {
953 open CONFIG, ">", $Config_PM or die "Can't open $Config_PM: $!\n";
954 open CONFIG_HEAVY, ">", $Config_heavy or die "Can't open $Config_heavy: $!\n";
955 print CONFIG $config_txt;
956 print CONFIG_HEAVY $heavy_txt;
957 close(CONFIG_HEAVY);
958 close(CONFIG);
959 print "updated $Config_PM\n";
960 print "updated $Config_heavy\n";
961}
962
a0d0e21e 963
18f68570 964# Now create Cross.pm if needed
5435c704 965if ($Opts{cross}) {
18f68570 966 open CROSS, ">lib/Cross.pm" or die "Can not open >lib/Cross.pm: $!";
47bcb90d
VK
967 my $cross = <<'EOS';
968# typical invocation:
969# perl -MCross Makefile.PL
970# perl -MCross=wince -V:cc
971package Cross;
972
973sub import {
974 my ($package,$platform) = @_;
975 unless (defined $platform) {
976 # if $platform is not specified, then use last one when
977 # 'configpm; was invoked with --cross option
978 $platform = '***replace-marker***';
979 }
980 @INC = map {/\blib\b/?(do{local $_=$_;s/\blib\b/xlib\/$platform/;$_},$_):($_)} @INC;
e2a02c1e 981 $::Cross::platform = $platform;
18f68570 982}
47bcb90d 983
18f68570
VK
9841;
985EOS
5435c704 986 $cross =~ s/\*\*\*replace-marker\*\*\*/$Opts{cross}/g;
47bcb90d 987 print CROSS $cross;
18f68570 988 close CROSS;
962e59f3 989 print "written lib/Cross.pm\n";
42d1cefd 990 unshift(@INC,"xlib/$Opts{cross}");
18f68570
VK
991}
992
a0d0e21e
LW
993# Now do some simple tests on the Config.pm file we have created
994unshift(@INC,'lib');
27da23d5 995unshift(@INC,'xlib/symbian') if $Opts{cross};
5435c704 996require $Config_PM;
ae7e4cc1 997require $Config_heavy;
a0d0e21e
LW
998import Config;
999
5435c704 1000die "$0: $Config_PM not valid"
a02608de 1001 unless $Config{'PERL_CONFIG_SH'} eq 'true';
a0d0e21e 1002
5435c704 1003die "$0: error processing $Config_PM"
a0d0e21e 1004 if defined($Config{'an impossible name'})
a02608de 1005 or $Config{'PERL_CONFIG_SH'} ne 'true' # test cache
a0d0e21e
LW
1006 ;
1007
5435c704 1008die "$0: error processing $Config_PM"
a0d0e21e
LW
1009 if eval '$Config{"cc"} = 1'
1010 or eval 'delete $Config{"cc"}'
1011 ;
1012
1013
85e6fe83 1014exit 0;
a8e1d30b
NC
1015# Popularity of various entries in %Config, based on a large build and test
1016# run of code in the Fotango build system:
1017__DATA__
1018path_sep: 8490
1019d_readlink: 7101
1020d_symlink: 7101
1021archlibexp: 4318
1022sitearchexp: 4305
1023sitelibexp: 4305
1024privlibexp: 4163
1025ldlibpthname: 4041
1026libpth: 2134
1027archname: 1591
1028exe_ext: 1256
1029scriptdir: 1155
1030version: 1116
1031useithreads: 1002
1032osvers: 982
1033osname: 851
1034inc_version_list: 783
1035dont_use_nlink: 779
1036intsize: 759
1037usevendorprefix: 642
1038dlsrc: 624
1039cc: 541
1040lib_ext: 520
1041so: 512
1042ld: 501
1043ccdlflags: 500
1044ldflags: 495
1045obj_ext: 495
1046cccdlflags: 493
1047lddlflags: 493
1048ar: 492
1049dlext: 492
1050libc: 492
1051ranlib: 492
1052full_ar: 491
1053vendorarchexp: 491
1054vendorlibexp: 491
1055installman1dir: 489
1056installman3dir: 489
1057installsitebin: 489
1058installsiteman1dir: 489
1059installsiteman3dir: 489
1060installvendorman1dir: 489
1061installvendorman3dir: 489
1062d_flexfnam: 474
1063eunicefix: 360
1064d_link: 347
1065installsitearch: 344
1066installscript: 341
1067installprivlib: 337
1068binexp: 336
1069installarchlib: 336
1070installprefixexp: 336
1071installsitelib: 336
1072installstyle: 336
1073installvendorarch: 336
1074installvendorbin: 336
1075installvendorlib: 336
1076man1ext: 336
1077man3ext: 336
1078sh: 336
1079siteprefixexp: 336
1080installbin: 335
1081usedl: 332
1082ccflags: 285
1083startperl: 232
1084optimize: 231
1085usemymalloc: 229
1086cpprun: 228
1087sharpbang: 228
1088perllibs: 225
1089usesfio: 224
1090usethreads: 220
1091perlpath: 218
1092extensions: 217
1093usesocks: 208
1094shellflags: 198
1095make: 191
1096d_pwage: 189
1097d_pwchange: 189
1098d_pwclass: 189
1099d_pwcomment: 189
1100d_pwexpire: 189
1101d_pwgecos: 189
1102d_pwpasswd: 189
1103d_pwquota: 189
1104gccversion: 189
1105libs: 186
1106useshrplib: 186
1107cppflags: 185
1108ptrsize: 185
1109shrpenv: 185
1110static_ext: 185
1111use5005threads: 185
1112uselargefiles: 185
1113alignbytes: 184
1114byteorder: 184
1115ccversion: 184
1116config_args: 184
1117cppminus: 184