This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add contact info for Simon Wistow in Porting/Maintainers.pl
[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 550$heavy_txt .= <<'ENDOFGIT';
505afc73 551eval {
12d7e04d
YO
552 # do not have hairy conniptions if this isnt available
553 require 'Config_git.pl';
554 $Config_SH_expanded .= $Config::Git_Data;
505afc73
YO
555 1;
556} or warn "Warning: failed to load Config_git.pl, something strange about this perl...\n";
46807d8e
YO
557ENDOFGIT
558
962e59f3 559$heavy_txt .= $fetch_string;
06482b90 560
962e59f3 561$config_txt .= <<'ENDOFEND';
06482b90 562
2d9d8159 563sub FETCH {
5435c704
NC
564 my($self, $key) = @_;
565
566 # check for cached value (which may be undef so we use exists not defined)
567 return $self->{$key} if exists $self->{$key};
568
06482b90 569 return $self->fetch_string($key);
a0d0e21e 570}
2d9d8159
NC
571ENDOFEND
572
962e59f3 573$heavy_txt .= <<'ENDOFEND';
1a9ca827 574
3c81428c 575my $prevpos = 0;
576
a0d0e21e
LW
577sub FIRSTKEY {
578 $prevpos = 0;
2ddb7828 579 substr($Config_SH_expanded, 1, index($Config_SH_expanded, '=') - 1 );
a0d0e21e
LW
580}
581
582sub NEXTKEY {
1a9ca827
NC
583ENDOFEND
584if ($seen_quotes{'"'}) {
962e59f3 585$heavy_txt .= <<'ENDOFEND';
435ec615 586 # Find out how the current key's quoted so we can skip to its end.
3be00128
NC
587 my $quote = substr($Config_SH_expanded,
588 index($Config_SH_expanded, "=", $prevpos)+1, 1);
589 my $pos = index($Config_SH_expanded, qq($quote\n), $prevpos) + 2;
1a9ca827
NC
590ENDOFEND
591} else {
592 # Just ' quotes, so it's much easier.
962e59f3 593$heavy_txt .= <<'ENDOFEND';
1a9ca827
NC
594 my $pos = index($Config_SH_expanded, qq('\n), $prevpos) + 2;
595ENDOFEND
596}
962e59f3 597$heavy_txt .= <<'ENDOFEND';
3be00128 598 my $len = index($Config_SH_expanded, "=", $pos) - $pos;
a0d0e21e 599 $prevpos = $pos;
3be00128 600 $len > 0 ? substr($Config_SH_expanded, $pos, $len) : undef;
85e6fe83 601}
a0d0e21e 602
2ddb7828 603sub EXISTS {
5435c704
NC
604 return 1 if exists($_[0]->{$_[1]});
605
1a9ca827
NC
606 return(index($Config_SH_expanded, "\n$_[1]='") != -1
607ENDOFEND
608if ($seen_quotes{'"'}) {
962e59f3 609$heavy_txt .= <<'ENDOFEND';
1a9ca827
NC
610 or index($Config_SH_expanded, "\n$_[1]=\"") != -1
611ENDOFEND
612}
962e59f3 613$heavy_txt .= <<'ENDOFEND';
5435c704 614 );
a0d0e21e
LW
615}
616
3c81428c 617sub STORE { die "\%Config::Config is read-only\n" }
5435c704
NC
618*DELETE = \&STORE;
619*CLEAR = \&STORE;
a0d0e21e 620
3c81428c 621
622sub config_sh {
43d06990 623 substr $Config_SH_expanded, 1, $config_sh_len;
748a9306 624}
9193ea20 625
626sub config_re {
627 my $re = shift;
3be00128
NC
628 return map { chomp; $_ } grep eval{ /^(?:$re)=/ }, split /^/,
629 $Config_SH_expanded;
9193ea20 630}
631
3c81428c 632sub config_vars {
307dc113 633 # implements -V:cfgvar option (see perlrun -V:)
a48f8c77 634 foreach (@_) {
307dc113 635 # find optional leading, trailing colons; and query-spec
4a305f6a 636 my ($notag,$qry,$lncont) = m/^(:)?(.*?)(:)?$/; # flags fore and aft,
307dc113
JC
637 # map colon-flags to print decorations
638 my $prfx = $notag ? '': "$qry="; # tag-prefix for print
639 my $lnend = $lncont ? ' ' : ";\n"; # line ending for print
4a305f6a 640
307dc113 641 # all config-vars are by definition \w only, any \W means regex
4a305f6a
JC
642 if ($qry =~ /\W/) {
643 my @matches = config_re($qry);
644 print map "$_$lnend", @matches ? @matches : "$qry: not found" if !$notag;
645 print map { s/\w+=//; "$_$lnend" } @matches ? @matches : "$qry: not found" if $notag;
a48f8c77 646 } else {
2d9d8159
NC
647 my $v = (exists $Config::Config{$qry}) ? $Config::Config{$qry}
648 : 'UNKNOWN';
a48f8c77 649 $v = 'undef' unless defined $v;
4a305f6a 650 print "${prfx}'${v}'$lnend";
a48f8c77 651 }
3c81428c 652 }
653}
654
2d9d8159
NC
655# Called by the real AUTOLOAD
656sub launcher {
657 undef &AUTOLOAD;
658 goto \&$Config::AUTOLOAD;
659}
660
6611;
9193ea20 662ENDOFEND
663
664if ($^O eq 'os2') {
962e59f3 665 $config_txt .= <<'ENDOFSET';
9193ea20 666my %preconfig;
667if ($OS2::is_aout) {
3be00128 668 my ($value, $v) = $Config_SH_expanded =~ m/^used_aout='(.*)'\s*$/m;
9193ea20 669 for (split ' ', $value) {
3be00128 670 ($v) = $Config_SH_expanded =~ m/^aout_$_='(.*)'\s*$/m;
9193ea20 671 $preconfig{$_} = $v eq 'undef' ? undef : $v;
672 }
673}
764df951 674$preconfig{d_fork} = undef unless $OS2::can_fork; # Some funny cases can't
9193ea20 675sub TIEHASH { bless {%preconfig} }
676ENDOFSET
a48f8c77
MS
677 # Extract the name of the DLL from the makefile to avoid duplication
678 my ($f) = grep -r, qw(GNUMakefile Makefile);
679 my $dll;
680 if (open my $fh, '<', $f) {
681 while (<$fh>) {
682 $dll = $1, last if /^PERL_DLL_BASE\s*=\s*(\S*)\s*$/;
683 }
30500b05 684 }
962e59f3 685 $config_txt .= <<ENDOFSET if $dll;
30500b05
IZ
686\$preconfig{dll_name} = '$dll';
687ENDOFSET
9193ea20 688} else {
962e59f3 689 $config_txt .= <<'ENDOFSET';
5435c704
NC
690sub TIEHASH {
691 bless $_[1], $_[0];
692}
9193ea20 693ENDOFSET
694}
695
a8e1d30b
NC
696foreach my $key (keys %Common) {
697 my $value = fetch_string ({}, $key);
698 # Is it safe on the LHS of => ?
699 my $qkey = $key =~ /^[A-Za-z_][A-Za-z0-9_]*$/ ? $key : "'$key'";
700 if (defined $value) {
701 # Quote things for a '' string
702 $value =~ s!\\!\\\\!g;
703 $value =~ s!'!\\'!g;
704 $value = "'$value'";
91f668c3
NC
705 if ($key eq 'otherlibdirs') {
706 $value = "join (':', map {relocate_inc(\$_)} split (':', $value))";
707 } elsif ($need_relocation{$key}) {
88fe16b2
NC
708 $value = "relocate_inc($value)";
709 }
a8e1d30b
NC
710 } else {
711 $value = "undef";
712 }
713 $Common{$key} = "$qkey => $value";
714}
2855b621
NC
715
716if ($Common{byteorder}) {
717 $Common{byteorder} = 'byteorder => $byteorder';
718}
719my $fast_config = join '', map { " $_,\n" } sort values %Common;
5435c704 720
938af39e
NC
721# Sanity check needed to stop an infite loop if Config_heavy.pl fails to define
722# &launcher for some reason (eg it got truncated)
962e59f3 723$config_txt .= sprintf <<'ENDOFTIE', $fast_config;
9193ea20 724
fb73857a 725sub DESTROY { }
726
2d9d8159 727sub AUTOLOAD {
c1b2b415 728 require 'Config_heavy.pl';
938af39e 729 goto \&launcher unless $Config::AUTOLOAD =~ /launcher$/;
2d9d8159
NC
730 die "&Config::AUTOLOAD failed on $Config::AUTOLOAD";
731}
732
2c165900 733# tie returns the object, so the value returned to require will be true.
5435c704 734tie %%Config, 'Config', {
a8e1d30b 735%s};
5435c704
NC
736ENDOFTIE
737
748a9306 738
8ed6d636 739open(CONFIG_POD, ">$Config_POD") or die "Can't open $Config_POD: $!";
5435c704 740print CONFIG_POD <<'ENDOFTAIL';
3c81428c 741=head1 NAME
a0d0e21e 742
3c81428c 743Config - access Perl configuration information
744
745=head1 SYNOPSIS
746
747 use Config;
63f18be6
NC
748 if ($Config{usethreads}) {
749 print "has thread support\n"
3c81428c 750 }
751
a48f8c77 752 use Config qw(myconfig config_sh config_vars config_re);
3c81428c 753
754 print myconfig();
755
756 print config_sh();
757
a48f8c77
MS
758 print config_re();
759
3c81428c 760 config_vars(qw(osname archname));
761
762
763=head1 DESCRIPTION
764
765The Config module contains all the information that was available to
766the C<Configure> program at Perl build time (over 900 values).
767
768Shell variables from the F<config.sh> file (written by Configure) are
769stored in the readonly-variable C<%Config>, indexed by their names.
770
771Values stored in config.sh as 'undef' are returned as undefined
1fef88e7 772values. The perl C<exists> function can be used to check if a
3c81428c 773named variable exists.
774
775=over 4
776
777=item myconfig()
778
779Returns a textual summary of the major perl configuration values.
780See also C<-V> in L<perlrun/Switches>.
781
782=item config_sh()
783
784Returns the entire perl configuration information in the form of the
785original config.sh shell variable assignment script.
786
a48f8c77
MS
787=item config_re($regex)
788
789Like config_sh() but returns, as a list, only the config entries who's
790names match the $regex.
791
3c81428c 792=item config_vars(@names)
793
794Prints to STDOUT the values of the named configuration variable. Each is
795printed on a separate line in the form:
796
797 name='value';
798
799Names which are unknown are output as C<name='UNKNOWN';>.
800See also C<-V:name> in L<perlrun/Switches>.
801
802=back
803
804=head1 EXAMPLE
805
806Here's a more sophisticated example of using %Config:
807
808 use Config;
743c51bc
W
809 use strict;
810
811 my %sig_num;
812 my @sig_name;
813 unless($Config{sig_name} && $Config{sig_num}) {
814 die "No sigs?";
815 } else {
816 my @names = split ' ', $Config{sig_name};
817 @sig_num{@names} = split ' ', $Config{sig_num};
818 foreach (@names) {
819 $sig_name[$sig_num{$_}] ||= $_;
820 }
821 }
3c81428c 822
743c51bc
W
823 print "signal #17 = $sig_name[17]\n";
824 if ($sig_num{ALRM}) {
825 print "SIGALRM is $sig_num{ALRM}\n";
3c81428c 826 }
827
828=head1 WARNING
829
830Because this information is not stored within the perl executable
831itself it is possible (but unlikely) that the information does not
832relate to the actual perl binary which is being used to access it.
833
834The Config module is installed into the architecture and version
835specific library directory ($Config{installarchlib}) and it checks the
836perl version number when loaded.
837
435ec615
HM
838The values stored in config.sh may be either single-quoted or
839double-quoted. Double-quoted strings are handy for those cases where you
840need to include escape sequences in the strings. To avoid runtime variable
841interpolation, any C<$> and C<@> characters are replaced by C<\$> and
842C<\@>, respectively. This isn't foolproof, of course, so don't embed C<\$>
843or C<\@> in double-quoted strings unless you're willing to deal with the
844consequences. (The slashes will end up escaped and the C<$> or C<@> will
845trigger variable interpolation)
846
ebc74a4b
GS
847=head1 GLOSSARY
848
849Most C<Config> variables are determined by the C<Configure> script
850on platforms supported by it (which is most UNIX platforms). Some
851platforms have custom-made C<Config> variables, and may thus not have
852some of the variables described below, or may have extraneous variables
853specific to that particular port. See the port specific documentation
854in such cases.
855
c90cd22b
RGS
856=cut
857
ebc74a4b
GS
858ENDOFTAIL
859
5435c704
NC
860if ($Opts{glossary}) {
861 open(GLOS, "<$Glossary") or die "Can't open $Glossary: $!";
18f68570 862}
2f4f46ad
NC
863my %seen = ();
864my $text = 0;
fb87c415
IZ
865$/ = '';
866
867sub process {
aade5aff
YST
868 if (s/\A(\w*)\s+\(([\w.]+)\):\s*\n(\t?)/=item C<$1>\n\nFrom F<$2>:\n\n/m) {
869 my $c = substr $1, 0, 1;
870 unless ($seen{$c}++) {
5435c704 871 print CONFIG_POD <<EOF if $text;
fb87c415 872=back
ebc74a4b 873
c90cd22b
RGS
874=cut
875
fb87c415 876EOF
5435c704 877 print CONFIG_POD <<EOF;
fb87c415
IZ
878=head2 $c
879
bbc7dcd2 880=over 4
fb87c415 881
c90cd22b
RGS
882=cut
883
fb87c415 884EOF
aade5aff
YST
885 $text = 1;
886 }
887 }
888 elsif (!$text || !/\A\t/) {
889 warn "Expected a Configure variable header",
890 ($text ? " or another paragraph of description" : () );
fb87c415
IZ
891 }
892 s/n't/n\00t/g; # leave can't, won't etc untouched
9b22980b 893 s/^\t\s+(.*)/\n$1/gm; # Indented lines ===> new paragraph
fb87c415
IZ
894 s/^(?<!\n\n)\t(.*)/$1/gm; # Not indented lines ===> text
895 s{([\'\"])(?=[^\'\"\s]*[./][^\'\"\s]*\1)([^\'\"\s]+)\1}(F<$2>)g; # '.o'
896 s{([\'\"])([^\'\"\s]+)\1}(C<$2>)g; # "date" command
897 s{\'([A-Za-z_\- *=/]+)\'}(C<$1>)g; # 'ln -s'
898 s{
899 (?<! [\w./<\'\"] ) # Only standalone file names
900 (?! e \. g \. ) # Not e.g.
901 (?! \. \. \. ) # Not ...
902 (?! \d ) # Not 5.004
a1151a3c
RGS
903 (?! read/ ) # Not read/write
904 (?! etc\. ) # Not etc.
905 (?! I/O ) # Not I/O
906 (
907 \$ ? # Allow leading $
908 [\w./]* [./] [\w./]* # Require . or / inside
909 )
910 (?<! \. (?= [\s)] ) ) # Do not include trailing dot
fb87c415
IZ
911 (?! [\w/] ) # Include all of it
912 }
913 (F<$1>)xg; # /usr/local
914 s/((?<=\s)~\w*)/F<$1>/g; # ~name
915 s/(?<![.<\'\"])\b([A-Z_]{2,})\b(?![\'\"])/C<$1>/g; # UNISTD
916 s/(?<![.<\'\"])\b(?!the\b)(\w+)\s+macro\b/C<$1> macro/g; # FILE_cnt macro
917 s/n[\0]t/n't/g; # undo can't, won't damage
ebc74a4b
GS
918}
919
5435c704 920if ($Opts{glossary}) {
7701ffb5
JH
921 <GLOS>; # Skip the "DO NOT EDIT"
922 <GLOS>; # Skip the preamble
18f68570
VK
923 while (<GLOS>) {
924 process;
5435c704 925 print CONFIG_POD;
18f68570 926 }
fb87c415 927}
ebc74a4b 928
5435c704 929print CONFIG_POD <<'ENDOFTAIL';
ebc74a4b
GS
930
931=back
932
3c81428c 933=head1 NOTE
934
935This module contains a good example of how to use tie to implement a
936cache and an example of how to make a tied variable readonly to those
937outside of it.
938
939=cut
a0d0e21e 940
9193ea20 941ENDOFTAIL
a0d0e21e 942
962e59f3 943close(GLOS) if $Opts{glossary};
5435c704 944close(CONFIG_POD);
8ed6d636 945print "written $Config_POD\n";
962e59f3
DM
946
947my $orig_config_txt = "";
948my $orig_heavy_txt = "";
949{
950 local $/;
951 my $fh;
952 $orig_config_txt = <$fh> if open $fh, "<", $Config_PM;
953 $orig_heavy_txt = <$fh> if open $fh, "<", $Config_heavy;
954}
955
956if ($orig_config_txt ne $config_txt or $orig_heavy_txt ne $heavy_txt) {
957 open CONFIG, ">", $Config_PM or die "Can't open $Config_PM: $!\n";
958 open CONFIG_HEAVY, ">", $Config_heavy or die "Can't open $Config_heavy: $!\n";
959 print CONFIG $config_txt;
960 print CONFIG_HEAVY $heavy_txt;
961 close(CONFIG_HEAVY);
962 close(CONFIG);
963 print "updated $Config_PM\n";
964 print "updated $Config_heavy\n";
965}
966
a0d0e21e 967
18f68570 968# Now create Cross.pm if needed
5435c704 969if ($Opts{cross}) {
18f68570 970 open CROSS, ">lib/Cross.pm" or die "Can not open >lib/Cross.pm: $!";
47bcb90d
VK
971 my $cross = <<'EOS';
972# typical invocation:
973# perl -MCross Makefile.PL
974# perl -MCross=wince -V:cc
975package Cross;
976
977sub import {
978 my ($package,$platform) = @_;
979 unless (defined $platform) {
980 # if $platform is not specified, then use last one when
981 # 'configpm; was invoked with --cross option
982 $platform = '***replace-marker***';
983 }
984 @INC = map {/\blib\b/?(do{local $_=$_;s/\blib\b/xlib\/$platform/;$_},$_):($_)} @INC;
e2a02c1e 985 $::Cross::platform = $platform;
18f68570 986}
47bcb90d 987
18f68570
VK
9881;
989EOS
5435c704 990 $cross =~ s/\*\*\*replace-marker\*\*\*/$Opts{cross}/g;
47bcb90d 991 print CROSS $cross;
18f68570 992 close CROSS;
962e59f3 993 print "written lib/Cross.pm\n";
42d1cefd 994 unshift(@INC,"xlib/$Opts{cross}");
18f68570
VK
995}
996
a0d0e21e
LW
997# Now do some simple tests on the Config.pm file we have created
998unshift(@INC,'lib');
27da23d5 999unshift(@INC,'xlib/symbian') if $Opts{cross};
5435c704 1000require $Config_PM;
ae7e4cc1 1001require $Config_heavy;
a0d0e21e
LW
1002import Config;
1003
5435c704 1004die "$0: $Config_PM not valid"
a02608de 1005 unless $Config{'PERL_CONFIG_SH'} eq 'true';
a0d0e21e 1006
5435c704 1007die "$0: error processing $Config_PM"
a0d0e21e 1008 if defined($Config{'an impossible name'})
a02608de 1009 or $Config{'PERL_CONFIG_SH'} ne 'true' # test cache
a0d0e21e
LW
1010 ;
1011
5435c704 1012die "$0: error processing $Config_PM"
a0d0e21e
LW
1013 if eval '$Config{"cc"} = 1'
1014 or eval 'delete $Config{"cc"}'
1015 ;
1016
1017
85e6fe83 1018exit 0;
a8e1d30b
NC
1019# Popularity of various entries in %Config, based on a large build and test
1020# run of code in the Fotango build system:
1021__DATA__
1022path_sep: 8490
1023d_readlink: 7101
1024d_symlink: 7101
1025archlibexp: 4318
1026sitearchexp: 4305
1027sitelibexp: 4305
1028privlibexp: 4163
1029ldlibpthname: 4041
1030libpth: 2134
1031archname: 1591
1032exe_ext: 1256
1033scriptdir: 1155
1034version: 1116
1035useithreads: 1002
1036osvers: 982
1037osname: 851
1038inc_version_list: 783
1039dont_use_nlink: 779
1040intsize: 759
1041usevendorprefix: 642
1042dlsrc: 624
1043cc: 541
1044lib_ext: 520
1045so: 512
1046ld: 501
1047ccdlflags: 500
1048ldflags: 495
1049obj_ext: 495
1050cccdlflags: 493
1051lddlflags: 493
1052ar: 492
1053dlext: 492
1054libc: 492
1055ranlib: 492
1056full_ar: 491
1057vendorarchexp: 491
1058vendorlibexp: 491
1059installman1dir: 489
1060installman3dir: 489
1061installsitebin: 489
1062installsiteman1dir: 489
1063installsiteman3dir: 489
1064installvendorman1dir: 489
1065installvendorman3dir: 489
1066d_flexfnam: 474
1067eunicefix: 360
1068d_link: 347
1069installsitearch: 344
1070installscript: 341
1071installprivlib: 337
1072binexp: 336
1073installarchlib: 336
1074installprefixexp: 336
1075installsitelib: 336
1076installstyle: 336
1077installvendorarch: 336
1078installvendorbin: 336
1079installvendorlib: 336
1080man1ext: 336
1081man3ext: 336
1082sh: 336
1083siteprefixexp: 336
1084installbin: 335
1085usedl: 332
1086ccflags: 285
1087startperl: 232
1088optimize: 231
1089usemymalloc: 229
1090cpprun: 228
1091sharpbang: 228
1092perllibs: 225
1093usesfio: 224
1094usethreads: 220
1095perlpath: 218
1096extensions: 217
1097usesocks: 208
1098shellflags: 198
1099make: 191
1100d_pwage: 189
1101d_pwchange: 189
1102d_pwclass: 189
1103d_pwcomment: 189
1104d_pwexpire: 189
1105d_pwgecos: 189
1106d_pwpasswd: 189
1107d_pwquota: 189
1108gccversion: 189
1109libs: 186
1110useshrplib: 186
1111cppflags: 185
1112ptrsize: 185
1113shrpenv: 185
1114static_ext: 185
1115use5005threads: 185
1116uselargefiles: 185
1117alignbytes: 184
1118byteorder: 184
1119ccversion: 184
1120config_args: 184
1121cppminus: 184