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