5 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
6 # 2002, 2003, 2004, 2005, 2006, 2007 Larry Wall and others.
14 # lib/Cross.pm (optionally)
17 # from the contents of the static files
22 # and from the contents of the Configure-generated file
26 # Note that output directory is xlib/[cross-name]/ for cross-compiling
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.
33 sub usage { die <<EOF }
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
41 use vars qw(%Config $Config_SH_expanded);
43 my $how_many_common = 22;
45 # commonly used names to precache (and hence lookup fastest)
48 while ($how_many_common--) {
51 /^(\S+):\s*(\d+)$/ or die "Malformed line '$_'";
55 # names of things which may need to have slashes changed to double-colons
56 my %Extensions = map {($_,$_)}
57 qw(dynamic_ext static_ext extensions known_extensions);
59 # allowed opts as well as specifies default and initial values
61 'cross' => '', # --cross=PLATFORM - crosscompiling for PLATFORM
62 'glossary' => 1, # --no-glossary - no glossary file inclusion,
64 'chdir' => '', # --chdir=dir - change directory before writing files
68 # user specified options
71 (map {/^--([\-_\w]+)=(.*)$/} @ARGV),
72 # --opt --no-opt --noopt
73 (map {/^no-?(.*)$/i?($1=>0):($_=>1)} map {/^--([\-_\w]+)$/} @ARGV),
76 my %opts = (%Allowed_Opts, %given_opts);
78 for my $opt (grep {!exists $Allowed_Opts{$_}} keys %given_opts) {
79 warn "option '$opt' is not recognized";
82 @ARGV = grep {!/^--/} @ARGV;
91 chdir $Opts{chdir} or die "$0: could not chdir $Opts{chdir}: $!"
94 my ($Config_SH, $Config_PM, $Config_heavy, $Config_POD);
95 my $Glossary = 'Porting/Glossary';
98 # creating cross-platform config file
100 mkdir "xlib/$Opts{cross}";
101 $Config_PM = "xlib/$Opts{cross}/Config.pm";
102 $Config_POD = "xlib/$Opts{cross}/Config.pod";
103 $Config_SH = "Cross/config-$Opts{cross}.sh";
106 $Config_PM = "lib/Config.pm";
107 $Config_POD = "lib/Config.pod";
108 $Config_SH = "config.sh";
110 ($Config_heavy = $Config_PM) =~ s/\.pm$/_heavy.pl/;
111 die "Can't automatically determine name for Config_heavy.pl from '$Config_PM'"
112 if $Config_heavy eq $Config_PM;
117 $heavy_txt .= <<'ENDOFBEG';
118 # This file was created by configpm when Perl was built. Any changes
119 # made to this file will be lost the next time perl is built.
123 # use warnings; Pulls in Carp
124 # use vars pulls in Carp
127 my ($bincompat, $non_bincompat, $date, @patches) = Internals::V();
129 my $opts = join ' ', sort split ' ', "$bincompat $non_bincompat";
131 # wrap at 76 columns.
133 $opts =~ s/(?=.{53})(.{1,53}) /$1\n /mg;
135 print Config::myconfig();
137 print "\nCharacteristics of this PERLSHR image: \n";
139 print "\nCharacteristics of this binary (from libperl): \n";
142 print " Compile-time options: $opts\n";
145 print " Locally applied patches:\n";
146 print "\t$_\n" foreach @patches;
149 print " Built under $^O\n";
151 print " $date\n" if defined $date;
153 my @env = map { "$_=\"$ENV{$_}\"" } sort grep {/^PERL/} keys %ENV;
154 push @env, "CYGWIN=\"$ENV{CYGWIN}\"" if $^O eq 'cygwin';
158 print " $_\n" foreach @env;
161 print " $_\n" foreach @INC;
166 my $myver = sprintf "%vd", $^V;
168 $config_txt .= sprintf <<'ENDOFBEG', ($myver) x 3;
169 # This file was created by configpm when Perl was built. Any changes
170 # made to this file will be lost the next time perl is built.
172 # for a description of the variables, please have a look at the
173 # Glossary file, as written in the Porting folder, or use the url:
174 # http://perl5.git.perl.org/perl.git/blob/HEAD:/Porting/Glossary
178 # use warnings; Pulls in Carp
179 # use vars pulls in Carp
180 @Config::EXPORT = qw(%%Config);
181 @Config::EXPORT_OK = qw(myconfig config_sh config_vars config_re);
183 # Need to stub all the functions to make code such as print Config::config_sh
191 # Skip @Config::EXPORT because it only contains %%Config, which we special
192 # case below as it's not a function. @Config::EXPORT won't change in the
193 # lifetime of Perl 5.
194 my %%Export_Cache = map {($_ => 1)} @Config::EXPORT_OK;
198 # Define our own import method to avoid pulling in the full Exporter:
201 @_ = @Config::EXPORT unless @_;
203 my @funcs = grep $_ ne '%%Config', @_;
204 my $export_Config = @funcs < @_ ? 1 : 0;
207 my $callpkg = caller(0);
208 foreach my $func (@funcs) {
209 die qq{"$func" is not exported by the Config module\n}
210 unless $Export_Cache{$func};
211 *{$callpkg.'::'.$func} = \&{$func};
214 *{"$callpkg\::Config"} = \%%Config if $export_Config;
218 die "Perl lib version (%s) doesn't match executable version ($])"
222 or die "Perl lib version (%s) doesn't match executable version (" .
223 sprintf("v%%vd",$^V) . ")";
237 open(CONFIG_SH, $Config_SH) || die "Can't open $Config_SH: $!";
238 while (<CONFIG_SH>) {
239 next if m:^#!/bin/sh:;
241 # Catch PERL_CONFIG_SH=true and PERL_VERSION=n line from Configure.
242 s/^(\w+)=(true|\d+)\s*$/$1='$2'\n/ or m/^(\w+)='(.*)'$/;
243 my($k, $v) = ($1, $2);
245 # grandfather PATCHLEVEL and SUBVERSION and CONFIG
247 if ($k eq 'PERL_VERSION') {
248 push @v_others, "PATCHLEVEL='$v'\n";
250 elsif ($k eq 'PERL_SUBVERSION') {
251 push @v_others, "SUBVERSION='$v'\n";
253 elsif ($k eq 'PERL_CONFIG_SH') {
254 push @v_others, "CONFIG='$v'\n";
258 # We can delimit things in config.sh with either ' or ".
259 unless ($in_v or m/^(\w+)=(['"])(.*\n)/){
260 push(@non_v, "#$_"); # not a name='value' line
268 ($name,$val) = ($1,$3);
270 $in_v = $val !~ /$quote\n/;
273 s,/,::,g if $Extensions{$name};
275 $val =~ s/$quote\n?\z//;
277 my $line = "$name=$quote$val$quote\n";
278 push(@v_others, $line);
279 $seen_quotes{$quote}++;
284 # This is somewhat grim, but I want the code for parsing config.sh here and
285 # now so that I can expand $Config{ivsize} and $Config{ivtype}
287 my $fetch_string = <<'EOT';
289 # Search for it in the big string
291 my($self, $key) = @_;
295 if ($seen_quotes{'"'}) {
296 # We need the full ' and " code
298 $fetch_string .= <<'EOT';
299 return undef unless my ($quote_type, $value) = $Config_SH_expanded =~ /\n$key=(['"])(.*?)\1\n/s;
301 # If we had a double-quote, we'd better eval it so escape
302 # sequences and such can be interpolated. Since the incoming
303 # value is supposed to follow shell rules and not perl rules,
304 # we escape any perl variable markers
306 # Historically, since " 'support' was added in change 1409, the
307 # interpolation was done before the undef. Stick to this arguably buggy
308 # behaviour as we're refactoring.
309 if ($quote_type eq '"') {
310 $value =~ s/\$/\\\$/g;
311 $value =~ s/\@/\\\@/g;
312 eval "\$value = \"$value\"";
315 # So we can say "if $Config{'foo'}".
316 $self->{$key} = $value eq 'undef' ? undef : $value; # cache it
321 # We only have ' delimted.
323 $fetch_string .= <<'EOT';
324 return undef unless $Config_SH_expanded =~ /\n$key=\'(.*?)\'\n/s;
325 # So we can say "if $Config{'foo'}".
326 $self->{$key} = $1 eq 'undef' ? undef : $1;
335 # Calculation for the keys for byteorder
336 # This is somewhat grim, but I need to run fetch_string here.
337 our $Config_SH_expanded = join "\n", '', @v_others;
339 my $t = fetch_string ({}, 'ivtype');
340 my $s = fetch_string ({}, 'ivsize');
342 # byteorder does exist on its own but we overlay a virtual
343 # dynamically recomputed value.
345 # However, ivtype and ivsize will not vary for sane fat binaries
347 my $f = $t eq 'long' ? 'L!' : $s == 8 ? 'Q': 'I';
350 if ($s == 4 || $s == 8) {
351 my $list = join ',', reverse(2..$s);
353 $byteorder_code = <<"EOT";
356 foreach my \$c ($list) { \$i |= ord(\$c); \$i <<= 8 }
358 our \$byteorder = join('', unpack('$format', pack('$f', \$i)));
361 $byteorder_code = "our \$byteorder = '?'x$s;\n";
366 if (fetch_string({},'userelocatableinc')) {
367 foreach my $what (qw(prefixexp
416 installvendorhtml1dir
417 installvendorhtml3dir
423 push @need_relocation, $what if fetch_string({}, $what) =~ m!^\.\.\./!;
428 @need_relocation{@need_relocation} = @need_relocation;
430 # This can have .../ anywhere:
431 if (fetch_string({}, 'otherlibdirs') =~ m!\.\.\./!) {
432 $need_relocation{otherlibdirs} = 'otherlibdirs';
435 my $relocation_code = <<'EOT';
439 return $libdir unless $libdir =~ s!^\.\.\./!!;
441 if ($prefix =~ s!/[^/]*$!!) {
442 while ($libdir =~ m!^\.\./!) {
443 # Loop while $libdir starts "../" and $prefix still has a trailing
445 last unless $prefix =~ s!/([^/]+)$!!;
446 # but bail out if the directory we picked off the end of $prefix is .
448 if ($1 eq '.' or $1 eq '..') {
449 # Undo! This should be rare, hence code it this way rather than a
450 # check each time before the s!!! above.
451 $prefix = "$prefix/$1";
454 # Remove that leading ../ and loop again
455 substr ($libdir, 0, 3, '');
457 $libdir = "$prefix/$libdir";
463 if (%need_relocation) {
464 my $relocations_in_common;
465 # otherlibdirs only features in the hash
466 foreach (keys %need_relocation) {
467 $relocations_in_common++ if $Common{$_};
469 if ($relocations_in_common) {
470 $config_txt .= $relocation_code;
472 $heavy_txt .= $relocation_code;
476 $heavy_txt .= join('', @non_v) . "\n";
478 # copy config summary format from the myconfig.SH script
479 $heavy_txt .= "our \$summary = <<'!END!';\n";
480 open(MYCONFIG,"<myconfig.SH") || die "open myconfig.SH failed: $!";
481 1 while defined($_ = <MYCONFIG>) && !/^Summary of/;
482 do { $heavy_txt .= $_ } until !defined($_ = <MYCONFIG>) || /^\s*$/;
485 $heavy_txt .= "\n!END!\n" . <<'EOT';
486 my $summary_expanded;
489 return $summary_expanded if $summary_expanded;
490 ($summary_expanded = $summary) =~ s{\$(\w+)}
493 if ($1 eq 'git_ancestor_line') {
494 if ($Config::Config{git_ancestor}) {
495 $c= "\n Ancestor: $Config::Config{git_ancestor}";
500 $c = $Config::Config{$1};
502 defined($c) ? $c : 'undef'
511 $heavy_txt .= join('', sort @v_others) . "!END!\n";
513 # Only need the dynamic byteorder code in Config.pm if 'byteorder' is one of
515 if ($Common{byteorder}) {
516 $config_txt .= $byteorder_code;
518 $heavy_txt .= $byteorder_code;
521 if (@need_relocation) {
522 $heavy_txt .= 'foreach my $what (qw(' . join (' ', @need_relocation) .
524 s/^($what=)(['"])(.*?)\2/$1 . $2 . relocate_inc($3) . $2/me;
527 # Currently it only makes sense to do the ... relocation on Unix, so there's
528 # no need to emulate the "which separator for this platform" logic in perl.c -
529 # ':' will always be applicable
530 if ($need_relocation{otherlibdirs}) {
531 $heavy_txt .= << 'EOT';
532 s{^(otherlibdirs=)(['"])(.*?)\2}
533 {$1 . $2 . join ':', map {relocate_inc($_)} split ':', $3 . $2}me;
538 $heavy_txt .= <<'EOT';
539 s/(byteorder=)(['"]).*?\2/$1$2$Config::byteorder$2/m;
541 my $config_sh_len = length $_;
543 our $Config_SH_expanded = "\n$_" . << 'EOVIRTUAL';
546 foreach my $prefix (qw(ccflags ldflags)) {
547 my $value = fetch_string ({}, $prefix);
548 my $withlargefiles = fetch_string ({}, $prefix . "_uselargefiles");
549 if (defined $withlargefiles) {
550 $value =~ s/\Q$withlargefiles\E\b//;
551 $heavy_txt .= "${prefix}_nolargefiles='$value'\n";
555 foreach my $prefix (qw(libs libswanted)) {
556 my $value = fetch_string ({}, $prefix);
557 my $withlf = fetch_string ({}, 'libswanted_uselargefiles');
558 next unless defined $withlf;
560 = split(' ', fetch_string ({}, 'libswanted_uselargefiles'));
563 @lflibswanted{@lflibswanted} = ();
564 if ($prefix eq 'libs') {
565 my @libs = grep { /^-l(.+)/ &&
566 not exists $lflibswanted{$1} }
567 split(' ', fetch_string ({}, 'libs'));
568 $value = join(' ', @libs);
570 my @libswanted = grep { not exists $lflibswanted{$_} }
571 split(' ', fetch_string ({}, 'libswanted'));
572 $value = join(' ', @libswanted);
575 $heavy_txt .= "${prefix}_nolargefiles='$value'\n";
578 $heavy_txt .= "EOVIRTUAL\n";
580 $heavy_txt .= <<'ENDOFGIT';
582 # do not have hairy conniptions if this isnt available
583 require 'Config_git.pl';
584 $Config_SH_expanded .= $Config::Git_Data;
586 } or warn "Warning: failed to load Config_git.pl, something strange about this perl...\n";
589 $heavy_txt .= $fetch_string;
591 $config_txt .= <<'ENDOFEND';
594 my($self, $key) = @_;
596 # check for cached value (which may be undef so we use exists not defined)
597 return $self->{$key} if exists $self->{$key};
599 return $self->fetch_string($key);
603 $heavy_txt .= <<'ENDOFEND';
609 substr($Config_SH_expanded, 1, index($Config_SH_expanded, '=') - 1 );
614 if ($seen_quotes{'"'}) {
615 $heavy_txt .= <<'ENDOFEND';
616 # Find out how the current key's quoted so we can skip to its end.
617 my $quote = substr($Config_SH_expanded,
618 index($Config_SH_expanded, "=", $prevpos)+1, 1);
619 my $pos = index($Config_SH_expanded, qq($quote\n), $prevpos) + 2;
622 # Just ' quotes, so it's much easier.
623 $heavy_txt .= <<'ENDOFEND';
624 my $pos = index($Config_SH_expanded, qq('\n), $prevpos) + 2;
627 $heavy_txt .= <<'ENDOFEND';
628 my $len = index($Config_SH_expanded, "=", $pos) - $pos;
630 $len > 0 ? substr($Config_SH_expanded, $pos, $len) : undef;
634 return 1 if exists($_[0]->{$_[1]});
636 return(index($Config_SH_expanded, "\n$_[1]='") != -1
638 if ($seen_quotes{'"'}) {
639 $heavy_txt .= <<'ENDOFEND';
640 or index($Config_SH_expanded, "\n$_[1]=\"") != -1
643 $heavy_txt .= <<'ENDOFEND';
647 sub STORE { die "\%Config::Config is read-only\n" }
653 substr $Config_SH_expanded, 1, $config_sh_len;
658 return map { chomp; $_ } grep eval{ /^(?:$re)=/ }, split /^/,
663 # implements -V:cfgvar option (see perlrun -V:)
665 # find optional leading, trailing colons; and query-spec
666 my ($notag,$qry,$lncont) = m/^(:)?(.*?)(:)?$/; # flags fore and aft,
667 # map colon-flags to print decorations
668 my $prfx = $notag ? '': "$qry="; # tag-prefix for print
669 my $lnend = $lncont ? ' ' : ";\n"; # line ending for print
671 # all config-vars are by definition \w only, any \W means regex
673 my @matches = config_re($qry);
674 print map "$_$lnend", @matches ? @matches : "$qry: not found" if !$notag;
675 print map { s/\w+=//; "$_$lnend" } @matches ? @matches : "$qry: not found" if $notag;
677 my $v = (exists $Config::Config{$qry}) ? $Config::Config{$qry}
679 $v = 'undef' unless defined $v;
680 print "${prfx}'${v}'$lnend";
685 # Called by the real AUTOLOAD
688 goto \&$Config::AUTOLOAD;
695 $config_txt .= <<'ENDOFSET';
698 my ($value, $v) = $Config_SH_expanded =~ m/^used_aout='(.*)'\s*$/m;
699 for (split ' ', $value) {
700 ($v) = $Config_SH_expanded =~ m/^aout_$_='(.*)'\s*$/m;
701 $preconfig{$_} = $v eq 'undef' ? undef : $v;
704 $preconfig{d_fork} = undef unless $OS2::can_fork; # Some funny cases can't
705 sub TIEHASH { bless {%preconfig} }
707 # Extract the name of the DLL from the makefile to avoid duplication
708 my ($f) = grep -r, qw(GNUMakefile Makefile);
710 if (open my $fh, '<', $f) {
712 $dll = $1, last if /^PERL_DLL_BASE\s*=\s*(\S*)\s*$/;
715 $config_txt .= <<ENDOFSET if $dll;
716 \$preconfig{dll_name} = '$dll';
719 $config_txt .= <<'ENDOFSET';
726 foreach my $key (keys %Common) {
727 my $value = fetch_string ({}, $key);
728 # Is it safe on the LHS of => ?
729 my $qkey = $key =~ /^[A-Za-z_][A-Za-z0-9_]*$/ ? $key : "'$key'";
730 if (defined $value) {
731 # Quote things for a '' string
732 $value =~ s!\\!\\\\!g;
735 if ($key eq 'otherlibdirs') {
736 $value = "join (':', map {relocate_inc(\$_)} split (':', $value))";
737 } elsif ($need_relocation{$key}) {
738 $value = "relocate_inc($value)";
743 $Common{$key} = "$qkey => $value";
746 if ($Common{byteorder}) {
747 $Common{byteorder} = 'byteorder => $byteorder';
749 my $fast_config = join '', map { " $_,\n" } sort values %Common;
751 # Sanity check needed to stop an infite loop if Config_heavy.pl fails to define
752 # &launcher for some reason (eg it got truncated)
753 $config_txt .= sprintf <<'ENDOFTIE', $fast_config;
758 require 'Config_heavy.pl';
759 goto \&launcher unless $Config::AUTOLOAD =~ /launcher$/;
760 die "&Config::AUTOLOAD failed on $Config::AUTOLOAD";
763 # tie returns the object, so the value returned to require will be true.
764 tie %%Config, 'Config', {
769 open(CONFIG_POD, ">$Config_POD") or die "Can't open $Config_POD: $!";
770 print CONFIG_POD <<'ENDOFTAIL';
773 Config - access Perl configuration information
778 if ($Config{usethreads}) {
779 print "has thread support\n"
782 use Config qw(myconfig config_sh config_vars config_re);
790 config_vars(qw(osname archname));
795 The Config module contains all the information that was available to
796 the C<Configure> program at Perl build time (over 900 values).
798 Shell variables from the F<config.sh> file (written by Configure) are
799 stored in the readonly-variable C<%Config>, indexed by their names.
801 Values stored in config.sh as 'undef' are returned as undefined
802 values. The perl C<exists> function can be used to check if a
803 named variable exists.
805 For a description of the variables, please have a look at the
806 Glossary file, as written in the Porting folder, or use the url:
807 http://perl5.git.perl.org/perl.git/blob/HEAD:/Porting/Glossary
813 Returns a textual summary of the major perl configuration values.
814 See also C<-V> in L<perlrun/Switches>.
818 Returns the entire perl configuration information in the form of the
819 original config.sh shell variable assignment script.
821 =item config_re($regex)
823 Like config_sh() but returns, as a list, only the config entries who's
824 names match the $regex.
826 =item config_vars(@names)
828 Prints to STDOUT the values of the named configuration variable. Each is
829 printed on a separate line in the form:
833 Names which are unknown are output as C<name='UNKNOWN';>.
834 See also C<-V:name> in L<perlrun/Switches>.
840 Here's a more sophisticated example of using %Config:
847 unless($Config{sig_name} && $Config{sig_num}) {
850 my @names = split ' ', $Config{sig_name};
851 @sig_num{@names} = split ' ', $Config{sig_num};
853 $sig_name[$sig_num{$_}] ||= $_;
857 print "signal #17 = $sig_name[17]\n";
858 if ($sig_num{ALRM}) {
859 print "SIGALRM is $sig_num{ALRM}\n";
864 Because this information is not stored within the perl executable
865 itself it is possible (but unlikely) that the information does not
866 relate to the actual perl binary which is being used to access it.
868 The Config module is installed into the architecture and version
869 specific library directory ($Config{installarchlib}) and it checks the
870 perl version number when loaded.
872 The values stored in config.sh may be either single-quoted or
873 double-quoted. Double-quoted strings are handy for those cases where you
874 need to include escape sequences in the strings. To avoid runtime variable
875 interpolation, any C<$> and C<@> characters are replaced by C<\$> and
876 C<\@>, respectively. This isn't foolproof, of course, so don't embed C<\$>
877 or C<\@> in double-quoted strings unless you're willing to deal with the
878 consequences. (The slashes will end up escaped and the C<$> or C<@> will
879 trigger variable interpolation)
883 Most C<Config> variables are determined by the C<Configure> script
884 on platforms supported by it (which is most UNIX platforms). Some
885 platforms have custom-made C<Config> variables, and may thus not have
886 some of the variables described below, or may have extraneous variables
887 specific to that particular port. See the port specific documentation
894 if ($Opts{glossary}) {
895 open(GLOS, "<$Glossary") or die "Can't open $Glossary: $!";
902 if (s/\A(\w*)\s+\(([\w.]+)\):\s*\n(\t?)/=item C<$1>\n\nFrom F<$2>:\n\n/m) {
903 my $c = substr $1, 0, 1;
904 unless ($seen{$c}++) {
905 print CONFIG_POD <<EOF if $text;
911 print CONFIG_POD <<EOF;
922 elsif (!$text || !/\A\t/) {
923 warn "Expected a Configure variable header",
924 ($text ? " or another paragraph of description" : () );
926 s/n't/n\00t/g; # leave can't, won't etc untouched
927 s/^\t\s+(.*)/\n$1/gm; # Indented lines ===> new paragraph
928 s/^(?<!\n\n)\t(.*)/$1/gm; # Not indented lines ===> text
929 s{([\'\"])(?=[^\'\"\s]*[./][^\'\"\s]*\1)([^\'\"\s]+)\1}(F<$2>)g; # '.o'
930 s{([\'\"])([^\'\"\s]+)\1}(C<$2>)g; # "date" command
931 s{\'([A-Za-z_\- *=/]+)\'}(C<$1>)g; # 'ln -s'
933 (?<! [\w./<\'\"] ) # Only standalone file names
934 (?! e \. g \. ) # Not e.g.
935 (?! \. \. \. ) # Not ...
937 (?! read/ ) # Not read/write
938 (?! etc\. ) # Not etc.
941 \$ ? # Allow leading $
942 [\w./]* [./] [\w./]* # Require . or / inside
944 (?<! \. (?= [\s)] ) ) # Do not include trailing dot
945 (?! [\w/] ) # Include all of it
947 (F<$1>)xg; # /usr/local
948 s/((?<=\s)~\w*)/F<$1>/g; # ~name
949 s/(?<![.<\'\"])\b([A-Z_]{2,})\b(?![\'\"])/C<$1>/g; # UNISTD
950 s/(?<![.<\'\"])\b(?!the\b)(\w+)\s+macro\b/C<$1> macro/g; # FILE_cnt macro
951 s/n[\0]t/n't/g; # undo can't, won't damage
954 if ($Opts{glossary}) {
955 <GLOS>; # Skip the "DO NOT EDIT"
956 <GLOS>; # Skip the preamble
963 print CONFIG_POD <<'ENDOFTAIL';
969 Information on the git commit from which the current perl binary was compiled
970 can be found in the variable C<$Config::Git_Data>. The variable is a
971 structured string that looks something like this:
973 git_commit_id='ea0c2dbd5f5ac6845ecc7ec6696415bf8e27bd52'
974 git_describe='GitLive-blead-1076-gea0c2db'
975 git_branch='smartmatch'
976 git_uncommitted_changes=''
977 git_commit_id_title='Commit id:'
978 git_commit_date='2009-05-09 17:47:31 +0200'
980 Its format is not guaranteed not to change over time.
984 This module contains a good example of how to use tie to implement a
985 cache and an example of how to make a tied variable readonly to those
992 close(GLOS) if $Opts{glossary};
994 print "written $Config_POD\n";
996 my $orig_config_txt = "";
997 my $orig_heavy_txt = "";
1001 $orig_config_txt = <$fh> if open $fh, "<", $Config_PM;
1002 $orig_heavy_txt = <$fh> if open $fh, "<", $Config_heavy;
1005 if ($orig_config_txt ne $config_txt or $orig_heavy_txt ne $heavy_txt) {
1006 open CONFIG, ">", $Config_PM or die "Can't open $Config_PM: $!\n";
1007 open CONFIG_HEAVY, ">", $Config_heavy or die "Can't open $Config_heavy: $!\n";
1008 print CONFIG $config_txt;
1009 print CONFIG_HEAVY $heavy_txt;
1010 close(CONFIG_HEAVY);
1012 print "updated $Config_PM\n";
1013 print "updated $Config_heavy\n";
1017 # Now create Cross.pm if needed
1019 open CROSS, ">lib/Cross.pm" or die "Can not open >lib/Cross.pm: $!";
1020 my $cross = <<'EOS';
1021 # typical invocation:
1022 # perl -MCross Makefile.PL
1023 # perl -MCross=wince -V:cc
1027 my ($package,$platform) = @_;
1028 unless (defined $platform) {
1029 # if $platform is not specified, then use last one when
1030 # 'configpm; was invoked with --cross option
1031 $platform = '***replace-marker***';
1033 @INC = map {/\blib\b/?(do{local $_=$_;s/\blib\b/xlib\/$platform/;$_},$_):($_)} @INC;
1034 $::Cross::platform = $platform;
1039 $cross =~ s/\*\*\*replace-marker\*\*\*/$Opts{cross}/g;
1042 print "written lib/Cross.pm\n";
1043 unshift(@INC,"xlib/$Opts{cross}");
1046 # Now do some simple tests on the Config.pm file we have created
1047 unshift(@INC,'lib');
1048 unshift(@INC,'xlib/symbian') if $Opts{cross};
1050 require $Config_heavy;
1053 die "$0: $Config_PM not valid"
1054 unless $Config{'PERL_CONFIG_SH'} eq 'true';
1056 die "$0: error processing $Config_PM"
1057 if defined($Config{'an impossible name'})
1058 or $Config{'PERL_CONFIG_SH'} ne 'true' # test cache
1061 die "$0: error processing $Config_PM"
1062 if eval '$Config{"cc"} = 1'
1063 or eval 'delete $Config{"cc"}'
1068 # Popularity of various entries in %Config, based on a large build and test
1069 # run of code in the Fotango build system:
1087 inc_version_list: 783
1090 usevendorprefix: 642
1111 installsiteman1dir: 489
1112 installsiteman3dir: 489
1113 installvendorman1dir: 489
1114 installvendorman3dir: 489
1118 installsitearch: 344
1123 installprefixexp: 336
1126 installvendorarch: 336
1127 installvendorbin: 336
1128 installvendorlib: 336