When normalising @extspec, use the result of s/// in if() rather than m//
[p5sagit/p5-mst-13.2.git] / configpm
CommitLineData
a0d0e21e 1#!./miniperl -w
962e59f3 2#
3# configpm
4#
8ed6d636 5# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
6# 2002, 2003, 2004, 2005, 2006, 2007 Larry Wall and others.
962e59f3 7#
8#
9# Regenerate the files
10#
11# lib/Config.pm
12# lib/Config_heavy.pl
13# lib/Config.pod
14# lib/Cross.pm (optionally)
15#
8ed6d636 16#
962e59f3 17# from the contents of the static files
18#
19# Porting/Glossary
20# myconfig.SH
21#
22# and from the contents of the Configure-generated file
23#
24# config.sh
25#
8ed6d636 26# Note that output directory is xlib/[cross-name]/ for cross-compiling
27#
962e59f3 28# It will only update Config.pm and Config_heavy.pl if the contents of
29# either file would be different. Note that *both* files are updated in
30# this case, since for example an extension makefile that has a dependency
31# on Config.pm should trigger even if only Config_heavy.pl has changed.
32
33sub usage { die <<EOF }
d2d98f31 34usage: $0 [ options ]
962e59f3 35 --cross=PLATFORM cross-compile for a different platform
36 --no-glossary don't include Porting/Glossary in lib/Config.pod
962e59f3 37EOF
38
2f4f46ad 39use strict;
40use vars qw(%Config $Config_SH_expanded);
8990e307 41
a8e1d30b 42my $how_many_common = 22;
43
44# commonly used names to precache (and hence lookup fastest)
45my %Common;
46
47while ($how_many_common--) {
48 $_ = <DATA>;
49 chomp;
50 /^(\S+):\s*(\d+)$/ or die "Malformed line '$_'";
51 $Common{$1} = $1;
52}
5435c704 53
54# names of things which may need to have slashes changed to double-colons
55my %Extensions = map {($_,$_)}
56 qw(dynamic_ext static_ext extensions known_extensions);
57
58# allowed opts as well as specifies default and initial values
59my %Allowed_Opts = (
2d9d8159 60 'cross' => '', # --cross=PLATFORM - crosscompiling for PLATFORM
61 'glossary' => 1, # --no-glossary - no glossary file inclusion,
5435c704 62 # for compactness
18f68570 63);
18f68570 64
5435c704 65sub opts {
66 # user specified options
67 my %given_opts = (
68 # --opt=smth
69 (map {/^--([\-_\w]+)=(.*)$/} @ARGV),
70 # --opt --no-opt --noopt
71 (map {/^no-?(.*)$/i?($1=>0):($_=>1)} map {/^--([\-_\w]+)$/} @ARGV),
72 );
73
74 my %opts = (%Allowed_Opts, %given_opts);
75
76 for my $opt (grep {!exists $Allowed_Opts{$_}} keys %given_opts) {
962e59f3 77 warn "option '$opt' is not recognized";
78 usage;
5435c704 79 }
80 @ARGV = grep {!/^--/} @ARGV;
81
82 return %opts;
83}
18f68570 84
5435c704 85
86my %Opts = opts();
87
8ed6d636 88my ($Config_SH, $Config_PM, $Config_heavy, $Config_POD);
d2d98f31 89my $Glossary = 'Porting/Glossary';
5435c704 90
91if ($Opts{cross}) {
18f68570 92 # creating cross-platform config file
93 mkdir "xlib";
5435c704 94 mkdir "xlib/$Opts{cross}";
d2d98f31 95 $Config_PM = "xlib/$Opts{cross}/Config.pm";
8ed6d636 96 $Config_POD = "xlib/$Opts{cross}/Config.pod";
97 $Config_SH = "Cross/config-$Opts{cross}.sh";
18f68570 98}
99else {
d2d98f31 100 $Config_PM = "lib/Config.pm";
8ed6d636 101 $Config_POD = "lib/Config.pod";
102 $Config_SH = "config.sh";
18f68570 103}
d2d98f31 104($Config_heavy = $Config_PM) =~ s/\.pm$/_heavy.pl/;
105die "Can't automatically determine name for Config_heavy.pl from '$Config_PM'"
106 if $Config_heavy eq $Config_PM;
8990e307 107
962e59f3 108my $config_txt;
109my $heavy_txt;
2d9d8159 110
962e59f3 111$heavy_txt .= <<'ENDOFBEG';
2d9d8159 112# This file was created by configpm when Perl was built. Any changes
113# made to this file will be lost the next time perl is built.
114
115package Config;
116use strict;
117# use warnings; Pulls in Carp
118# use vars pulls in Carp
119ENDOFBEG
fec02dd3 120
9137345a 121my $myver = sprintf "%vd", $^V;
a0d0e21e 122
962e59f3 123$config_txt .= sprintf <<'ENDOFBEG', ($myver) x 3;
5435c704 124# This file was created by configpm when Perl was built. Any changes
125# made to this file will be lost the next time perl is built.
3c81428c 126
8990e307 127package Config;
2f4f46ad 128use strict;
129# use warnings; Pulls in Carp
130# use vars pulls in Carp
131@Config::EXPORT = qw(%%Config);
132@Config::EXPORT_OK = qw(myconfig config_sh config_vars config_re);
a48f8c77 133
43d06990 134# Need to stub all the functions to make code such as print Config::config_sh
135# keep working
136
137sub myconfig;
138sub config_sh;
139sub config_vars;
140sub config_re;
141
2f4f46ad 142my %%Export_Cache = map {($_ => 1)} (@Config::EXPORT, @Config::EXPORT_OK);
143
144our %%Config;
e3d0cac0 145
146# Define our own import method to avoid pulling in the full Exporter:
147sub import {
a48f8c77 148 my $pkg = shift;
2f4f46ad 149 @_ = @Config::EXPORT unless @_;
5435c704 150
a48f8c77 151 my @funcs = grep $_ ne '%%Config', @_;
152 my $export_Config = @funcs < @_ ? 1 : 0;
5435c704 153
2f4f46ad 154 no strict 'refs';
a48f8c77 155 my $callpkg = caller(0);
156 foreach my $func (@funcs) {
157 die sprintf qq{"%%s" is not exported by the %%s module\n},
158 $func, __PACKAGE__ unless $Export_Cache{$func};
159 *{$callpkg.'::'.$func} = \&{$func};
160 }
5435c704 161
a48f8c77 162 *{"$callpkg\::Config"} = \%%Config if $export_Config;
163 return;
e3d0cac0 164}
165
5435c704 166die "Perl lib version (%s) doesn't match executable version ($])"
167 unless $^V;
de98c553 168
5435c704 169$^V eq %s
a48f8c77 170 or die "Perl lib version (%s) doesn't match executable version (" .
171 sprintf("v%%vd",$^V) . ")";
a0d0e21e 172
8990e307 173ENDOFBEG
174
16d20bd9 175
5435c704 176my @non_v = ();
5435c704 177my @v_others = ();
178my $in_v = 0;
179my %Data = ();
180
a0d0e21e 181
1a9ca827 182my %seen_quotes;
2f4f46ad 183{
184 my ($name, $val);
8ed6d636 185 open(CONFIG_SH, $Config_SH) || die "Can't open $Config_SH: $!";
2f4f46ad 186 while (<CONFIG_SH>) {
a0d0e21e 187 next if m:^#!/bin/sh:;
5435c704 188
a02608de 189 # Catch PERL_CONFIG_SH=true and PERL_VERSION=n line from Configure.
d4de4258 190 s/^(\w+)=(true|\d+)\s*$/$1='$2'\n/ or m/^(\w+)='(.*)'$/;
3905a40f 191 my($k, $v) = ($1, $2);
5435c704 192
2000072c 193 # grandfather PATCHLEVEL and SUBVERSION and CONFIG
cceca5ed 194 if ($k) {
195 if ($k eq 'PERL_VERSION') {
196 push @v_others, "PATCHLEVEL='$v'\n";
197 }
198 elsif ($k eq 'PERL_SUBVERSION') {
199 push @v_others, "SUBVERSION='$v'\n";
200 }
a02608de 201 elsif ($k eq 'PERL_CONFIG_SH') {
2000072c 202 push @v_others, "CONFIG='$v'\n";
203 }
cceca5ed 204 }
5435c704 205
435ec615 206 # We can delimit things in config.sh with either ' or ".
207 unless ($in_v or m/^(\w+)=(['"])(.*\n)/){
a0d0e21e 208 push(@non_v, "#$_"); # not a name='value' line
209 next;
210 }
2f4f46ad 211 my $quote = $2;
5435c704 212 if ($in_v) {
213 $val .= $_;
214 }
215 else {
216 ($name,$val) = ($1,$3);
217 }
435ec615 218 $in_v = $val !~ /$quote\n/;
44a8e56a 219 next if $in_v;
a0d0e21e 220
5435c704 221 s,/,::,g if $Extensions{$name};
a0d0e21e 222
5435c704 223 $val =~ s/$quote\n?\z//;
3c81428c 224
5435c704 225 my $line = "$name=$quote$val$quote\n";
deeea481 226 push(@v_others, $line);
1a9ca827 227 $seen_quotes{$quote}++;
2f4f46ad 228 }
229 close CONFIG_SH;
5435c704 230}
2f4f46ad 231
1a9ca827 232# This is somewhat grim, but I want the code for parsing config.sh here and
233# now so that I can expand $Config{ivsize} and $Config{ivtype}
234
235my $fetch_string = <<'EOT';
236
237# Search for it in the big string
238sub fetch_string {
239 my($self, $key) = @_;
240
241EOT
242
243if ($seen_quotes{'"'}) {
244 # We need the full ' and " code
245 $fetch_string .= <<'EOT';
246 my $quote_type = "'";
247 my $marker = "$key=";
248
249 # Check for the common case, ' delimited
250 my $start = index($Config_SH_expanded, "\n$marker$quote_type");
251 # If that failed, check for " delimited
252 if ($start == -1) {
253 $quote_type = '"';
254 $start = index($Config_SH_expanded, "\n$marker$quote_type");
255 }
256EOT
257} else {
258 $fetch_string .= <<'EOT';
259 # We only have ' delimted.
260 my $start = index($Config_SH_expanded, "\n$key=\'");
261EOT
262}
263$fetch_string .= <<'EOT';
264 # Start can never be -1 now, as we've rigged the long string we're
265 # searching with an initial dummy newline.
266 return undef if $start == -1;
267
268 $start += length($key) + 3;
269
270EOT
271if (!$seen_quotes{'"'}) {
272 # Don't need the full ' and " code, or the eval expansion.
273 $fetch_string .= <<'EOT';
274 my $value = substr($Config_SH_expanded, $start,
275 index($Config_SH_expanded, "'\n", $start)
276 - $start);
277EOT
278} else {
279 $fetch_string .= <<'EOT';
280 my $value = substr($Config_SH_expanded, $start,
281 index($Config_SH_expanded, "$quote_type\n", $start)
282 - $start);
283
284 # If we had a double-quote, we'd better eval it so escape
285 # sequences and such can be interpolated. Since the incoming
286 # value is supposed to follow shell rules and not perl rules,
287 # we escape any perl variable markers
288 if ($quote_type eq '"') {
289 $value =~ s/\$/\\\$/g;
290 $value =~ s/\@/\\\@/g;
291 eval "\$value = \"$value\"";
292 }
293EOT
294}
295$fetch_string .= <<'EOT';
296 # So we can say "if $Config{'foo'}".
297 $value = undef if $value eq 'undef';
298 $self->{$key} = $value; # cache it
299}
300EOT
301
302eval $fetch_string;
303die if $@;
3c81428c 304
8468119f 305# Calculation for the keys for byteorder
306# This is somewhat grim, but I need to run fetch_string here.
deeea481 307our $Config_SH_expanded = join "\n", '', @v_others;
8468119f 308
309my $t = fetch_string ({}, 'ivtype');
310my $s = fetch_string ({}, 'ivsize');
311
312# byteorder does exist on its own but we overlay a virtual
313# dynamically recomputed value.
314
315# However, ivtype and ivsize will not vary for sane fat binaries
316
317my $f = $t eq 'long' ? 'L!' : $s == 8 ? 'Q': 'I';
318
319my $byteorder_code;
320if ($s == 4 || $s == 8) {
321 my $list = join ',', reverse(2..$s);
322 my $format = 'a'x$s;
323 $byteorder_code = <<"EOT";
2855b621 324
8468119f 325my \$i = 0;
326foreach my \$c ($list) { \$i |= ord(\$c); \$i <<= 8 }
327\$i |= ord(1);
2d9d8159 328our \$byteorder = join('', unpack('$format', pack('$f', \$i)));
8468119f 329EOT
330} else {
2d9d8159 331 $byteorder_code = "our \$byteorder = '?'x$s;\n";
8468119f 332}
333
88fe16b2 334my @need_relocation;
335
336if (fetch_string({},'userelocatableinc')) {
4d20abad 337 foreach my $what (qw(prefixexp
338
339 archlibexp
340 html1direxp
341 html3direxp
342 man1direxp
343 man3direxp
91f668c3 344 privlibexp
4d20abad 345 scriptdirexp
91f668c3 346 sitearchexp
4d20abad 347 sitebinexp
348 sitehtml1direxp
349 sitehtml3direxp
91f668c3 350 sitelibexp
4d20abad 351 siteman1direxp
352 siteman3direxp
353 sitescriptexp
91f668c3 354 vendorarchexp
4d20abad 355 vendorbinexp
356 vendorhtml1direxp
357 vendorhtml3direxp
91f668c3 358 vendorlibexp
4d20abad 359 vendorman1direxp
360 vendorman3direxp
361 vendorscriptexp
362
363 siteprefixexp
364 sitelib_stem
1d230ada 365 vendorlib_stem
366
367 installarchlib
368 installhtml1dir
369 installhtml3dir
370 installman1dir
371 installman3dir
372 installprefix
373 installprefixexp
374 installprivlib
375 installscript
376 installsitearch
377 installsitebin
378 installsitehtml1dir
379 installsitehtml3dir
380 installsitelib
381 installsiteman1dir
382 installsiteman3dir
383 installsitescript
384 installvendorarch
385 installvendorbin
386 installvendorhtml1dir
387 installvendorhtml3dir
388 installvendorlib
389 installvendorman1dir
390 installvendorman3dir
391 installvendorscript
392 )) {
88fe16b2 393 push @need_relocation, $what if fetch_string({}, $what) =~ m!^\.\.\./!;
394 }
88fe16b2 395}
396
397my %need_relocation;
398@need_relocation{@need_relocation} = @need_relocation;
399
91f668c3 400# This can have .../ anywhere:
401if (fetch_string({}, 'otherlibdirs') =~ m!\.\.\./!) {
402 $need_relocation{otherlibdirs} = 'otherlibdirs';
403}
404
88fe16b2 405my $relocation_code = <<'EOT';
406
407sub relocate_inc {
408 my $libdir = shift;
409 return $libdir unless $libdir =~ s!^\.\.\./!!;
410 my $prefix = $^X;
411 if ($prefix =~ s!/[^/]*$!!) {
412 while ($libdir =~ m!^\.\./!) {
413 # Loop while $libdir starts "../" and $prefix still has a trailing
414 # directory
415 last unless $prefix =~ s!/([^/]+)$!!;
416 # but bail out if the directory we picked off the end of $prefix is .
417 # or ..
418 if ($1 eq '.' or $1 eq '..') {
419 # Undo! This should be rare, hence code it this way rather than a
420 # check each time before the s!!! above.
421 $prefix = "$prefix/$1";
422 last;
423 }
424 # Remove that leading ../ and loop again
425 substr ($libdir, 0, 3, '');
426 }
427 $libdir = "$prefix/$libdir";
428 }
429 $libdir;
430}
431EOT
432
91f668c3 433if (%need_relocation) {
88fe16b2 434 my $relocations_in_common;
91f668c3 435 # otherlibdirs only features in the hash
436 foreach (keys %need_relocation) {
88fe16b2 437 $relocations_in_common++ if $Common{$_};
438 }
439 if ($relocations_in_common) {
962e59f3 440 $config_txt .= $relocation_code;
88fe16b2 441 } else {
962e59f3 442 $heavy_txt .= $relocation_code;
88fe16b2 443 }
444}
445
962e59f3 446$heavy_txt .= join('', @non_v) . "\n";
3c81428c 447
5435c704 448# copy config summary format from the myconfig.SH script
962e59f3 449$heavy_txt .= "our \$summary = <<'!END!';\n";
3b5ca523 450open(MYCONFIG,"<myconfig.SH") || die "open myconfig.SH failed: $!";
54310121 4511 while defined($_ = <MYCONFIG>) && !/^Summary of/;
962e59f3 452do { $heavy_txt .= $_ } until !defined($_ = <MYCONFIG>) || /^\s*$/;
3c81428c 453close(MYCONFIG);
a0d0e21e 454
962e59f3 455$heavy_txt .= "\n!END!\n" . <<'EOT';
90ec21fb 456my $summary_expanded;
3c81428c 457
458sub myconfig {
90ec21fb 459 return $summary_expanded if $summary_expanded;
460 ($summary_expanded = $summary) =~ s{\$(\w+)}
46807d8e 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 477local *_ = \my $a;
478$_ = <<'!END!';
3c81428c 479EOT
480
962e59f3 481$heavy_txt .= join('', sort @v_others) . "!END!\n";
2855b621 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 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 495}
496EOT
91f668c3 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 502s{^(otherlibdirs=)(['"])(.*?)\2}
503 {$1 . $2 . join ':', map {relocate_inc($_)} split ':', $3 . $2}me;
504EOT
505}
88fe16b2 506}
507
962e59f3 508$heavy_txt .= <<'EOT';
2d9d8159 509s/(byteorder=)(['"]).*?\2/$1$2$Config::byteorder$2/m;
43d06990 510
511my $config_sh_len = length $_;
3be00128 512
e935c5a4 513our $Config_SH_expanded = "\n$_" . << 'EOVIRTUAL';
8468119f 514EOT
515
06482b90 516foreach my $prefix (qw(ccflags ldflags)) {
517 my $value = fetch_string ({}, $prefix);
518 my $withlargefiles = fetch_string ({}, $prefix . "_uselargefiles");
27da23d5 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 525foreach my $prefix (qw(libs libswanted)) {
526 my $value = fetch_string ({}, $prefix);
27da23d5 527 my $withlf = fetch_string ({}, 'libswanted_uselargefiles');
528 next unless defined $withlf;
06482b90 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 546}
547
962e59f3 548$heavy_txt .= "EOVIRTUAL\n";
06482b90 549
46807d8e 550$heavy_txt .= <<'ENDOFGIT';
505afc73 551eval {
12d7e04d 552 # do not have hairy conniptions if this isnt available
553 require 'Config_git.pl';
554 $Config_SH_expanded .= $Config::Git_Data;
505afc73 555 1;
556} or warn "Warning: failed to load Config_git.pl, something strange about this perl...\n";
46807d8e 557ENDOFGIT
558
962e59f3 559$heavy_txt .= $fetch_string;
06482b90 560
962e59f3 561$config_txt .= <<'ENDOFEND';
06482b90 562
2d9d8159 563sub FETCH {
5435c704 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 571ENDOFEND
572
962e59f3 573$heavy_txt .= <<'ENDOFEND';
1a9ca827 574
3c81428c 575my $prevpos = 0;
576
a0d0e21e 577sub FIRSTKEY {
578 $prevpos = 0;
2ddb7828 579 substr($Config_SH_expanded, 1, index($Config_SH_expanded, '=') - 1 );
a0d0e21e 580}
581
582sub NEXTKEY {
1a9ca827 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 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 590ENDOFEND
591} else {
592 # Just ' quotes, so it's much easier.
962e59f3 593$heavy_txt .= <<'ENDOFEND';
1a9ca827 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 604 return 1 if exists($_[0]->{$_[1]});
605
1a9ca827 606 return(index($Config_SH_expanded, "\n$_[1]='") != -1
607ENDOFEND
608if ($seen_quotes{'"'}) {
962e59f3 609$heavy_txt .= <<'ENDOFEND';
1a9ca827 610 or index($Config_SH_expanded, "\n$_[1]=\"") != -1
611ENDOFEND
612}
962e59f3 613$heavy_txt .= <<'ENDOFEND';
5435c704 614 );
a0d0e21e 615}
616
3c81428c 617sub STORE { die "\%Config::Config is read-only\n" }
5435c704 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 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 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 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 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 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 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 686\$preconfig{dll_name} = '$dll';
687ENDOFSET
9193ea20 688} else {
962e59f3 689 $config_txt .= <<'ENDOFSET';
5435c704 690sub TIEHASH {
691 bless $_[1], $_[0];
692}
9193ea20 693ENDOFSET
694}
695
a8e1d30b 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 705 if ($key eq 'otherlibdirs') {
706 $value = "join (':', map {relocate_inc(\$_)} split (':', $value))";
707 } elsif ($need_relocation{$key}) {
88fe16b2 708 $value = "relocate_inc($value)";
709 }
a8e1d30b 710 } else {
711 $value = "undef";
712 }
713 $Common{$key} = "$qkey => $value";
714}
2855b621 715
716if ($Common{byteorder}) {
717 $Common{byteorder} = 'byteorder => $byteorder';
718}
719my $fast_config = join '', map { " $_,\n" } sort values %Common;
5435c704 720
938af39e 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 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 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 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 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 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 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 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 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 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 856=cut
857
ebc74a4b 858ENDOFTAIL
859
5435c704 860if ($Opts{glossary}) {
861 open(GLOS, "<$Glossary") or die "Can't open $Glossary: $!";
18f68570 862}
2f4f46ad 863my %seen = ();
864my $text = 0;
fb87c415 865$/ = '';
866
867sub process {
aade5aff 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 874=cut
875
fb87c415 876EOF
5435c704 877 print CONFIG_POD <<EOF;
fb87c415 878=head2 $c
879
bbc7dcd2 880=over 4
fb87c415 881
c90cd22b 882=cut
883
fb87c415 884EOF
aade5aff 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 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 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 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 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 918}
919
5435c704 920if ($Opts{glossary}) {
7701ffb5 921 <GLOS>; # Skip the "DO NOT EDIT"
922 <GLOS>; # Skip the preamble
18f68570 923 while (<GLOS>) {
924 process;
5435c704 925 print CONFIG_POD;
18f68570 926 }
fb87c415 927}
ebc74a4b 928
5435c704 929print CONFIG_POD <<'ENDOFTAIL';
ebc74a4b 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 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 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 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 995}
996
a0d0e21e 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 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 1010 ;
1011
5435c704 1012die "$0: error processing $Config_PM"
a0d0e21e 1013 if eval '$Config{"cc"} = 1'
1014 or eval 'delete $Config{"cc"}'
1015 ;
1016
1017
85e6fe83 1018exit 0;
a8e1d30b 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