+if ($seen_quotes{'"'}) {
+ # We need the full ' and " code
+ $fetch_string .= <<'EOT';
+ my $quote_type = "'";
+ my $marker = "$key=";
+
+ # Check for the common case, ' delimited
+ my $start = index($Config_SH_expanded, "\n$marker$quote_type");
+ # If that failed, check for " delimited
+ if ($start == -1) {
+ $quote_type = '"';
+ $start = index($Config_SH_expanded, "\n$marker$quote_type");
+ }
+EOT
+} else {
+ $fetch_string .= <<'EOT';
+ # We only have ' delimted.
+ my $start = index($Config_SH_expanded, "\n$key=\'");
+EOT
+}
+$fetch_string .= <<'EOT';
+ # Start can never be -1 now, as we've rigged the long string we're
+ # searching with an initial dummy newline.
+ return undef if $start == -1;
+
+ $start += length($key) + 3;
+
+EOT
+if (!$seen_quotes{'"'}) {
+ # Don't need the full ' and " code, or the eval expansion.
+ $fetch_string .= <<'EOT';
+ my $value = substr($Config_SH_expanded, $start,
+ index($Config_SH_expanded, "'\n", $start)
+ - $start);
+EOT
+} else {
+ $fetch_string .= <<'EOT';
+ my $value = substr($Config_SH_expanded, $start,
+ index($Config_SH_expanded, "$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\"";
+ }
+EOT
+}
+$fetch_string .= <<'EOT';
+ # So we can say "if $Config{'foo'}".
+ $value = undef if $value eq 'undef';
+ $self->{$key} = $value; # cache it
+}
+EOT
+
+eval $fetch_string;
+die if $@;
+
+# Calculation for the keys for byteorder
+# This is somewhat grim, but I need to run fetch_string here.
+our $Config_SH_expanded = join "\n", '', @v_others;
+
+my $t = fetch_string ({}, 'ivtype');
+my $s = fetch_string ({}, 'ivsize');
+
+# byteorder does exist on its own but we overlay a virtual
+# dynamically recomputed value.
+
+# However, ivtype and ivsize will not vary for sane fat binaries
+
+my $f = $t eq 'long' ? 'L!' : $s == 8 ? 'Q': 'I';
+
+my $byteorder_code;
+if ($s == 4 || $s == 8) {
+ my $list = join ',', reverse(2..$s);
+ my $format = 'a'x$s;
+ $byteorder_code = <<"EOT";
+
+my \$i = 0;
+foreach my \$c ($list) { \$i |= ord(\$c); \$i <<= 8 }
+\$i |= ord(1);
+our \$byteorder = join('', unpack('$format', pack('$f', \$i)));
+EOT
+} else {
+ $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) {
+ $config_txt .= $relocation_code;
+ } else {
+ $heavy_txt .= $relocation_code;
+ }
+}
+
+$heavy_txt .= join('', @non_v) . "\n";
+
+# copy config summary format from the myconfig.SH script
+$heavy_txt .= "our \$summary = <<'!END!';\n";
+open(MYCONFIG,"<myconfig.SH") || die "open myconfig.SH failed: $!";