open CONFIG, ">$config_pm" or die "Can't open $config_pm: $!\n";
-$myver = $];
+$myver = sprintf "v%vd", $^V;
-print CONFIG <<"ENDOFBEG";
+print CONFIG <<'ENDOFBEG_NOQ', <<"ENDOFBEG";
package Config;
use Exporter ();
-\@ISA = (Exporter);
-\@EXPORT = qw(%Config);
-\@EXPORT_OK = qw(myconfig config_sh config_vars);
+@EXPORT = qw(%Config);
+@EXPORT_OK = qw(myconfig config_sh config_vars);
+
+# Define our own import method to avoid pulling in the full Exporter:
+sub import {
+ my $pkg = shift;
+ @_ = @EXPORT unless @_;
+ my @func = grep {$_ ne '%Config'} @_;
+ local $Exporter::ExportLevel = 1;
+ Exporter::import('Config', @func) if @func;
+ return if @func == @_;
+ my $callpkg = caller(0);
+ *{"$callpkg\::Config"} = \%Config;
+}
+
+ENDOFBEG_NOQ
+die "Perl lib version ($myver) doesn't match executable version (\$])"
+ unless \$^V;
-\$] == $myver
- or die "Perl lib version ($myver) doesn't match executable version (\$])";
+\$^V eq $myver
+ or die "Perl lib version ($myver) doesn't match executable version (" .
+ (sprintf "v%vd",\$^V) . ")";
# This file was created by configpm when Perl was built. Any changes
# made to this file will be lost the next time perl is built.
while (<>) {
next if m:^#!/bin/sh:;
- # Catch CONFIG=true and PATCHLEVEL=n line from Configure.
+ # Catch CONFIGDOTSH=true and PERL_VERSION=n line from Configure.
s/^(\w+)=(true|\d+)\s*$/$1='$2'\n/;
- unless ($in_v or m/^(\w+)='(.*\n)/){
+ my ($k,$v) = ($1,$2);
+ # grandfather PATCHLEVEL and SUBVERSION and CONFIG
+ if ($k) {
+ if ($k eq 'PERL_VERSION') {
+ push @v_others, "PATCHLEVEL='$v'\n";
+ }
+ elsif ($k eq 'PERL_SUBVERSION') {
+ push @v_others, "SUBVERSION='$v'\n";
+ }
+ elsif ($k eq 'CONFIGDOTSH') {
+ push @v_others, "CONFIG='$v'\n";
+ }
+ }
+ # We can delimit things in config.sh with either ' or ".
+ unless ($in_v or m/^(\w+)=(['"])(.*\n)/){
push(@non_v, "#$_"); # not a name='value' line
next;
}
+ $quote = $2;
if ($in_v) { $val .= $_; }
- else { ($name,$val) = ($1,$2); }
- $in_v = $val !~ /'\n/;
+ else { ($name,$val) = ($1,$3); }
+ $in_v = $val !~ /$quote\n/;
next if $in_v;
if ($extensions{$name}) { s,/,::,g }
- if (!$fast{$name}){ push(@v_others, "$name='$val"); next; }
- push(@v_fast,"$name='$val");
+ if (!$fast{$name}){ push(@v_others, "$name=$quote$val"); next; }
+ push(@v_fast,"$name=$quote$val");
}
foreach(@non_v){ print CONFIG $_ }
join("", @v_fast, sort @v_others),
"!END!\n\n";
-# copy config summary format from the myconfig script
+# copy config summary format from the myconfig.SH script
print CONFIG "my \$summary = <<'!END!';\n";
-open(MYCONFIG,"<myconfig") || die "open myconfig failed: $!";
+open(MYCONFIG,"<myconfig.SH") || die "open myconfig.SH failed: $!";
1 while defined($_ = <MYCONFIG>) && !/^Summary of/;
do { print CONFIG $_ } until !defined($_ = <MYCONFIG>) || /^\s*$/;
close(MYCONFIG);
return $_[0]->{$_[1]} if (exists $_[0]->{$_[1]});
# Search for it in the big string
- my($value, $start, $marker);
- $marker = "$_[1]='";
- # return undef unless (($value) = $config_sh =~ m/^$_[1]='(.*)'\s*$/m);
- $start = index($config_sh, "\n$marker");
- return undef if ( ($start == -1) && # in case it's first
- (substr($config_sh, 0, length($marker)) ne $marker) );
- if ($start == -1) { $start = length($marker) }
- else { $start += length($marker) + 1 }
- $value = substr($config_sh, $start,
- index($config_sh, qq('\n), $start) - $start);
-
- $value = undef if $value eq 'undef'; # So we can say "if $Config{'foo'}".
+ my($value, $start, $marker, $quote_type);
+
+ $quote_type = "'";
+ # Virtual entries.
+ if ($_[1] eq 'byteorder') {
+ # byteorder does exist on its own but we overlay a virtual
+ # dynamically recomputed value.
+ my $t = $Config{ivtype};
+ my $s = $Config{ivsize};
+ my $f = $t eq 'long' ? 'L!' : $s == 8 ? 'Q': 'I';
+ if ($s == 4 || $s == 8) {
+ my $i = 0;
+ foreach my $c (reverse(2..$s)) { $i |= ord($c); $i <<= 8 }
+ $i |= ord(1);
+ $value = join('', unpack('a'x$s, pack($f, $i)));
+ } else {
+ $value = '?'x$s;
+ }
+ } elsif ($_[1] =~ /^((?:cc|ld)flags|libs(?:wanted)?)_nolargefiles/) {
+ # These are purely virtual, they do not exist, but need to
+ # be computed on demand for largefile-incapable extensions.
+ my $key = "${1}_uselargefiles";
+ $value = $Config{$1};
+ my $withlargefiles = $Config{$key};
+ if ($key =~ /^(?:cc|ld)flags_/) {
+ $value =~ s/\Q$withlargefiles\E\b//;
+ } elsif ($key =~ /^libs/) {
+ my @lflibswanted = split(' ', $Config{libswanted_uselargefiles});
+ if (@lflibswanted) {
+ my %lflibswanted;
+ @lflibswanted{@lflibswanted} = ();
+ if ($key =~ /^libs_/) {
+ my @libs = grep { /^-l(.+)/ &&
+ not exists $lflibswanted{$1} }
+ split(' ', $Config{libs});
+ $Config{libs} = join(' ', @libs);
+ } elsif ($key =~ /^libswanted_/) {
+ my @libswanted = grep { not exists $lflibswanted{$_} }
+ split(' ', $Config{libswanted});
+ $Config{libswanted} = join(' ', @libswanted);
+ }
+ }
+ }
+ } else {
+ $marker = "$_[1]=";
+ # return undef unless (($value) = $config_sh =~ m/^$_[1]='(.*)'\s*$/m);
+ # Check for the common case, ' delimeted
+ $start = index($config_sh, "\n$marker$quote_type");
+ # If that failed, check for " delimited
+ if ($start == -1) {
+ $quote_type = '"';
+ $start = index($config_sh, "\n$marker$quote_type");
+ }
+ return undef if ( ($start == -1) && # in case it's first
+ (substr($config_sh, 0, length($marker)) ne $marker) );
+ if ($start == -1) {
+ # It's the very first thing we found. Skip $start forward
+ # and figure out the quote mark after the =.
+ $start = length($marker) + 1;
+ $quote_type = substr($config_sh, $start - 1, 1);
+ }
+ else {
+ $start += length($marker) + 2;
+ }
+ $value = substr($config_sh, $start,
+ index($config_sh, "$quote_type\n", $start) - $start);
+ }
+ # If we had a double-quote, we'd better eval it so escape
+ # sequences and such can be interpolated. Since the incoming
+ # value is supposed to follow shell rules and not perl rules,
+ # we escape any perl variable markers
+ if ($quote_type eq '"') {
+ $value =~ s/\$/\\\$/g;
+ $value =~ s/\@/\\\@/g;
+ eval "\$value = \"$value\"";
+ }
+ #$value = sprintf($value) if $quote_type eq '"';
+ # So we can say "if $Config{'foo'}".
+ $value = undef if $value eq 'undef';
$_[0]->{$_[1]} = $value; # cache it
return $value;
}
}
sub NEXTKEY {
- my $pos = index($config_sh, qq('\n), $prevpos) + 2;
+ # Find out how the current key's quoted so we can skip to its end.
+ my $quote = substr($config_sh, index($config_sh, "=", $prevpos)+1, 1);
+ my $pos = index($config_sh, qq($quote\n), $prevpos) + 2;
my $len = index($config_sh, "=", $pos) - $pos;
$prevpos = $pos;
$len > 0 ? substr($config_sh, $pos, $len) : undef;
# exists($_[0]->{$_[1]}) or $config_sh =~ m/^$_[1]=/m;
exists($_[0]->{$_[1]}) or
index($config_sh, "\n$_[1]='") != -1 or
- substr($config_sh, 0, length($_[1])+2) eq "$_[1]='";
+ substr($config_sh, 0, length($_[1])+2) eq "$_[1]='" or
+ index($config_sh, "\n$_[1]=\"") != -1 or
+ substr($config_sh, 0, length($_[1])+2) eq "$_[1]=\"" or
+ $_[1] =~ /^(?:(?:cc|ld)flags|libs(?:wanted)?)_nolargefiles$/;
}
sub STORE { die "\%Config::Config is read-only\n" }
specific library directory ($Config{installarchlib}) and it checks the
perl version number when loaded.
+The values stored in config.sh may be either single-quoted or
+double-quoted. Double-quoted strings are handy for those cases where you
+need to include escape sequences in the strings. To avoid runtime variable
+interpolation, any C<$> and C<@> characters are replaced by C<\$> and
+C<\@>, respectively. This isn't foolproof, of course, so don't embed C<\$>
+or C<\@> in double-quoted strings unless you're willing to deal with the
+consequences. (The slashes will end up escaped and the C<$> or C<@> will
+trigger variable interpolation)
+
=head1 GLOSSARY
Most C<Config> variables are determined by the C<Configure> script
import Config;
die "$0: $config_pm not valid"
- unless $Config{'CONFIG'} eq 'true';
+ unless $Config{'CONFIGDOTSH'} eq 'true';
die "$0: error processing $config_pm"
if defined($Config{'an impossible name'})
- or $Config{'CONFIG'} ne 'true' # test cache
+ or $Config{'CONFIGDOTSH'} ne 'true' # test cache
;
die "$0: error processing $config_pm"