This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Unicode::UCD Add synopsis info for num() to pod
[perl5.git] / configpm
... / ...
CommitLineData
1#!./miniperl -w
2#
3# configpm
4#
5# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
6# 2002, 2003, 2004, 2005, 2006, 2007 Larry Wall and others.
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#
16#
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#
26# Note that output directory is xlib/[cross-name]/ for cross-compiling
27#
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 }
34usage: $0 [ options ]
35 --cross=PLATFORM cross-compile for a different platform
36 --no-glossary don't include Porting/Glossary in lib/Config.pod
37 --chdir=dir change directory before writing files
38EOF
39
40use strict;
41use vars qw(%Config $Config_SH_expanded);
42
43my $how_many_common = 22;
44
45# commonly used names to precache (and hence lookup fastest)
46my %Common;
47
48while ($how_many_common--) {
49 $_ = <DATA>;
50 chomp;
51 /^(\S+):\s*(\d+)$/ or die "Malformed line '$_'";
52 $Common{$1} = $1;
53}
54
55# Post 37589e1eefb1bd62 DynaLoader defaults to reading these at runtime.
56# Ideally we're redo the data below, but Fotango's build system made it
57# wonderfully easy to instrument, and no longer exists.
58$Common{$_} = $_ foreach qw(dlext so);
59
60# names of things which may need to have slashes changed to double-colons
61my %Extensions = map {($_,$_)}
62 qw(dynamic_ext static_ext extensions known_extensions);
63
64# The plan is that this information is used by ExtUtils::MakeMaker to generate
65# Makefile dependencies, rather than hardcoding a list, which has become out
66# of date. However, currently, MM_Unix.pm and MM_VMS.pm have *different* lists,
67# *and* descrip_mms.template doesn't actually install all the headers.
68# The "Unix" list seems to (attempt to) avoid the generated headers, which I'm
69# not sure is the right thing to do. Also, not certain whether it would be
70# easier to parse MANIFEST to get these (adding config.h, and potentially
71# removing others), but for now, stick to a hard coded list.
72
73# Could use a map to add ".h", but I suspect that it's easier to use literals,
74# so that anyone using grep will find them
75# This is the list from MM_VMS, plus pad.h, parser.h, perlsfio.h utf8.h
76# which it installs. It *doesn't* install perliol.h - FIXME.
77my @header_files = qw(EXTERN.h INTERN.h XSUB.h av.h config.h cop.h cv.h
78 embed.h embedvar.h form.h gv.h handy.h hv.h intrpvar.h
79 iperlsys.h keywords.h mg.h nostdio.h op.h opcode.h
80 pad.h parser.h patchlevel.h perl.h perlio.h perlsdio.h
81 perlsfio.h perlvars.h perly.h pp.h pp_proto.h proto.h
82 regcomp.h regexp.h regnodes.h scope.h sv.h thread.h utf8.h
83 util.h);
84
85# No point in adding fakethr.h, as it no longer works
86push @header_files,
87 $^O eq 'VMS' ? 'vmsish.h' : qw(dosish.h perliol.h time64.h unixish.h);
88
89my $header_files = ' return qw(' . join(' ', sort @header_files) . ');';
90$header_files =~ s/(?=.{64}) # If line is still overlength
91 (.{1,64})\ # Split at the last convenient space
92 /$1\n /gx;
93
94# allowed opts as well as specifies default and initial values
95my %Allowed_Opts = (
96 'cross' => '', # --cross=PLATFORM - crosscompiling for PLATFORM
97 'glossary' => 1, # --no-glossary - no glossary file inclusion,
98 # for compactness
99 'chdir' => '', # --chdir=dir - change directory before writing files
100);
101
102sub opts {
103 # user specified options
104 my %given_opts = (
105 # --opt=smth
106 (map {/^--([\-_\w]+)=(.*)$/} @ARGV),
107 # --opt --no-opt --noopt
108 (map {/^no-?(.*)$/i?($1=>0):($_=>1)} map {/^--([\-_\w]+)$/} @ARGV),
109 );
110
111 my %opts = (%Allowed_Opts, %given_opts);
112
113 for my $opt (grep {!exists $Allowed_Opts{$_}} keys %given_opts) {
114 warn "option '$opt' is not recognized";
115 usage;
116 }
117 @ARGV = grep {!/^--/} @ARGV;
118
119 return %opts;
120}
121
122
123my %Opts = opts();
124
125if ($Opts{chdir}) {
126 chdir $Opts{chdir} or die "$0: could not chdir $Opts{chdir}: $!"
127}
128
129my ($Config_SH, $Config_PM, $Config_heavy, $Config_POD);
130my $Glossary = 'Porting/Glossary';
131
132if ($Opts{cross}) {
133 # creating cross-platform config file
134 mkdir "xlib";
135 mkdir "xlib/$Opts{cross}";
136 $Config_PM = "xlib/$Opts{cross}/Config.pm";
137 $Config_POD = "xlib/$Opts{cross}/Config.pod";
138 $Config_SH = "Cross/config-$Opts{cross}.sh";
139}
140else {
141 $Config_PM = "lib/Config.pm";
142 $Config_POD = "lib/Config.pod";
143 $Config_SH = "config.sh";
144}
145($Config_heavy = $Config_PM) =~ s/\.pm$/_heavy.pl/;
146die "Can't automatically determine name for Config_heavy.pl from '$Config_PM'"
147 if $Config_heavy eq $Config_PM;
148
149my $config_txt;
150my $heavy_txt;
151
152$heavy_txt .= <<'ENDOFBEG';
153# This file was created by configpm when Perl was built. Any changes
154# made to this file will be lost the next time perl is built.
155
156package Config;
157use strict;
158use warnings;
159use vars '%Config';
160
161sub bincompat_options {
162 return split ' ', (Internals::V())[0];
163}
164
165sub non_bincompat_options {
166 return split ' ', (Internals::V())[1];
167}
168
169sub compile_date {
170 return (Internals::V())[2]
171}
172
173sub local_patches {
174 my (undef, undef, undef, @patches) = Internals::V();
175 return @patches;
176}
177
178sub _V {
179 my ($bincompat, $non_bincompat, $date, @patches) = Internals::V();
180
181 my $opts = join ' ', sort split ' ', "$bincompat $non_bincompat";
182
183 # wrap at 76 columns.
184
185 $opts =~ s/(?=.{53})(.{1,53}) /$1\n /mg;
186
187 print Config::myconfig();
188 if ($^O eq 'VMS') {
189 print "\nCharacteristics of this PERLSHR image: \n";
190 } else {
191 print "\nCharacteristics of this binary (from libperl): \n";
192 }
193
194 print " Compile-time options: $opts\n";
195
196 if (@patches) {
197 print " Locally applied patches:\n";
198 print "\t$_\n" foreach @patches;
199 }
200
201 print " Built under $^O\n";
202
203 print " $date\n" if defined $date;
204
205 my @env = map { "$_=\"$ENV{$_}\"" } sort grep {/^PERL/} keys %ENV;
206 push @env, "CYGWIN=\"$ENV{CYGWIN}\"" if $^O eq 'cygwin' and $ENV{CYGWIN};
207
208 if (@env) {
209 print " \%ENV:\n";
210 print " $_\n" foreach @env;
211 }
212 print " \@INC:\n";
213 print " $_\n" foreach @INC;
214}
215
216sub header_files {
217ENDOFBEG
218
219$heavy_txt .= $header_files . "\n}\n\n";
220
221my $export_funcs = <<'EOT';
222my %Export_Cache = (myconfig => 1, config_sh => 1, config_vars => 1,
223 config_re => 1, compile_date => 1, local_patches => 1,
224 bincompat_options => 1, non_bincompat_options => 1,
225 header_files => 1);
226EOT
227
228my %export_ok = eval $export_funcs or die;
229
230$config_txt .= sprintf << 'EOT', $export_funcs;
231# This file was created by configpm when Perl was built. Any changes
232# made to this file will be lost the next time perl is built.
233
234# for a description of the variables, please have a look at the
235# Glossary file, as written in the Porting folder, or use the url:
236# http://perl5.git.perl.org/perl.git/blob/HEAD:/Porting/Glossary
237
238package Config;
239use strict;
240use warnings;
241use vars '%%Config';
242
243# Skip @Config::EXPORT because it only contains %%Config, which we special
244# case below as it's not a function. @Config::EXPORT won't change in the
245# lifetime of Perl 5.
246%s
247@Config::EXPORT = qw(%%Config);
248@Config::EXPORT_OK = keys %%Export_Cache;
249
250# Need to stub all the functions to make code such as print Config::config_sh
251# keep working
252
253EOT
254
255$config_txt .= "sub $_;\n" foreach sort keys %export_ok;
256
257my $myver = sprintf "%vd", $^V;
258
259$config_txt .= sprintf <<'ENDOFBEG', ($myver) x 3;
260
261# Define our own import method to avoid pulling in the full Exporter:
262sub import {
263 shift;
264 @_ = @Config::EXPORT unless @_;
265
266 my @funcs = grep $_ ne '%%Config', @_;
267 my $export_Config = @funcs < @_ ? 1 : 0;
268
269 no strict 'refs';
270 my $callpkg = caller(0);
271 foreach my $func (@funcs) {
272 die qq{"$func" is not exported by the Config module\n}
273 unless $Export_Cache{$func};
274 *{$callpkg.'::'.$func} = \&{$func};
275 }
276
277 *{"$callpkg\::Config"} = \%%Config if $export_Config;
278 return;
279}
280
281die "Perl lib version (%s) doesn't match executable '$0' version ($])"
282 unless $^V;
283
284$^V eq %s
285 or die "Perl lib version (%s) doesn't match executable '$0' version (" .
286 sprintf("v%%vd",$^V) . ")";
287
288ENDOFBEG
289
290
291my @non_v = ();
292my @v_others = ();
293my $in_v = 0;
294my %Data = ();
295my $quote;
296
297
298my %seen_quotes;
299{
300 my ($name, $val);
301 open(CONFIG_SH, $Config_SH) || die "Can't open $Config_SH: $!";
302 while (<CONFIG_SH>) {
303 next if m:^#!/bin/sh:;
304
305 # Catch PERL_CONFIG_SH=true and PERL_VERSION=n line from Configure.
306 s/^(\w+)=(true|\d+)\s*$/$1='$2'\n/ or m/^(\w+)='(.*)'$/;
307 my($k, $v) = ($1, $2);
308
309 # grandfather PATCHLEVEL and SUBVERSION and CONFIG
310 if ($k) {
311 if ($k eq 'PERL_VERSION') {
312 push @v_others, "PATCHLEVEL='$v'\n";
313 }
314 elsif ($k eq 'PERL_SUBVERSION') {
315 push @v_others, "SUBVERSION='$v'\n";
316 }
317 elsif ($k eq 'PERL_CONFIG_SH') {
318 push @v_others, "CONFIG='$v'\n";
319 }
320 }
321
322 # We can delimit things in config.sh with either ' or ".
323 unless ($in_v or m/^(\w+)=(['"])(.*\n)/){
324 push(@non_v, "#$_"); # not a name='value' line
325 next;
326 }
327 if ($in_v) {
328 $val .= $_;
329 }
330 else {
331 $quote = $2;
332 ($name,$val) = ($1,$3);
333 }
334 $in_v = $val !~ /$quote\n/;
335 next if $in_v;
336
337 s,/,::,g if $Extensions{$name};
338
339 $val =~ s/$quote\n?\z//;
340
341 my $line = "$name=$quote$val$quote\n";
342 push(@v_others, $line);
343 $seen_quotes{$quote}++;
344 }
345 close CONFIG_SH;
346}
347
348# This is somewhat grim, but I want the code for parsing config.sh here and
349# now so that I can expand $Config{ivsize} and $Config{ivtype}
350
351my $fetch_string = <<'EOT';
352
353# Search for it in the big string
354sub fetch_string {
355 my($self, $key) = @_;
356
357EOT
358
359if ($seen_quotes{'"'}) {
360 # We need the full ' and " code
361
362$fetch_string .= <<'EOT';
363 return undef unless my ($quote_type, $value) = $Config_SH_expanded =~ /\n$key=(['"])(.*?)\1\n/s;
364
365 # If we had a double-quote, we'd better eval it so escape
366 # sequences and such can be interpolated. Since the incoming
367 # value is supposed to follow shell rules and not perl rules,
368 # we escape any perl variable markers
369
370 # Historically, since " 'support' was added in change 1409, the
371 # interpolation was done before the undef. Stick to this arguably buggy
372 # behaviour as we're refactoring.
373 if ($quote_type eq '"') {
374 $value =~ s/\$/\\\$/g;
375 $value =~ s/\@/\\\@/g;
376 eval "\$value = \"$value\"";
377 }
378
379 # So we can say "if $Config{'foo'}".
380 $self->{$key} = $value eq 'undef' ? undef : $value; # cache it
381}
382EOT
383
384} else {
385 # We only have ' delimted.
386
387$fetch_string .= <<'EOT';
388 return undef unless $Config_SH_expanded =~ /\n$key=\'(.*?)\'\n/s;
389 # So we can say "if $Config{'foo'}".
390 $self->{$key} = $1 eq 'undef' ? undef : $1;
391}
392EOT
393
394}
395
396eval $fetch_string;
397die if $@;
398
399# Calculation for the keys for byteorder
400# This is somewhat grim, but I need to run fetch_string here.
401our $Config_SH_expanded = join "\n", '', @v_others;
402
403my $t = fetch_string ({}, 'ivtype');
404my $s = fetch_string ({}, 'ivsize');
405
406# byteorder does exist on its own but we overlay a virtual
407# dynamically recomputed value.
408
409# However, ivtype and ivsize will not vary for sane fat binaries
410
411my $f = $t eq 'long' ? 'L!' : $s == 8 ? 'Q': 'I';
412
413my $byteorder_code;
414if ($s == 4 || $s == 8) {
415 my $list = join ',', reverse(1..$s-1);
416 my $format = 'a'x$s;
417 $byteorder_code = <<"EOT";
418
419my \$i = ord($s);
420foreach my \$c ($list) { \$i <<= 8; \$i |= ord(\$c); }
421our \$byteorder = join('', unpack('$format', pack('$f', \$i)));
422EOT
423} else {
424 $byteorder_code = "our \$byteorder = '?'x$s;\n";
425}
426
427my @need_relocation;
428
429if (fetch_string({},'userelocatableinc')) {
430 foreach my $what (qw(prefixexp
431
432 archlibexp
433 html1direxp
434 html3direxp
435 man1direxp
436 man3direxp
437 privlibexp
438 scriptdirexp
439 sitearchexp
440 sitebinexp
441 sitehtml1direxp
442 sitehtml3direxp
443 sitelibexp
444 siteman1direxp
445 siteman3direxp
446 sitescriptexp
447 vendorarchexp
448 vendorbinexp
449 vendorhtml1direxp
450 vendorhtml3direxp
451 vendorlibexp
452 vendorman1direxp
453 vendorman3direxp
454 vendorscriptexp
455
456 siteprefixexp
457 sitelib_stem
458 vendorlib_stem
459
460 installarchlib
461 installhtml1dir
462 installhtml3dir
463 installman1dir
464 installman3dir
465 installprefix
466 installprefixexp
467 installprivlib
468 installscript
469 installsitearch
470 installsitebin
471 installsitehtml1dir
472 installsitehtml3dir
473 installsitelib
474 installsiteman1dir
475 installsiteman3dir
476 installsitescript
477 installvendorarch
478 installvendorbin
479 installvendorhtml1dir
480 installvendorhtml3dir
481 installvendorlib
482 installvendorman1dir
483 installvendorman3dir
484 installvendorscript
485 )) {
486 push @need_relocation, $what if fetch_string({}, $what) =~ m!^\.\.\./!;
487 }
488}
489
490my %need_relocation;
491@need_relocation{@need_relocation} = @need_relocation;
492
493# This can have .../ anywhere:
494if (fetch_string({}, 'otherlibdirs') =~ m!\.\.\./!) {
495 $need_relocation{otherlibdirs} = 'otherlibdirs';
496}
497
498my $relocation_code = <<'EOT';
499
500sub relocate_inc {
501 my $libdir = shift;
502 return $libdir unless $libdir =~ s!^\.\.\./!!;
503 my $prefix = $^X;
504 if ($prefix =~ s!/[^/]*$!!) {
505 while ($libdir =~ m!^\.\./!) {
506 # Loop while $libdir starts "../" and $prefix still has a trailing
507 # directory
508 last unless $prefix =~ s!/([^/]+)$!!;
509 # but bail out if the directory we picked off the end of $prefix is .
510 # or ..
511 if ($1 eq '.' or $1 eq '..') {
512 # Undo! This should be rare, hence code it this way rather than a
513 # check each time before the s!!! above.
514 $prefix = "$prefix/$1";
515 last;
516 }
517 # Remove that leading ../ and loop again
518 substr ($libdir, 0, 3, '');
519 }
520 $libdir = "$prefix/$libdir";
521 }
522 $libdir;
523}
524EOT
525
526if (%need_relocation) {
527 my $relocations_in_common;
528 # otherlibdirs only features in the hash
529 foreach (keys %need_relocation) {
530 $relocations_in_common++ if $Common{$_};
531 }
532 if ($relocations_in_common) {
533 $config_txt .= $relocation_code;
534 } else {
535 $heavy_txt .= $relocation_code;
536 }
537}
538
539$heavy_txt .= join('', @non_v) . "\n";
540
541# copy config summary format from the myconfig.SH script
542$heavy_txt .= "our \$summary = <<'!END!';\n";
543open(MYCONFIG,"<myconfig.SH") || die "open myconfig.SH failed: $!";
5441 while defined($_ = <MYCONFIG>) && !/^Summary of/;
545do { $heavy_txt .= $_ } until !defined($_ = <MYCONFIG>) || /^\s*$/;
546close(MYCONFIG);
547
548$heavy_txt .= "\n!END!\n" . <<'EOT';
549my $summary_expanded;
550
551sub myconfig {
552 return $summary_expanded if $summary_expanded;
553 ($summary_expanded = $summary) =~ s{\$(\w+)}
554 {
555 my $c;
556 if ($1 eq 'git_ancestor_line') {
557 if ($Config::Config{git_ancestor}) {
558 $c= "\n Ancestor: $Config::Config{git_ancestor}";
559 } else {
560 $c= "";
561 }
562 } else {
563 $c = $Config::Config{$1};
564 }
565 defined($c) ? $c : 'undef'
566 }ge;
567 $summary_expanded;
568}
569
570local *_ = \my $a;
571$_ = <<'!END!';
572EOT
573
574$heavy_txt .= join('', sort @v_others) . "!END!\n";
575
576# Only need the dynamic byteorder code in Config.pm if 'byteorder' is one of
577# the precached keys
578if ($Common{byteorder}) {
579 $config_txt .= $byteorder_code;
580} else {
581 $heavy_txt .= $byteorder_code;
582}
583
584if (@need_relocation) {
585$heavy_txt .= 'foreach my $what (qw(' . join (' ', @need_relocation) .
586 ")) {\n" . <<'EOT';
587 s/^($what=)(['"])(.*?)\2/$1 . $2 . relocate_inc($3) . $2/me;
588}
589EOT
590# Currently it only makes sense to do the ... relocation on Unix, so there's
591# no need to emulate the "which separator for this platform" logic in perl.c -
592# ':' will always be applicable
593if ($need_relocation{otherlibdirs}) {
594$heavy_txt .= << 'EOT';
595s{^(otherlibdirs=)(['"])(.*?)\2}
596 {$1 . $2 . join ':', map {relocate_inc($_)} split ':', $3 . $2}me;
597EOT
598}
599}
600
601$heavy_txt .= <<'EOT';
602s/(byteorder=)(['"]).*?\2/$1$2$Config::byteorder$2/m;
603
604my $config_sh_len = length $_;
605
606our $Config_SH_expanded = "\n$_" . << 'EOVIRTUAL';
607EOT
608
609foreach my $prefix (qw(ccflags ldflags)) {
610 my $value = fetch_string ({}, $prefix);
611 my $withlargefiles = fetch_string ({}, $prefix . "_uselargefiles");
612 if (defined $withlargefiles) {
613 $value =~ s/\Q$withlargefiles\E\b//;
614 $heavy_txt .= "${prefix}_nolargefiles='$value'\n";
615 }
616}
617
618foreach my $prefix (qw(libs libswanted)) {
619 my $value = fetch_string ({}, $prefix);
620 my $withlf = fetch_string ({}, 'libswanted_uselargefiles');
621 next unless defined $withlf;
622 my @lflibswanted
623 = split(' ', fetch_string ({}, 'libswanted_uselargefiles'));
624 if (@lflibswanted) {
625 my %lflibswanted;
626 @lflibswanted{@lflibswanted} = ();
627 if ($prefix eq 'libs') {
628 my @libs = grep { /^-l(.+)/ &&
629 not exists $lflibswanted{$1} }
630 split(' ', fetch_string ({}, 'libs'));
631 $value = join(' ', @libs);
632 } else {
633 my @libswanted = grep { not exists $lflibswanted{$_} }
634 split(' ', fetch_string ({}, 'libswanted'));
635 $value = join(' ', @libswanted);
636 }
637 }
638 $heavy_txt .= "${prefix}_nolargefiles='$value'\n";
639}
640
641$heavy_txt .= "EOVIRTUAL\n";
642
643$heavy_txt .= <<'ENDOFGIT';
644eval {
645 # do not have hairy conniptions if this isnt available
646 require 'Config_git.pl';
647 $Config_SH_expanded .= $Config::Git_Data;
648 1;
649} or warn "Warning: failed to load Config_git.pl, something strange about this perl...\n";
650ENDOFGIT
651
652$heavy_txt .= $fetch_string;
653
654$config_txt .= <<'ENDOFEND';
655
656sub FETCH {
657 my($self, $key) = @_;
658
659 # check for cached value (which may be undef so we use exists not defined)
660 return exists $self->{$key} ? $self->{$key} : $self->fetch_string($key);
661}
662
663ENDOFEND
664
665$heavy_txt .= <<'ENDOFEND';
666
667my $prevpos = 0;
668
669sub FIRSTKEY {
670 $prevpos = 0;
671 substr($Config_SH_expanded, 1, index($Config_SH_expanded, '=') - 1 );
672}
673
674sub NEXTKEY {
675ENDOFEND
676if ($seen_quotes{'"'}) {
677$heavy_txt .= <<'ENDOFEND';
678 # Find out how the current key's quoted so we can skip to its end.
679 my $quote = substr($Config_SH_expanded,
680 index($Config_SH_expanded, "=", $prevpos)+1, 1);
681 my $pos = index($Config_SH_expanded, qq($quote\n), $prevpos) + 2;
682ENDOFEND
683} else {
684 # Just ' quotes, so it's much easier.
685$heavy_txt .= <<'ENDOFEND';
686 my $pos = index($Config_SH_expanded, qq('\n), $prevpos) + 2;
687ENDOFEND
688}
689$heavy_txt .= <<'ENDOFEND';
690 my $len = index($Config_SH_expanded, "=", $pos) - $pos;
691 $prevpos = $pos;
692 $len > 0 ? substr($Config_SH_expanded, $pos, $len) : undef;
693}
694
695sub EXISTS {
696 return 1 if exists($_[0]->{$_[1]});
697
698 return(index($Config_SH_expanded, "\n$_[1]='") != -1
699ENDOFEND
700if ($seen_quotes{'"'}) {
701$heavy_txt .= <<'ENDOFEND';
702 or index($Config_SH_expanded, "\n$_[1]=\"") != -1
703ENDOFEND
704}
705$heavy_txt .= <<'ENDOFEND';
706 );
707}
708
709sub STORE { die "\%Config::Config is read-only\n" }
710*DELETE = *CLEAR = \*STORE; # Typeglob aliasing uses less space
711
712sub config_sh {
713 substr $Config_SH_expanded, 1, $config_sh_len;
714}
715
716sub config_re {
717 my $re = shift;
718 return map { chomp; $_ } grep eval{ /^(?:$re)=/ }, split /^/,
719 $Config_SH_expanded;
720}
721
722sub config_vars {
723 # implements -V:cfgvar option (see perlrun -V:)
724 foreach (@_) {
725 # find optional leading, trailing colons; and query-spec
726 my ($notag,$qry,$lncont) = m/^(:)?(.*?)(:)?$/; # flags fore and aft,
727 # map colon-flags to print decorations
728 my $prfx = $notag ? '': "$qry="; # tag-prefix for print
729 my $lnend = $lncont ? ' ' : ";\n"; # line ending for print
730
731 # all config-vars are by definition \w only, any \W means regex
732 if ($qry =~ /\W/) {
733 my @matches = config_re($qry);
734 print map "$_$lnend", @matches ? @matches : "$qry: not found" if !$notag;
735 print map { s/\w+=//; "$_$lnend" } @matches ? @matches : "$qry: not found" if $notag;
736 } else {
737 my $v = (exists $Config::Config{$qry}) ? $Config::Config{$qry}
738 : 'UNKNOWN';
739 $v = 'undef' unless defined $v;
740 print "${prfx}'${v}'$lnend";
741 }
742 }
743}
744
745# Called by the real AUTOLOAD
746sub launcher {
747 undef &AUTOLOAD;
748 goto \&$Config::AUTOLOAD;
749}
750
7511;
752ENDOFEND
753
754if ($^O eq 'os2') {
755 $config_txt .= <<'ENDOFSET';
756my %preconfig;
757if ($OS2::is_aout) {
758 my ($value, $v) = $Config_SH_expanded =~ m/^used_aout='(.*)'\s*$/m;
759 for (split ' ', $value) {
760 ($v) = $Config_SH_expanded =~ m/^aout_$_='(.*)'\s*$/m;
761 $preconfig{$_} = $v eq 'undef' ? undef : $v;
762 }
763}
764$preconfig{d_fork} = undef unless $OS2::can_fork; # Some funny cases can't
765sub TIEHASH { bless {%preconfig} }
766ENDOFSET
767 # Extract the name of the DLL from the makefile to avoid duplication
768 my ($f) = grep -r, qw(GNUMakefile Makefile);
769 my $dll;
770 if (open my $fh, '<', $f) {
771 while (<$fh>) {
772 $dll = $1, last if /^PERL_DLL_BASE\s*=\s*(\S*)\s*$/;
773 }
774 }
775 $config_txt .= <<ENDOFSET if $dll;
776\$preconfig{dll_name} = '$dll';
777ENDOFSET
778} else {
779 $config_txt .= <<'ENDOFSET';
780sub TIEHASH {
781 bless $_[1], $_[0];
782}
783ENDOFSET
784}
785
786foreach my $key (keys %Common) {
787 my $value = fetch_string ({}, $key);
788 # Is it safe on the LHS of => ?
789 my $qkey = $key =~ /^[A-Za-z_][A-Za-z0-9_]*$/ ? $key : "'$key'";
790 if (defined $value) {
791 # Quote things for a '' string
792 $value =~ s!\\!\\\\!g;
793 $value =~ s!'!\\'!g;
794 $value = "'$value'";
795 if ($key eq 'otherlibdirs') {
796 $value = "join (':', map {relocate_inc(\$_)} split (':', $value))";
797 } elsif ($need_relocation{$key}) {
798 $value = "relocate_inc($value)";
799 }
800 } else {
801 $value = "undef";
802 }
803 $Common{$key} = "$qkey => $value";
804}
805
806if ($Common{byteorder}) {
807 $Common{byteorder} = 'byteorder => $byteorder';
808}
809my $fast_config = join '', map { " $_,\n" } sort values %Common;
810
811# Sanity check needed to stop an infite loop if Config_heavy.pl fails to define
812# &launcher for some reason (eg it got truncated)
813$config_txt .= sprintf <<'ENDOFTIE', $fast_config;
814
815sub DESTROY { }
816
817sub AUTOLOAD {
818 require 'Config_heavy.pl';
819 goto \&launcher unless $Config::AUTOLOAD =~ /launcher$/;
820 die "&Config::AUTOLOAD failed on $Config::AUTOLOAD";
821}
822
823# tie returns the object, so the value returned to require will be true.
824tie %%Config, 'Config', {
825%s};
826ENDOFTIE
827
828
829open(CONFIG_POD, ">$Config_POD") or die "Can't open $Config_POD: $!";
830print CONFIG_POD <<'ENDOFTAIL';
831=head1 NAME
832
833Config - access Perl configuration information
834
835=head1 SYNOPSIS
836
837 use Config;
838 if ($Config{usethreads}) {
839 print "has thread support\n"
840 }
841
842 use Config qw(myconfig config_sh config_vars config_re);
843
844 print myconfig();
845
846 print config_sh();
847
848 print config_re();
849
850 config_vars(qw(osname archname));
851
852
853=head1 DESCRIPTION
854
855The Config module contains all the information that was available to
856the C<Configure> program at Perl build time (over 900 values).
857
858Shell variables from the F<config.sh> file (written by Configure) are
859stored in the readonly-variable C<%Config>, indexed by their names.
860
861Values stored in config.sh as 'undef' are returned as undefined
862values. The perl C<exists> function can be used to check if a
863named variable exists.
864
865For a description of the variables, please have a look at the
866Glossary file, as written in the Porting folder, or use the url:
867http://perl5.git.perl.org/perl.git/blob/HEAD:/Porting/Glossary
868
869=over 4
870
871=item myconfig()
872
873Returns a textual summary of the major perl configuration values.
874See also C<-V> in L<perlrun/Command Switches>.
875
876=item config_sh()
877
878Returns the entire perl configuration information in the form of the
879original config.sh shell variable assignment script.
880
881=item config_re($regex)
882
883Like config_sh() but returns, as a list, only the config entries who's
884names match the $regex.
885
886=item config_vars(@names)
887
888Prints to STDOUT the values of the named configuration variable. Each is
889printed on a separate line in the form:
890
891 name='value';
892
893Names which are unknown are output as C<name='UNKNOWN';>.
894See also C<-V:name> in L<perlrun/Command Switches>.
895
896=item bincompat_options()
897
898Returns a list of C pre-processor options used when compiling this F<perl>
899binary, which affect its binary compatibility with extensions.
900C<bincompat_options()> and C<non_bincompat_options()> are shown together in
901the output of C<perl -V> as I<Compile-time options>.
902
903=item non_bincompat_options()
904
905Returns a list of C pre-processor options used when compiling this F<perl>
906binary, which do not affect binary compatibility with extensions.
907
908=item compile_date()
909
910Returns the compile date (as a string), equivalent to what is shown by
911C<perl -V>
912
913=item local_patches()
914
915Returns a list of the names of locally applied patches, equivalent to what
916is shown by C<perl -V>.
917
918=item header_files()
919
920Returns a list of the header files that should be used as dependencies for
921XS code, for this version of Perl on this platform.
922
923=back
924
925=head1 EXAMPLE
926
927Here's a more sophisticated example of using %Config:
928
929 use Config;
930 use strict;
931
932 my %sig_num;
933 my @sig_name;
934 unless($Config{sig_name} && $Config{sig_num}) {
935 die "No sigs?";
936 } else {
937 my @names = split ' ', $Config{sig_name};
938 @sig_num{@names} = split ' ', $Config{sig_num};
939 foreach (@names) {
940 $sig_name[$sig_num{$_}] ||= $_;
941 }
942 }
943
944 print "signal #17 = $sig_name[17]\n";
945 if ($sig_num{ALRM}) {
946 print "SIGALRM is $sig_num{ALRM}\n";
947 }
948
949=head1 WARNING
950
951Because this information is not stored within the perl executable
952itself it is possible (but unlikely) that the information does not
953relate to the actual perl binary which is being used to access it.
954
955The Config module is installed into the architecture and version
956specific library directory ($Config{installarchlib}) and it checks the
957perl version number when loaded.
958
959The values stored in config.sh may be either single-quoted or
960double-quoted. Double-quoted strings are handy for those cases where you
961need to include escape sequences in the strings. To avoid runtime variable
962interpolation, any C<$> and C<@> characters are replaced by C<\$> and
963C<\@>, respectively. This isn't foolproof, of course, so don't embed C<\$>
964or C<\@> in double-quoted strings unless you're willing to deal with the
965consequences. (The slashes will end up escaped and the C<$> or C<@> will
966trigger variable interpolation)
967
968=head1 GLOSSARY
969
970Most C<Config> variables are determined by the C<Configure> script
971on platforms supported by it (which is most UNIX platforms). Some
972platforms have custom-made C<Config> variables, and may thus not have
973some of the variables described below, or may have extraneous variables
974specific to that particular port. See the port specific documentation
975in such cases.
976
977=cut
978
979ENDOFTAIL
980
981if ($Opts{glossary}) {
982 open(GLOS, "<$Glossary") or die "Can't open $Glossary: $!";
983}
984my %seen = ();
985my $text = 0;
986$/ = '';
987
988sub process {
989 if (s/\A(\w*)\s+\(([\w.]+)\):\s*\n(\t?)/=item C<$1>\n\nFrom F<$2>:\n\n/m) {
990 my $c = substr $1, 0, 1;
991 unless ($seen{$c}++) {
992 print CONFIG_POD <<EOF if $text;
993=back
994
995=cut
996
997EOF
998 print CONFIG_POD <<EOF;
999=head2 $c
1000
1001=over 4
1002
1003=cut
1004
1005EOF
1006 $text = 1;
1007 }
1008 }
1009 elsif (!$text || !/\A\t/) {
1010 warn "Expected a Configure variable header",
1011 ($text ? " or another paragraph of description" : () );
1012 }
1013 s/n't/n\00t/g; # leave can't, won't etc untouched
1014 s/^\t\s+(.*)/\n$1/gm; # Indented lines ===> new paragraph
1015 s/^(?<!\n\n)\t(.*)/$1/gm; # Not indented lines ===> text
1016 s{([\'\"])(?=[^\'\"\s]*[./][^\'\"\s]*\1)([^\'\"\s]+)\1}(F<$2>)g; # '.o'
1017 s{([\'\"])([^\'\"\s]+)\1}(C<$2>)g; # "date" command
1018 s{\'([A-Za-z_\- *=/]+)\'}(C<$1>)g; # 'ln -s'
1019 s{
1020 (?<! [\w./<\'\"] ) # Only standalone file names
1021 (?! e \. g \. ) # Not e.g.
1022 (?! \. \. \. ) # Not ...
1023 (?! \d ) # Not 5.004
1024 (?! read/ ) # Not read/write
1025 (?! etc\. ) # Not etc.
1026 (?! I/O ) # Not I/O
1027 (
1028 \$ ? # Allow leading $
1029 [\w./]* [./] [\w./]* # Require . or / inside
1030 )
1031 (?<! \. (?= [\s)] ) ) # Do not include trailing dot
1032 (?! [\w/] ) # Include all of it
1033 }
1034 (F<$1>)xg; # /usr/local
1035 s/((?<=\s)~\w*)/F<$1>/g; # ~name
1036 s/(?<![.<\'\"])\b([A-Z_]{2,})\b(?![\'\"])/C<$1>/g; # UNISTD
1037 s/(?<![.<\'\"])\b(?!the\b)(\w+)\s+macro\b/C<$1> macro/g; # FILE_cnt macro
1038 s/n[\0]t/n't/g; # undo can't, won't damage
1039}
1040
1041if ($Opts{glossary}) {
1042 <GLOS>; # Skip the "DO NOT EDIT"
1043 <GLOS>; # Skip the preamble
1044 while (<GLOS>) {
1045 process;
1046 print CONFIG_POD;
1047 }
1048}
1049
1050print CONFIG_POD <<'ENDOFTAIL';
1051
1052=back
1053
1054=head1 GIT DATA
1055
1056Information on the git commit from which the current perl binary was compiled
1057can be found in the variable C<$Config::Git_Data>. The variable is a
1058structured string that looks something like this:
1059
1060 git_commit_id='ea0c2dbd5f5ac6845ecc7ec6696415bf8e27bd52'
1061 git_describe='GitLive-blead-1076-gea0c2db'
1062 git_branch='smartmatch'
1063 git_uncommitted_changes=''
1064 git_commit_id_title='Commit id:'
1065 git_commit_date='2009-05-09 17:47:31 +0200'
1066
1067Its format is not guaranteed not to change over time.
1068
1069=head1 NOTE
1070
1071This module contains a good example of how to use tie to implement a
1072cache and an example of how to make a tied variable readonly to those
1073outside of it.
1074
1075=cut
1076
1077ENDOFTAIL
1078
1079close(GLOS) if $Opts{glossary};
1080close(CONFIG_POD);
1081print "written $Config_POD\n";
1082
1083my $orig_config_txt = "";
1084my $orig_heavy_txt = "";
1085{
1086 local $/;
1087 my $fh;
1088 $orig_config_txt = <$fh> if open $fh, "<", $Config_PM;
1089 $orig_heavy_txt = <$fh> if open $fh, "<", $Config_heavy;
1090}
1091
1092if ($orig_config_txt ne $config_txt or $orig_heavy_txt ne $heavy_txt) {
1093 open CONFIG, ">", $Config_PM or die "Can't open $Config_PM: $!\n";
1094 open CONFIG_HEAVY, ">", $Config_heavy or die "Can't open $Config_heavy: $!\n";
1095 print CONFIG $config_txt;
1096 print CONFIG_HEAVY $heavy_txt;
1097 close(CONFIG_HEAVY);
1098 close(CONFIG);
1099 print "updated $Config_PM\n";
1100 print "updated $Config_heavy\n";
1101}
1102
1103
1104# Now create Cross.pm if needed
1105if ($Opts{cross}) {
1106 open CROSS, ">lib/Cross.pm" or die "Can not open >lib/Cross.pm: $!";
1107 my $cross = <<'EOS';
1108# typical invocation:
1109# perl -MCross Makefile.PL
1110# perl -MCross=wince -V:cc
1111package Cross;
1112
1113sub import {
1114 my ($package,$platform) = @_;
1115 unless (defined $platform) {
1116 # if $platform is not specified, then use last one when
1117 # 'configpm; was invoked with --cross option
1118 $platform = '***replace-marker***';
1119 }
1120 @INC = map {/\blib\b/?(do{local $_=$_;s/\blib\b/xlib\/$platform/;$_},$_):($_)} @INC;
1121 $::Cross::platform = $platform;
1122}
1123
11241;
1125EOS
1126 $cross =~ s/\*\*\*replace-marker\*\*\*/$Opts{cross}/g;
1127 print CROSS $cross;
1128 close CROSS;
1129 print "written lib/Cross.pm\n";
1130 unshift(@INC,"xlib/$Opts{cross}");
1131}
1132
1133# Now do some simple tests on the Config.pm file we have created
1134unshift(@INC,'lib');
1135unshift(@INC,'xlib/symbian') if $Opts{cross};
1136require $Config_PM;
1137require $Config_heavy;
1138import Config;
1139
1140die "$0: $Config_PM not valid"
1141 unless $Config{'PERL_CONFIG_SH'} eq 'true';
1142
1143die "$0: error processing $Config_PM"
1144 if defined($Config{'an impossible name'})
1145 or $Config{'PERL_CONFIG_SH'} ne 'true' # test cache
1146 ;
1147
1148die "$0: error processing $Config_PM"
1149 if eval '$Config{"cc"} = 1'
1150 or eval 'delete $Config{"cc"}'
1151 ;
1152
1153
1154exit 0;
1155# Popularity of various entries in %Config, based on a large build and test
1156# run of code in the Fotango build system:
1157__DATA__
1158path_sep: 8490
1159d_readlink: 7101
1160d_symlink: 7101
1161archlibexp: 4318
1162sitearchexp: 4305
1163sitelibexp: 4305
1164privlibexp: 4163
1165ldlibpthname: 4041
1166libpth: 2134
1167archname: 1591
1168exe_ext: 1256
1169scriptdir: 1155
1170version: 1116
1171useithreads: 1002
1172osvers: 982
1173osname: 851
1174inc_version_list: 783
1175dont_use_nlink: 779
1176intsize: 759
1177usevendorprefix: 642
1178dlsrc: 624
1179cc: 541
1180lib_ext: 520
1181so: 512
1182ld: 501
1183ccdlflags: 500
1184ldflags: 495
1185obj_ext: 495
1186cccdlflags: 493
1187lddlflags: 493
1188ar: 492
1189dlext: 492
1190libc: 492
1191ranlib: 492
1192full_ar: 491
1193vendorarchexp: 491
1194vendorlibexp: 491
1195installman1dir: 489
1196installman3dir: 489
1197installsitebin: 489
1198installsiteman1dir: 489
1199installsiteman3dir: 489
1200installvendorman1dir: 489
1201installvendorman3dir: 489
1202d_flexfnam: 474
1203eunicefix: 360
1204d_link: 347
1205installsitearch: 344
1206installscript: 341
1207installprivlib: 337
1208binexp: 336
1209installarchlib: 336
1210installprefixexp: 336
1211installsitelib: 336
1212installstyle: 336
1213installvendorarch: 336
1214installvendorbin: 336
1215installvendorlib: 336
1216man1ext: 336
1217man3ext: 336
1218sh: 336
1219siteprefixexp: 336
1220installbin: 335
1221usedl: 332
1222ccflags: 285
1223startperl: 232
1224optimize: 231
1225usemymalloc: 229
1226cpprun: 228
1227sharpbang: 228
1228perllibs: 225
1229usesfio: 224
1230usethreads: 220
1231perlpath: 218
1232extensions: 217
1233usesocks: 208
1234shellflags: 198
1235make: 191
1236d_pwage: 189
1237d_pwchange: 189
1238d_pwclass: 189
1239d_pwcomment: 189
1240d_pwexpire: 189
1241d_pwgecos: 189
1242d_pwpasswd: 189
1243d_pwquota: 189
1244gccversion: 189
1245libs: 186
1246useshrplib: 186
1247cppflags: 185
1248ptrsize: 185
1249shrpenv: 185
1250static_ext: 185
1251use5005threads: 185
1252uselargefiles: 185
1253alignbytes: 184
1254byteorder: 184
1255ccversion: 184
1256config_args: 184
1257cppminus: 184