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