X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=configpm;h=46b19721569264855906289f4791815f25930852;hb=a922f900a6916d70770b1348cbacd5ea3df02a9f;hp=d5623094a08c1c25b430e6cabaf7f7cb934457eb;hpb=1a9ca8275f4f07a40855b3aff68b175f39e6965e;p=p5sagit%2Fp5-mst-13.2.git diff --git a/configpm b/configpm index d562309..46b1972 100755 --- a/configpm +++ b/configpm @@ -82,7 +82,7 @@ use strict; # use vars pulls in Carp ENDOFBEG -my $myver = sprintf "v%vd", $^V; +my $myver = sprintf "%vd", $^V; printf CONFIG <<'ENDOFBEG', ($myver) x 3; # This file was created by configpm when Perl was built. Any changes @@ -295,19 +295,127 @@ EOT $byteorder_code = "our \$byteorder = '?'x$s;\n"; } +my @need_relocation; + +if (fetch_string({},'userelocatableinc')) { + foreach my $what (qw(prefixexp + + archlibexp + html1direxp + html3direxp + man1direxp + man3direxp + privlibexp + scriptdirexp + sitearchexp + sitebinexp + sitehtml1direxp + sitehtml3direxp + sitelibexp + siteman1direxp + siteman3direxp + sitescriptexp + vendorarchexp + vendorbinexp + vendorhtml1direxp + vendorhtml3direxp + vendorlibexp + vendorman1direxp + vendorman3direxp + vendorscriptexp + + siteprefixexp + sitelib_stem + vendorlib_stem + + installarchlib + installhtml1dir + installhtml3dir + installman1dir + installman3dir + installprefix + installprefixexp + installprivlib + installscript + installsitearch + installsitebin + installsitehtml1dir + installsitehtml3dir + installsitelib + installsiteman1dir + installsiteman3dir + installsitescript + installvendorarch + installvendorbin + installvendorhtml1dir + installvendorhtml3dir + installvendorlib + installvendorman1dir + installvendorman3dir + installvendorscript + )) { + push @need_relocation, $what if fetch_string({}, $what) =~ m!^\.\.\./!; + } +} + +my %need_relocation; +@need_relocation{@need_relocation} = @need_relocation; + +# This can have .../ anywhere: +if (fetch_string({}, 'otherlibdirs') =~ m!\.\.\./!) { + $need_relocation{otherlibdirs} = 'otherlibdirs'; +} + +my $relocation_code = <<'EOT'; + +sub relocate_inc { + my $libdir = shift; + return $libdir unless $libdir =~ s!^\.\.\./!!; + my $prefix = $^X; + if ($prefix =~ s!/[^/]*$!!) { + while ($libdir =~ m!^\.\./!) { + # Loop while $libdir starts "../" and $prefix still has a trailing + # directory + last unless $prefix =~ s!/([^/]+)$!!; + # but bail out if the directory we picked off the end of $prefix is . + # or .. + if ($1 eq '.' or $1 eq '..') { + # Undo! This should be rare, hence code it this way rather than a + # check each time before the s!!! above. + $prefix = "$prefix/$1"; + last; + } + # Remove that leading ../ and loop again + substr ($libdir, 0, 3, ''); + } + $libdir = "$prefix/$libdir"; + } + $libdir; +} +EOT + +if (%need_relocation) { + my $relocations_in_common; + # otherlibdirs only features in the hash + foreach (keys %need_relocation) { + $relocations_in_common++ if $Common{$_}; + } + if ($relocations_in_common) { + print CONFIG $relocation_code; + } else { + print CONFIG_HEAVY $relocation_code; + } +} + print CONFIG_HEAVY @non_v, "\n"; # copy config summary format from the myconfig.SH script -print CONFIG_HEAVY "our \$summary : unique = <<'!END!';\n"; +print CONFIG_HEAVY "our \$summary = <<'!END!';\n"; open(MYCONFIG,") && !/^Summary of/; do { print CONFIG_HEAVY $_ } until !defined($_ = ) || /^\s*$/; close(MYCONFIG); -# NB. as $summary is unique, we need to copy it in a lexical variable -# before expanding it, because may have been made readonly if a perl -# interpreter has been cloned. - print CONFIG_HEAVY "\n!END!\n", <<'EOT'; my $summary_expanded; @@ -332,23 +440,46 @@ if ($Common{byteorder}) { print CONFIG_HEAVY $byteorder_code; } +if (@need_relocation) { +print CONFIG_HEAVY 'foreach my $what (qw(', join (' ', @need_relocation), + ")) {\n", <<'EOT'; + s<^($what=)(['"])(.*?)\2> + <$1 . $2 . relocate_inc($3) . $2 . "\n" . + 'raw_' . $1 . $2 . $3 . $2>me; +} +EOT +# Currently it only makes sense to do the ... relocation on Unix, so there's +# no need to emulate the "which separator for this platform" logic in perl.c - +# ':' will always be applicable +if ($need_relocation{otherlibdirs}) { +print CONFIG_HEAVY << 'EOT'; +s{^(otherlibdirs=)(['"])(.*?)\2} + {$1 . $2 . join ':', map {relocate_inc($_)} split ':', $3 . $2}me; +EOT +} +} + print CONFIG_HEAVY <<'EOT'; s/(byteorder=)(['"]).*?\2/$1$2$Config::byteorder$2/m; my $config_sh_len = length $_; -our $Config_SH_expanded : unique = "\n$_" . << 'EOVIRTUAL'; +our $Config_SH_expanded = "\n$_" . << 'EOVIRTUAL'; EOT foreach my $prefix (qw(ccflags ldflags)) { my $value = fetch_string ({}, $prefix); my $withlargefiles = fetch_string ({}, $prefix . "_uselargefiles"); - $value =~ s/\Q$withlargefiles\E\b//; - print CONFIG_HEAVY "${prefix}_nolargefiles='$value'\n"; + if (defined $withlargefiles) { + $value =~ s/\Q$withlargefiles\E\b//; + print CONFIG_HEAVY "${prefix}_nolargefiles='$value'\n"; + } } foreach my $prefix (qw(libs libswanted)) { my $value = fetch_string ({}, $prefix); + my $withlf = fetch_string ({}, 'libswanted_uselargefiles'); + next unless defined $withlf; my @lflibswanted = split(' ', fetch_string ({}, 'libswanted_uselargefiles')); if (@lflibswanted) { @@ -516,6 +647,11 @@ foreach my $key (keys %Common) { $value =~ s!\\!\\\\!g; $value =~ s!'!\\'!g; $value = "'$value'"; + if ($key eq 'otherlibdirs') { + $value = "join (':', map {relocate_inc(\$_)} split (':', $value))"; + } elsif ($need_relocation{$key}) { + $value = "relocate_inc($value)"; + } } else { $value = "undef"; } @@ -527,20 +663,21 @@ if ($Common{byteorder}) { } my $fast_config = join '', map { " $_,\n" } sort values %Common; +# Sanity check needed to stop an infite loop if Config_heavy.pl fails to define +# &launcher for some reason (eg it got truncated) print CONFIG sprintf <<'ENDOFTIE', $fast_config; sub DESTROY { } sub AUTOLOAD { require 'Config_heavy.pl'; - goto \&launcher; + goto \&launcher unless $Config::AUTOLOAD =~ /launcher$/; die "&Config::AUTOLOAD failed on $Config::AUTOLOAD"; } +# tie returns the object, so the value returned to require will be true. tie %%Config, 'Config', { %s}; - -1; ENDOFTIE @@ -772,11 +909,14 @@ EOS $cross =~ s/\*\*\*replace-marker\*\*\*/$Opts{cross}/g; print CROSS $cross; close CROSS; + unshift(@INC,"xlib/$Opts{cross}"); } # Now do some simple tests on the Config.pm file we have created unshift(@INC,'lib'); +unshift(@INC,'xlib/symbian') if $Opts{cross}; require $Config_PM; +require $Config_heavy; import Config; die "$0: $Config_PM not valid"