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 $myver = sprintf "%vd", $^V;
129 $config_txt .= sprintf <<'ENDOFBEG', ($myver) x 3;
130 # This file was created by configpm when Perl was built. Any changes
131 # made to this file will be lost the next time perl is built.
133 # for a description of the variables, please have a look at the
134 # Glossary file, as written in the Porting folder, or use the url:
135 # http://perl5.git.perl.org/perl.git/blob/HEAD:/Porting/Glossary
139 # use warnings; Pulls in Carp
140 # use vars pulls in Carp
141 @Config::EXPORT = qw(%%Config);
142 @Config::EXPORT_OK = qw(myconfig config_sh config_vars config_re);
144 # Need to stub all the functions to make code such as print Config::config_sh
152 my %%Export_Cache = map {($_ => 1)} (@Config::EXPORT, @Config::EXPORT_OK);
156 # Define our own import method to avoid pulling in the full Exporter:
159 @_ = @Config::EXPORT unless @_;
161 my @funcs = grep $_ ne '%%Config', @_;
162 my $export_Config = @funcs < @_ ? 1 : 0;
165 my $callpkg = caller(0);
166 foreach my $func (@funcs) {
167 die sprintf qq{"%%s" is not exported by the %%s module\n},
168 $func, __PACKAGE__ unless $Export_Cache{$func};
169 *{$callpkg.'::'.$func} = \&{$func};
172 *{"$callpkg\::Config"} = \%%Config if $export_Config;
176 die "Perl lib version (%s) doesn't match executable version ($])"
180 or die "Perl lib version (%s) doesn't match executable version (" .
181 sprintf("v%%vd",$^V) . ")";
195 open(CONFIG_SH, $Config_SH) || die "Can't open $Config_SH: $!";
196 while (<CONFIG_SH>) {
197 next if m:^#!/bin/sh:;
199 # Catch PERL_CONFIG_SH=true and PERL_VERSION=n line from Configure.
200 s/^(\w+)=(true|\d+)\s*$/$1='$2'\n/ or m/^(\w+)='(.*)'$/;
201 my($k, $v) = ($1, $2);
203 # grandfather PATCHLEVEL and SUBVERSION and CONFIG
205 if ($k eq 'PERL_VERSION') {
206 push @v_others, "PATCHLEVEL='$v'\n";
208 elsif ($k eq 'PERL_SUBVERSION') {
209 push @v_others, "SUBVERSION='$v'\n";
211 elsif ($k eq 'PERL_CONFIG_SH') {
212 push @v_others, "CONFIG='$v'\n";
216 # We can delimit things in config.sh with either ' or ".
217 unless ($in_v or m/^(\w+)=(['"])(.*\n)/){
218 push(@non_v, "#$_"); # not a name='value' line
226 ($name,$val) = ($1,$3);
228 $in_v = $val !~ /$quote\n/;
231 s,/,::,g if $Extensions{$name};
233 $val =~ s/$quote\n?\z//;
235 my $line = "$name=$quote$val$quote\n";
236 push(@v_others, $line);
237 $seen_quotes{$quote}++;
242 # This is somewhat grim, but I want the code for parsing config.sh here and
243 # now so that I can expand $Config{ivsize} and $Config{ivtype}
245 my $fetch_string = <<'EOT';
247 # Search for it in the big string
249 my($self, $key) = @_;
253 if ($seen_quotes{'"'}) {
254 # We need the full ' and " code
255 $fetch_string .= <<'EOT';
256 my $quote_type = "'";
257 my $marker = "$key=";
259 # Check for the common case, ' delimited
260 my $start = index($Config_SH_expanded, "\n$marker$quote_type");
261 # If that failed, check for " delimited
264 $start = index($Config_SH_expanded, "\n$marker$quote_type");
268 $fetch_string .= <<'EOT';
269 # We only have ' delimted.
270 my $start = index($Config_SH_expanded, "\n$key=\'");
273 $fetch_string .= <<'EOT';
274 # Start can never be -1 now, as we've rigged the long string we're
275 # searching with an initial dummy newline.
276 return undef if $start == -1;
278 $start += length($key) + 3;
281 if (!$seen_quotes{'"'}) {
282 # Don't need the full ' and " code, or the eval expansion.
283 $fetch_string .= <<'EOT';
284 my $value = substr($Config_SH_expanded, $start,
285 index($Config_SH_expanded, "'\n", $start)
289 $fetch_string .= <<'EOT';
290 my $value = substr($Config_SH_expanded, $start,
291 index($Config_SH_expanded, "$quote_type\n", $start)
294 # If we had a double-quote, we'd better eval it so escape
295 # sequences and such can be interpolated. Since the incoming
296 # value is supposed to follow shell rules and not perl rules,
297 # we escape any perl variable markers
298 if ($quote_type eq '"') {
299 $value =~ s/\$/\\\$/g;
300 $value =~ s/\@/\\\@/g;
301 eval "\$value = \"$value\"";
305 $fetch_string .= <<'EOT';
306 # So we can say "if $Config{'foo'}".
307 $value = undef if $value eq 'undef';
308 $self->{$key} = $value; # cache it
315 # Calculation for the keys for byteorder
316 # This is somewhat grim, but I need to run fetch_string here.
317 our $Config_SH_expanded = join "\n", '', @v_others;
319 my $t = fetch_string ({}, 'ivtype');
320 my $s = fetch_string ({}, 'ivsize');
322 # byteorder does exist on its own but we overlay a virtual
323 # dynamically recomputed value.
325 # However, ivtype and ivsize will not vary for sane fat binaries
327 my $f = $t eq 'long' ? 'L!' : $s == 8 ? 'Q': 'I';
330 if ($s == 4 || $s == 8) {
331 my $list = join ',', reverse(2..$s);
333 $byteorder_code = <<"EOT";
336 foreach my \$c ($list) { \$i |= ord(\$c); \$i <<= 8 }
338 our \$byteorder = join('', unpack('$format', pack('$f', \$i)));
341 $byteorder_code = "our \$byteorder = '?'x$s;\n";
346 if (fetch_string({},'userelocatableinc')) {
347 foreach my $what (qw(prefixexp
396 installvendorhtml1dir
397 installvendorhtml3dir
403 push @need_relocation, $what if fetch_string({}, $what) =~ m!^\.\.\./!;
408 @need_relocation{@need_relocation} = @need_relocation;
410 # This can have .../ anywhere:
411 if (fetch_string({}, 'otherlibdirs') =~ m!\.\.\./!) {
412 $need_relocation{otherlibdirs} = 'otherlibdirs';
415 my $relocation_code = <<'EOT';
419 return $libdir unless $libdir =~ s!^\.\.\./!!;
421 if ($prefix =~ s!/[^/]*$!!) {
422 while ($libdir =~ m!^\.\./!) {
423 # Loop while $libdir starts "../" and $prefix still has a trailing
425 last unless $prefix =~ s!/([^/]+)$!!;
426 # but bail out if the directory we picked off the end of $prefix is .
428 if ($1 eq '.' or $1 eq '..') {
429 # Undo! This should be rare, hence code it this way rather than a
430 # check each time before the s!!! above.
431 $prefix = "$prefix/$1";
434 # Remove that leading ../ and loop again
435 substr ($libdir, 0, 3, '');
437 $libdir = "$prefix/$libdir";
443 if (%need_relocation) {
444 my $relocations_in_common;
445 # otherlibdirs only features in the hash
446 foreach (keys %need_relocation) {
447 $relocations_in_common++ if $Common{$_};
449 if ($relocations_in_common) {
450 $config_txt .= $relocation_code;
452 $heavy_txt .= $relocation_code;
456 $heavy_txt .= join('', @non_v) . "\n";
458 # copy config summary format from the myconfig.SH script
459 $heavy_txt .= "our \$summary = <<'!END!';\n";
460 open(MYCONFIG,"<myconfig.SH") || die "open myconfig.SH failed: $!";
461 1 while defined($_ = <MYCONFIG>) && !/^Summary of/;
462 do { $heavy_txt .= $_ } until !defined($_ = <MYCONFIG>) || /^\s*$/;
465 $heavy_txt .= "\n!END!\n" . <<'EOT';
466 my $summary_expanded;
469 return $summary_expanded if $summary_expanded;
470 ($summary_expanded = $summary) =~ s{\$(\w+)}
473 if ($1 eq 'git_ancestor_line') {
474 if ($Config::Config{git_ancestor}) {
475 $c= "\n Ancestor: $Config::Config{git_ancestor}";
480 $c = $Config::Config{$1};
482 defined($c) ? $c : 'undef'
491 $heavy_txt .= join('', sort @v_others) . "!END!\n";
493 # Only need the dynamic byteorder code in Config.pm if 'byteorder' is one of
495 if ($Common{byteorder}) {
496 $config_txt .= $byteorder_code;
498 $heavy_txt .= $byteorder_code;
501 if (@need_relocation) {
502 $heavy_txt .= 'foreach my $what (qw(' . join (' ', @need_relocation) .
504 s/^($what=)(['"])(.*?)\2/$1 . $2 . relocate_inc($3) . $2/me;
507 # Currently it only makes sense to do the ... relocation on Unix, so there's
508 # no need to emulate the "which separator for this platform" logic in perl.c -
509 # ':' will always be applicable
510 if ($need_relocation{otherlibdirs}) {
511 $heavy_txt .= << 'EOT';
512 s{^(otherlibdirs=)(['"])(.*?)\2}
513 {$1 . $2 . join ':', map {relocate_inc($_)} split ':', $3 . $2}me;
518 $heavy_txt .= <<'EOT';
519 s/(byteorder=)(['"]).*?\2/$1$2$Config::byteorder$2/m;
521 my $config_sh_len = length $_;
523 our $Config_SH_expanded = "\n$_" . << 'EOVIRTUAL';
526 foreach my $prefix (qw(ccflags ldflags)) {
527 my $value = fetch_string ({}, $prefix);
528 my $withlargefiles = fetch_string ({}, $prefix . "_uselargefiles");
529 if (defined $withlargefiles) {
530 $value =~ s/\Q$withlargefiles\E\b//;
531 $heavy_txt .= "${prefix}_nolargefiles='$value'\n";
535 foreach my $prefix (qw(libs libswanted)) {
536 my $value = fetch_string ({}, $prefix);
537 my $withlf = fetch_string ({}, 'libswanted_uselargefiles');
538 next unless defined $withlf;
540 = split(' ', fetch_string ({}, 'libswanted_uselargefiles'));
543 @lflibswanted{@lflibswanted} = ();
544 if ($prefix eq 'libs') {
545 my @libs = grep { /^-l(.+)/ &&
546 not exists $lflibswanted{$1} }
547 split(' ', fetch_string ({}, 'libs'));
548 $value = join(' ', @libs);
550 my @libswanted = grep { not exists $lflibswanted{$_} }
551 split(' ', fetch_string ({}, 'libswanted'));
552 $value = join(' ', @libswanted);
555 $heavy_txt .= "${prefix}_nolargefiles='$value'\n";
558 $heavy_txt .= "EOVIRTUAL\n";
560 $heavy_txt .= <<'ENDOFGIT';
562 # do not have hairy conniptions if this isnt available
563 require 'Config_git.pl';
564 $Config_SH_expanded .= $Config::Git_Data;
566 } or warn "Warning: failed to load Config_git.pl, something strange about this perl...\n";
569 $heavy_txt .= $fetch_string;
571 $config_txt .= <<'ENDOFEND';
574 my($self, $key) = @_;
576 # check for cached value (which may be undef so we use exists not defined)
577 return $self->{$key} if exists $self->{$key};
579 return $self->fetch_string($key);
583 $heavy_txt .= <<'ENDOFEND';
589 substr($Config_SH_expanded, 1, index($Config_SH_expanded, '=') - 1 );
594 if ($seen_quotes{'"'}) {
595 $heavy_txt .= <<'ENDOFEND';
596 # Find out how the current key's quoted so we can skip to its end.
597 my $quote = substr($Config_SH_expanded,
598 index($Config_SH_expanded, "=", $prevpos)+1, 1);
599 my $pos = index($Config_SH_expanded, qq($quote\n), $prevpos) + 2;
602 # Just ' quotes, so it's much easier.
603 $heavy_txt .= <<'ENDOFEND';
604 my $pos = index($Config_SH_expanded, qq('\n), $prevpos) + 2;
607 $heavy_txt .= <<'ENDOFEND';
608 my $len = index($Config_SH_expanded, "=", $pos) - $pos;
610 $len > 0 ? substr($Config_SH_expanded, $pos, $len) : undef;
614 return 1 if exists($_[0]->{$_[1]});
616 return(index($Config_SH_expanded, "\n$_[1]='") != -1
618 if ($seen_quotes{'"'}) {
619 $heavy_txt .= <<'ENDOFEND';
620 or index($Config_SH_expanded, "\n$_[1]=\"") != -1
623 $heavy_txt .= <<'ENDOFEND';
627 sub STORE { die "\%Config::Config is read-only\n" }
633 substr $Config_SH_expanded, 1, $config_sh_len;
638 return map { chomp; $_ } grep eval{ /^(?:$re)=/ }, split /^/,
643 # implements -V:cfgvar option (see perlrun -V:)
645 # find optional leading, trailing colons; and query-spec
646 my ($notag,$qry,$lncont) = m/^(:)?(.*?)(:)?$/; # flags fore and aft,
647 # map colon-flags to print decorations
648 my $prfx = $notag ? '': "$qry="; # tag-prefix for print
649 my $lnend = $lncont ? ' ' : ";\n"; # line ending for print
651 # all config-vars are by definition \w only, any \W means regex
653 my @matches = config_re($qry);
654 print map "$_$lnend", @matches ? @matches : "$qry: not found" if !$notag;
655 print map { s/\w+=//; "$_$lnend" } @matches ? @matches : "$qry: not found" if $notag;
657 my $v = (exists $Config::Config{$qry}) ? $Config::Config{$qry}
659 $v = 'undef' unless defined $v;
660 print "${prfx}'${v}'$lnend";
665 # Called by the real AUTOLOAD
668 goto \&$Config::AUTOLOAD;
675 $config_txt .= <<'ENDOFSET';
678 my ($value, $v) = $Config_SH_expanded =~ m/^used_aout='(.*)'\s*$/m;
679 for (split ' ', $value) {
680 ($v) = $Config_SH_expanded =~ m/^aout_$_='(.*)'\s*$/m;
681 $preconfig{$_} = $v eq 'undef' ? undef : $v;
684 $preconfig{d_fork} = undef unless $OS2::can_fork; # Some funny cases can't
685 sub TIEHASH { bless {%preconfig} }
687 # Extract the name of the DLL from the makefile to avoid duplication
688 my ($f) = grep -r, qw(GNUMakefile Makefile);
690 if (open my $fh, '<', $f) {
692 $dll = $1, last if /^PERL_DLL_BASE\s*=\s*(\S*)\s*$/;
695 $config_txt .= <<ENDOFSET if $dll;
696 \$preconfig{dll_name} = '$dll';
699 $config_txt .= <<'ENDOFSET';
706 foreach my $key (keys %Common) {
707 my $value = fetch_string ({}, $key);
708 # Is it safe on the LHS of => ?
709 my $qkey = $key =~ /^[A-Za-z_][A-Za-z0-9_]*$/ ? $key : "'$key'";
710 if (defined $value) {
711 # Quote things for a '' string
712 $value =~ s!\\!\\\\!g;
715 if ($key eq 'otherlibdirs') {
716 $value = "join (':', map {relocate_inc(\$_)} split (':', $value))";
717 } elsif ($need_relocation{$key}) {
718 $value = "relocate_inc($value)";
723 $Common{$key} = "$qkey => $value";
726 if ($Common{byteorder}) {
727 $Common{byteorder} = 'byteorder => $byteorder';
729 my $fast_config = join '', map { " $_,\n" } sort values %Common;
731 # Sanity check needed to stop an infite loop if Config_heavy.pl fails to define
732 # &launcher for some reason (eg it got truncated)
733 $config_txt .= sprintf <<'ENDOFTIE', $fast_config;
738 require 'Config_heavy.pl';
739 goto \&launcher unless $Config::AUTOLOAD =~ /launcher$/;
740 die "&Config::AUTOLOAD failed on $Config::AUTOLOAD";
743 # tie returns the object, so the value returned to require will be true.
744 tie %%Config, 'Config', {
749 open(CONFIG_POD, ">$Config_POD") or die "Can't open $Config_POD: $!";
750 print CONFIG_POD <<'ENDOFTAIL';
753 Config - access Perl configuration information
758 if ($Config{usethreads}) {
759 print "has thread support\n"
762 use Config qw(myconfig config_sh config_vars config_re);
770 config_vars(qw(osname archname));
775 The Config module contains all the information that was available to
776 the C<Configure> program at Perl build time (over 900 values).
778 Shell variables from the F<config.sh> file (written by Configure) are
779 stored in the readonly-variable C<%Config>, indexed by their names.
781 Values stored in config.sh as 'undef' are returned as undefined
782 values. The perl C<exists> function can be used to check if a
783 named variable exists.
785 For a description of the variables, please have a look at the
786 Glossary file, as written in the Porting folder, or use the url:
787 http://perl5.git.perl.org/perl.git/blob/HEAD:/Porting/Glossary
793 Returns a textual summary of the major perl configuration values.
794 See also C<-V> in L<perlrun/Switches>.
798 Returns the entire perl configuration information in the form of the
799 original config.sh shell variable assignment script.
801 =item config_re($regex)
803 Like config_sh() but returns, as a list, only the config entries who's
804 names match the $regex.
806 =item config_vars(@names)
808 Prints to STDOUT the values of the named configuration variable. Each is
809 printed on a separate line in the form:
813 Names which are unknown are output as C<name='UNKNOWN';>.
814 See also C<-V:name> in L<perlrun/Switches>.
820 Here's a more sophisticated example of using %Config:
827 unless($Config{sig_name} && $Config{sig_num}) {
830 my @names = split ' ', $Config{sig_name};
831 @sig_num{@names} = split ' ', $Config{sig_num};
833 $sig_name[$sig_num{$_}] ||= $_;
837 print "signal #17 = $sig_name[17]\n";
838 if ($sig_num{ALRM}) {
839 print "SIGALRM is $sig_num{ALRM}\n";
844 Because this information is not stored within the perl executable
845 itself it is possible (but unlikely) that the information does not
846 relate to the actual perl binary which is being used to access it.
848 The Config module is installed into the architecture and version
849 specific library directory ($Config{installarchlib}) and it checks the
850 perl version number when loaded.
852 The values stored in config.sh may be either single-quoted or
853 double-quoted. Double-quoted strings are handy for those cases where you
854 need to include escape sequences in the strings. To avoid runtime variable
855 interpolation, any C<$> and C<@> characters are replaced by C<\$> and
856 C<\@>, respectively. This isn't foolproof, of course, so don't embed C<\$>
857 or C<\@> in double-quoted strings unless you're willing to deal with the
858 consequences. (The slashes will end up escaped and the C<$> or C<@> will
859 trigger variable interpolation)
863 Most C<Config> variables are determined by the C<Configure> script
864 on platforms supported by it (which is most UNIX platforms). Some
865 platforms have custom-made C<Config> variables, and may thus not have
866 some of the variables described below, or may have extraneous variables
867 specific to that particular port. See the port specific documentation
874 if ($Opts{glossary}) {
875 open(GLOS, "<$Glossary") or die "Can't open $Glossary: $!";
882 if (s/\A(\w*)\s+\(([\w.]+)\):\s*\n(\t?)/=item C<$1>\n\nFrom F<$2>:\n\n/m) {
883 my $c = substr $1, 0, 1;
884 unless ($seen{$c}++) {
885 print CONFIG_POD <<EOF if $text;
891 print CONFIG_POD <<EOF;
902 elsif (!$text || !/\A\t/) {
903 warn "Expected a Configure variable header",
904 ($text ? " or another paragraph of description" : () );
906 s/n't/n\00t/g; # leave can't, won't etc untouched
907 s/^\t\s+(.*)/\n$1/gm; # Indented lines ===> new paragraph
908 s/^(?<!\n\n)\t(.*)/$1/gm; # Not indented lines ===> text
909 s{([\'\"])(?=[^\'\"\s]*[./][^\'\"\s]*\1)([^\'\"\s]+)\1}(F<$2>)g; # '.o'
910 s{([\'\"])([^\'\"\s]+)\1}(C<$2>)g; # "date" command
911 s{\'([A-Za-z_\- *=/]+)\'}(C<$1>)g; # 'ln -s'
913 (?<! [\w./<\'\"] ) # Only standalone file names
914 (?! e \. g \. ) # Not e.g.
915 (?! \. \. \. ) # Not ...
917 (?! read/ ) # Not read/write
918 (?! etc\. ) # Not etc.
921 \$ ? # Allow leading $
922 [\w./]* [./] [\w./]* # Require . or / inside
924 (?<! \. (?= [\s)] ) ) # Do not include trailing dot
925 (?! [\w/] ) # Include all of it
927 (F<$1>)xg; # /usr/local
928 s/((?<=\s)~\w*)/F<$1>/g; # ~name
929 s/(?<![.<\'\"])\b([A-Z_]{2,})\b(?![\'\"])/C<$1>/g; # UNISTD
930 s/(?<![.<\'\"])\b(?!the\b)(\w+)\s+macro\b/C<$1> macro/g; # FILE_cnt macro
931 s/n[\0]t/n't/g; # undo can't, won't damage
934 if ($Opts{glossary}) {
935 <GLOS>; # Skip the "DO NOT EDIT"
936 <GLOS>; # Skip the preamble
943 print CONFIG_POD <<'ENDOFTAIL';
949 Information on the git commit from which the current perl binary was compiled
950 can be found in the variable C<$Config::Git_Data>. The variable is a
951 structured string that looks something like this:
953 git_commit_id='ea0c2dbd5f5ac6845ecc7ec6696415bf8e27bd52'
954 git_describe='GitLive-blead-1076-gea0c2db'
955 git_branch='smartmatch'
956 git_uncommitted_changes=''
957 git_commit_id_title='Commit id:'
958 git_commit_date='2009-05-09 17:47:31 +0200'
960 Its format is not guaranteed not to change over time.
964 This module contains a good example of how to use tie to implement a
965 cache and an example of how to make a tied variable readonly to those
972 close(GLOS) if $Opts{glossary};
974 print "written $Config_POD\n";
976 my $orig_config_txt = "";
977 my $orig_heavy_txt = "";
981 $orig_config_txt = <$fh> if open $fh, "<", $Config_PM;
982 $orig_heavy_txt = <$fh> if open $fh, "<", $Config_heavy;
985 if ($orig_config_txt ne $config_txt or $orig_heavy_txt ne $heavy_txt) {
986 open CONFIG, ">", $Config_PM or die "Can't open $Config_PM: $!\n";
987 open CONFIG_HEAVY, ">", $Config_heavy or die "Can't open $Config_heavy: $!\n";
988 print CONFIG $config_txt;
989 print CONFIG_HEAVY $heavy_txt;
992 print "updated $Config_PM\n";
993 print "updated $Config_heavy\n";
997 # Now create Cross.pm if needed
999 open CROSS, ">lib/Cross.pm" or die "Can not open >lib/Cross.pm: $!";
1000 my $cross = <<'EOS';
1001 # typical invocation:
1002 # perl -MCross Makefile.PL
1003 # perl -MCross=wince -V:cc
1007 my ($package,$platform) = @_;
1008 unless (defined $platform) {
1009 # if $platform is not specified, then use last one when
1010 # 'configpm; was invoked with --cross option
1011 $platform = '***replace-marker***';
1013 @INC = map {/\blib\b/?(do{local $_=$_;s/\blib\b/xlib\/$platform/;$_},$_):($_)} @INC;
1014 $::Cross::platform = $platform;
1019 $cross =~ s/\*\*\*replace-marker\*\*\*/$Opts{cross}/g;
1022 print "written lib/Cross.pm\n";
1023 unshift(@INC,"xlib/$Opts{cross}");
1026 # Now do some simple tests on the Config.pm file we have created
1027 unshift(@INC,'lib');
1028 unshift(@INC,'xlib/symbian') if $Opts{cross};
1030 require $Config_heavy;
1033 die "$0: $Config_PM not valid"
1034 unless $Config{'PERL_CONFIG_SH'} eq 'true';
1036 die "$0: error processing $Config_PM"
1037 if defined($Config{'an impossible name'})
1038 or $Config{'PERL_CONFIG_SH'} ne 'true' # test cache
1041 die "$0: error processing $Config_PM"
1042 if eval '$Config{"cc"} = 1'
1043 or eval 'delete $Config{"cc"}'
1048 # Popularity of various entries in %Config, based on a large build and test
1049 # run of code in the Fotango build system:
1067 inc_version_list: 783
1070 usevendorprefix: 642
1091 installsiteman1dir: 489
1092 installsiteman3dir: 489
1093 installvendorman1dir: 489
1094 installvendorman3dir: 489
1098 installsitearch: 344
1103 installprefixexp: 336
1106 installvendorarch: 336
1107 installvendorbin: 336
1108 installvendorlib: 336