OS/390 cleanable gunk.
[p5sagit/p5-mst-13.2.git] / lib / ExtUtils / MM_Unix.pm
index 4a07185..da84461 100644 (file)
@@ -1,25 +1,25 @@
 package ExtUtils::MM_Unix;
 
+use strict;
+
 use Exporter ();
 use Config;
 use File::Basename qw(basename dirname fileparse);
 use DirHandle;
 use strict;
-use vars qw($VERSION $Is_Mac $Is_OS2 $Is_VMS $Is_Win32 $Is_Dos $Is_PERL_OBJECT
-           $Verbose %pm %static $Xsubpp_Version);
+our ($Is_Mac,$Is_OS2,$Is_VMS,$Is_Win32,$Is_Dos,
+           $Verbose,%pm,%static,$Xsubpp_Version);
 
-$VERSION = substr q$Revision: 1.12602 $, 10;
-# $Id: MM_Unix.pm,v 1.126 1998/06/28 21:32:49 k Exp k $
+our $VERSION = '1.12603';
 
-Exporter::import('ExtUtils::MakeMaker', qw($Verbose &neatvalue));
+require ExtUtils::MakeMaker;
+ExtUtils::MakeMaker->import(qw($Verbose &neatvalue));
 
 $Is_OS2 = $^O eq 'os2';
 $Is_Mac = $^O eq 'MacOS';
 $Is_Win32 = $^O eq 'MSWin32';
 $Is_Dos = $^O eq 'dos';
 
-$Is_PERL_OBJECT = $Config{'ccflags'} =~ /-DPERL_OBJECT/;
-
 if ($Is_VMS = $^O eq 'VMS') {
     require VMS::Filespec;
     import VMS::Filespec qw( &vmsify );
@@ -79,15 +79,17 @@ path. On UNIX eliminated successive slashes and successive "/.".
 
 sub canonpath {
     my($self,$path) = @_;
+    
+    # Handle POSIX-style node names beginning with double slash
     my $node = '';
-    if ( $^O eq 'qnx' && $path =~ s|^(//\d+)/|/| ) {
+    if ( $^O =~ m/^(?:qnx|nto)$/ && $path =~ s:^(//[^/]+)(/|\z):/:s ) {
       $node = $1;
     }
     $path =~ s|(?<=[^/])/+|/|g ;                   # xx////xx  -> xx/xx
     $path =~ s|(/\.)+/|/|g ;                       # xx/././xx -> xx/xx
-    $path =~ s|^(\./)+|| unless $path eq "./";     # ./xx      -> xx
-    $path =~ s|(?<=[^/])/$|| ;                     # xx/       -> xx
-    "$node$path";
+    $path =~ s|^(\./)+||s unless $path eq "./";    # ./xx      -> xx
+    $path =~ s|(?<=[^/])/\z|| ;                    # xx/       -> xx
+    return "$node$path";
 }
 
 =item catdir
@@ -208,6 +210,7 @@ sub ExtUtils::MM_Unix::parse_version ;
 sub ExtUtils::MM_Unix::pasthru ;
 sub ExtUtils::MM_Unix::path ;
 sub ExtUtils::MM_Unix::perl_archive;
+sub ExtUtils::MM_Unix::perl_archive_after;
 sub ExtUtils::MM_Unix::perl_script ;
 sub ExtUtils::MM_Unix::perldepend ;
 sub ExtUtils::MM_Unix::pm_to_blib ;
@@ -217,6 +220,7 @@ sub ExtUtils::MM_Unix::postamble ;
 sub ExtUtils::MM_Unix::ppd ;
 sub ExtUtils::MM_Unix::prefixify ;
 sub ExtUtils::MM_Unix::processPL ;
+sub ExtUtils::MM_Unix::quote_paren ;
 sub ExtUtils::MM_Unix::realclean ;
 sub ExtUtils::MM_Unix::replace_manpage_separator ;
 sub ExtUtils::MM_Unix::static ;
@@ -264,23 +268,35 @@ sub c_o {
     my($self) = shift;
     return '' unless $self->needs_linking();
     my(@m);
+    if (my $cpp = $Config{cpprun}) {
+        my $cpp_cmd = $self->const_cccmd;
+        $cpp_cmd =~ s/^CCCMD\s*=\s*\$\(CC\)/$cpp/;
+        push @m, '
+.c.i:
+       '. $cpp_cmd . ' $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.c > $*.i
+';
+    }
+    push @m, '
+.c.s:
+       $(CCCMD) -S $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.c
+';
     push @m, '
 .c$(OBJ_EXT):
-       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
+       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.c
 ';
     push @m, '
 .C$(OBJ_EXT):
-       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.C
+       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.C
 ' if $^O ne 'os2' and $^O ne 'MSWin32' and $^O ne 'dos'; #Case-specific
     push @m, '
 .cpp$(OBJ_EXT):
-       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cpp
+       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.cpp
 
 .cxx$(OBJ_EXT):
-       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cxx
+       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.cxx
 
 .cc$(OBJ_EXT):
-       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cc
+       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.cc
 ';
     join "", @m;
 }
@@ -305,8 +321,8 @@ sub cflags {
     $libperl ||= $self->{LIBPERL_A} || "libperl$self->{LIB_EXT}" ;
     $libperl =~ s/\.\$\(A\)$/$self->{LIB_EXT}/;
 
-    @cflags{qw(cc ccflags optimize large split shellflags)}
-       = @Config{qw(cc ccflags optimize large split shellflags)};
+    @cflags{qw(cc ccflags optimize shellflags)}
+       = @Config{qw(cc ccflags optimize shellflags)};
     my($optdebug) = "";
 
     $cflags{shellflags} ||= '';
@@ -341,16 +357,12 @@ sub cflags {
          optimize=\"$cflags{optimize}\"
          perltype=\"$cflags{perltype}\"
          optdebug=\"$cflags{optdebug}\"
-         large=\"$cflags{large}\"
-         split=\"$cflags{'split'}\"
          eval '$prog'
          echo cc=\$cc
          echo ccflags=\$ccflags
          echo optimize=\$optimize
          echo perltype=\$perltype
          echo optdebug=\$optdebug
-         echo large=\$large
-         echo split=\$split
          `;
        my($line);
        foreach $line (@o){
@@ -368,22 +380,13 @@ sub cflags {
        $cflags{optimize} = $optdebug;
     }
 
-    for (qw(ccflags optimize perltype large split)) {
+    for (qw(ccflags optimize perltype)) {
        $cflags{$_} =~ s/^\s+//;
        $cflags{$_} =~ s/\s+/ /g;
        $cflags{$_} =~ s/\s+$//;
        $self->{uc $_} ||= $cflags{$_}
     }
 
-    if ($Is_PERL_OBJECT) {
-        $self->{CCFLAGS} =~ s/-DPERL_OBJECT(\b|$)/-DPERL_CAPI/g;
-        if ($Is_Win32 && $Config{'cc'} =~ /^cl/i) {
-            # Turn off C++ mode of the MSC compiler
-            $self->{CCFLAGS} =~ s/-TP(\s|$)//;
-            $self->{OPTIMIZE} =~ s/-TP(\s|$)//;
-        }
-    }
-
     if ($self->{POLLUTE}) {
        $self->{CCFLAGS} .= ' -DPERL_POLLUTE ';
     }
@@ -395,12 +398,13 @@ sub cflags {
        $pollute = '$(PERL_MALLOC_DEF)';
     }
 
+    $self->{CCFLAGS}  = quote_paren($self->{CCFLAGS});
+    $self->{OPTIMIZE} = quote_paren($self->{CCFLAGS});
+
     return $self->{CFLAGS} = qq{
 CCFLAGS = $self->{CCFLAGS}
 OPTIMIZE = $self->{OPTIMIZE}
 PERLTYPE = $self->{PERLTYPE}
-LARGE = $self->{LARGE}
-SPLIT = $self->{SPLIT}
 MPOLLUTE = $pollute
 };
 
@@ -441,12 +445,21 @@ EOT
     }
 
     my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
+    if ( $^O eq 'qnx' ) {
+      my @errfiles = @{$self->{C}};
+      for ( @errfiles ) {
+       s/.c$/.err/;
+      }
+      push( @otherfiles, @errfiles, 'perlmain.err' );
+    }
     push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
     push(@otherfiles, qw[./blib $(MAKE_APERL_FILE) $(INST_ARCHAUTODIR)/extralibs.all
-                        perlmain.c mon.out core so_locations pm_to_blib
-                        *~ */*~ */*/*~ *$(OBJ_EXT) *$(LIB_EXT) perl.exe
-                        $(BOOTSTRAP) $(BASEEXT).bso $(BASEEXT).def
-                        $(BASEEXT).exp
+                        perlmain.c tmon.out mon.out core core.*perl.*.?
+                        *perl.core so_locations pm_to_blib
+                        *$(OBJ_EXT) *$(LIB_EXT) perl.exe perl perl$(EXE_EXT)
+                        $(BOOTSTRAP) $(BASEEXT).bso
+                        $(BASEEXT).def lib$(BASEEXT).def
+                        $(BASEEXT).exp $(BASEEXT).x
                        ]);
     push @m, "\t-$self->{RM_RF} @otherfiles\n";
     # See realclean and ext/utils/make_ext for usage of Makefile.old
@@ -469,8 +482,9 @@ sub const_cccmd {
     return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
     return '' unless $self->needs_linking();
     return $self->{CONST_CCCMD} =
-       q{CCCMD = $(CC) -c $(INC) $(CCFLAGS) $(OPTIMIZE) \\
-       $(PERLTYPE) $(LARGE) $(SPLIT) $(MPOLLUTE) $(DEFINE_VERSION) \\
+       q{CCCMD = $(CC) -c $(PASTHRU_INC) $(INC) \\
+       $(CCFLAGS) $(OPTIMIZE) \\
+       $(PERLTYPE) $(MPOLLUTE) $(DEFINE_VERSION) \\
        $(XS_DEFINE_VERSION)};
 }
 
@@ -492,7 +506,8 @@ sub const_config {
     foreach $m (@{$self->{CONFIG}}){
        # SITE*EXP macros are defined in &constants; avoid duplicates here
        next if $once_only{$m} or $m eq 'sitelibexp' or $m eq 'sitearchexp';
-       push @m, "\U$m\E = ".$self->{uc $m}."\n";
+       $self->{uc $m} = quote_paren($self->{uc $m});
+       push @m, uc($m) , ' = ' , $self->{uc $m}, "\n";
        $once_only{$m} = 1;
     }
     join('', @m);
@@ -543,7 +558,8 @@ sub constants {
              INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
              PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
              FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC
-             PERL_INC PERL FULLPERL
+             PERL_INC PERL FULLPERL PERLRUN PERLRUNINST TEST_LIBS 
+              FULL_AR PERL_CORE
 
              / ) {
        next unless defined $self->{$tmp};
@@ -573,7 +589,7 @@ MM_VERSION = $ExtUtils::MakeMaker::VERSION
 
     for $tmp (qw/
              FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
-             LDFROM LINKTYPE
+             LDFROM LINKTYPE PM_FILTER
              / ) {
        next unless defined $self->{$tmp};
        push @m, "$tmp = $self->{$tmp}\n";
@@ -621,7 +637,7 @@ MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})."
 # work around a famous dec-osf make(1) feature(?):
 makemakerdflt: all
 
-.SUFFIXES: .xs .c .C .cpp .cxx .cc \$(OBJ_EXT)
+.SUFFIXES: .xs .c .C .cpp .i .s .cxx .cc \$(OBJ_EXT)
 
 # Nick wanted to get rid of .PRECIOUS. I don't remember why. I seem to recall, that
 # some make implementations will delete the Makefile when we rebuild it. Because
@@ -667,6 +683,10 @@ EXPORT_LIST = $tmp
     push @m, "
 PERL_ARCHIVE = $tmp
 ";
+    $tmp = $self->perl_archive_after;
+    push @m, "
+PERL_ARCHIVE_AFTER = $tmp
+";
 
 #    push @m, q{
 #INST_PM = }.join(" \\\n\t", sort values %{$self->{PM}}).q{
@@ -725,7 +745,7 @@ sub dir_target {
        my($targ) = $self->catfile($dir,'.exists');
        # catfile may have adapted syntax of $dir to target OS, so...
        if ($Is_VMS) { # Just remove file name; dirspec is often in macro
-           ($targdir = $targ) =~ s:/?\.exists$::;
+           ($targdir = $targ) =~ s:/?\.exists\z::;
        }
        else { # while elsewhere we expect to see the dir separator in $targ
            $targdir = dirname($targ);
@@ -799,7 +819,7 @@ DIST_DEFAULT = $dist_default
 
 =item dist_basics (o)
 
-Defines the targets distclean, distcheck, skipcheck, manifest.
+Defines the targets distclean, distcheck, skipcheck, manifest, veryclean.
 
 =cut
 
@@ -812,21 +832,26 @@ distclean :: realclean distcheck
 
     push @m, q{
 distcheck :
-       $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=fullcheck \\
+       $(PERLRUN) -MExtUtils::Manifest=fullcheck \\
                -e fullcheck
 };
 
     push @m, q{
 skipcheck :
-       $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=skipcheck \\
+       $(PERLRUN) -MExtUtils::Manifest=skipcheck \\
                -e skipcheck
 };
 
     push @m, q{
 manifest :
-       $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=mkmanifest \\
+       $(PERLRUN) -MExtUtils::Manifest=mkmanifest \\
                -e mkmanifest
 };
+
+    push @m, q{
+veryclean : realclean
+       $(RM_F) *~ *.orig */*~ */*.orig
+};
     join "", @m;
 }
 
@@ -841,7 +866,7 @@ sub dist_ci {
     my @m;
     push @m, q{
 ci :
-       $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=maniread \\
+       $(PERLRUN) -MExtUtils::Manifest=maniread \\
                -e "@all = keys %{ maniread() };" \\
                -e 'print("Executing $(CI) @all\n"); system("$(CI) @all");' \\
                -e 'print("Executing $(RCS_LABEL) ...\n"); system("$(RCS_LABEL) @all");'
@@ -908,7 +933,7 @@ sub dist_dir {
     push @m, q{
 distdir :
        $(RM_RF) $(DISTVNAME)
-       $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=manicopy,maniread \\
+       $(PERLRUN) -MExtUtils::Manifest=manicopy,maniread \\
                -e "manicopy(maniread(),'$(DISTVNAME)', '$(DIST_CP)');"
 };
     join "", @m;
@@ -927,7 +952,7 @@ sub dist_test {
     my @m;
     push @m, q{
 disttest : distdir
-       cd $(DISTVNAME) && $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) Makefile.PL
+       cd $(DISTVNAME) && $(PERLRUN) Makefile.PL
        cd $(DISTVNAME) && $(MAKE)
        cd $(DISTVNAME) && $(MAKE) test
 };
@@ -963,7 +988,7 @@ static :: $self->{BASEEXT}.exp
 
     push(@m,"
 $self->{BASEEXT}.exp: Makefile.PL
-",'    $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e \'use ExtUtils::Mksymlists; \\
+",'    $(PERLRUN) -e \'use ExtUtils::Mksymlists; \\
        Mksymlists("NAME" => "',$self->{NAME},'", "DL_FUNCS" => ',
        neatvalue($funcs), ', "FUNCLIST" => ', neatvalue($funclist),
        ', "DL_VARS" => ', neatvalue($vars), ');\'
@@ -1011,7 +1036,7 @@ BOOTSTRAP = '."$self->{BASEEXT}.bs".'
 # The DynaLoader only reads a non-empty file.
 $(BOOTSTRAP): '."$self->{MAKEFILE} $self->{BOOTDEP}".' $(INST_ARCHAUTODIR)/.exists
        '.$self->{NOECHO}.'echo "Running Mkbootstrap for $(NAME) ($(BSLOADLIBS))"
-       '.$self->{NOECHO}.'$(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" \
+       '.$self->{NOECHO}.'$(PERLRUN) \
                -MExtUtils::Mkbootstrap \
                -e "Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
        '.$self->{NOECHO}.'$(TOUCH) $(BOOTSTRAP)
@@ -1042,14 +1067,15 @@ sub dynamic_lib {
     my($ldfrom) = '$(LDFROM)';
     $armaybe = 'ar' if ($^O eq 'dec_osf' and $armaybe eq ':');
     my(@m);
+    my $ld_opt = $Is_OS2 ? '$(OPTIMIZE) ' : '';        # Useful on other systems too?
     push(@m,'
 # This section creates the dynamically loadable $(INST_DYNAMIC)
 # from $(OBJECT) and possibly $(MYEXTLIB).
 ARMAYBE = '.$armaybe.'
-OTHERLDFLAGS = '.$otherldflags.'
+OTHERLDFLAGS = '.$ld_opt.$otherldflags.'
 INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
 
-$(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
+$(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(PERL_ARCHIVE_AFTER) $(INST_DYNAMIC_DEP)
 ');
     if ($armaybe ne ':'){
        $ldfrom = 'tmp$(LIB_EXT)';
@@ -1058,18 +1084,20 @@ $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists
     }
     $ldfrom = "-all $ldfrom -none" if ($^O eq 'dec_osf');
 
-    # Brain dead solaris linker does not use LD_RUN_PATH?
-    # This fixes dynamic extensions which need shared libs
-    my $ldrun = '';
-    $ldrun = join ' ', map "-R$_", split /:/, $self->{LD_RUN_PATH}
-       if ($^O eq 'solaris');
-
-    # The IRIX linker also doesn't use LD_RUN_PATH
-    $ldrun = qq{-rpath "$self->{LD_RUN_PATH}"}
+    # The IRIX linker doesn't use LD_RUN_PATH
+    my $ldrun = qq{-rpath "$self->{LD_RUN_PATH}"}
        if ($^O eq 'irix' && $self->{LD_RUN_PATH});
 
-    push(@m,'  LD_RUN_PATH="$(LD_RUN_PATH)" $(LD) -o $@ '.$ldrun.' $(LDDLFLAGS) '.$ldfrom.
-               ' $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) $(EXPORT_LIST)');
+    # For example in AIX the shared objects/libraries from previous builds
+    # linger quite a while in the shared dynalinker cache even when nobody
+    # is using them.  This is painful if one for instance tries to restart
+    # a failed build because the link command will fail unnecessarily 'cos
+    # the shared object/library is 'busy'.
+    push(@m,'  $(RM_F) $@
+');
+
+    push(@m,'  LD_RUN_PATH="$(LD_RUN_PATH)" $(LD) '.$ldrun.' $(LDDLFLAGS) '.$ldfrom.
+               ' $(OTHERLDFLAGS) -o $@ $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) $(PERL_ARCHIVE_AFTER) $(EXPORT_LIST)');
     push @m, '
        $(CHMOD) $(PERM_RWX) $@
 ';
@@ -1111,10 +1139,10 @@ Takes as argument a path and returns true, if it is an absolute path.
 sub file_name_is_absolute {
     my($self,$file) = @_;
     if ($Is_Dos){
-        $file =~ m{^([a-z]:)?[\\/]}i ;
+        $file =~ m{^([a-z]:)?[\\/]}is ;
     }
     else {
-        $file =~ m:^/: ;
+        $file =~ m:^/:s ;
     }
 }
 
@@ -1134,9 +1162,9 @@ in these dirs:
 @$dirs
 ";
     }
-    foreach $dir (@$dirs){
-       next unless defined $dir; # $self->{PERL_SRC} may be undefined
-       foreach $name (@$names){
+    foreach $name (@$names){
+       foreach $dir (@$dirs){
+           next unless defined $dir; # $self->{PERL_SRC} may be undefined
            my ($abs, $val);
            if ($self->file_name_is_absolute($name)) { # /foo/bar
                $abs = $name;
@@ -1236,11 +1264,6 @@ eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}'
            next;
        }
        my($dev,$ino,$mode) = stat FIXIN;
-       # If they override perm_rwx, we won't notice it during fixin,
-       # because fixin is run through a new instance of MakeMaker.
-       # That is why we must run another CHMOD later.
-       $mode = oct($self->perm_rwx) unless $dev;
-       chmod $mode, $file;
        
        # Print out the new #! line (or equivalent).
        local $\;
@@ -1248,7 +1271,15 @@ eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}'
        print FIXOUT $shb, <FIXIN>;
        close FIXIN;
        close FIXOUT;
-       # can't rename open files on some DOSISH platforms
+
+       # can't rename/chmod open files on some DOSISH platforms
+
+       # If they override perm_rwx, we won't notice it during fixin,
+       # because fixin is run through a new instance of MakeMaker.
+       # That is why we must run another CHMOD later.
+       $mode = oct($self->perm_rwx) unless $dev;
+       chmod $mode, $file;
+
        unless ( rename($file, "$file.bak") ) { 
            warn "Can't rename $file to $file.bak: $!";
            next;
@@ -1263,6 +1294,7 @@ eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}'
        }
        unlink "$file.bak";
     } continue {
+       close(FIXIN) if fileno(FIXIN);
        chmod oct($self->perm_rwx), $file or
          die "Can't reset permissions for $file: $!\n";
        system("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';;
@@ -1297,7 +1329,7 @@ sub guess_name {
     my($self) = @_;
     use Cwd 'cwd';
     my $name = basename(cwd());
-    $name =~ s|[\-_][\d\.\-]+$||;   # this is new with MM 5.00, we
+    $name =~ s|[\-_][\d\.\-]+\z||;  # this is new with MM 5.00, we
                                     # strip minus or underline
                                     # followed by a float or some such
     print "Warning: Guessing NAME [$name] from current directory name.\n";
@@ -1359,7 +1391,7 @@ q[-e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "],
  $self->{MAKEFILE}, q[";' \\
 -e 'print "Htmlifying $$m{$$_}\n";' \\
 -e '$$dir = dirname($$m{$$_}); mkpath($$dir) unless -d $$dir;' \\
--e 'system(qq[$$^X ].q["-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" $(POD2HTML_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\
+-e 'system(q[$(PERLRUN) $(POD2HTML_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\
 -e 'chmod(oct($(PERM_RW))), $$m{$$_} or warn "chmod $(PERM_RW) $$m{$$_}: $$!\n";}'
 ];
     push @m, "\nhtmlifypods : pure_all ";
@@ -1392,26 +1424,26 @@ sub init_dirscan {      # --- File and Directory Lists (.xs .pm .pod etc)
        if (-d $name){
            next if -l $name; # We do not support symlinks at all
            $dir{$name} = $name if (-f $self->catfile($name,"Makefile.PL"));
-       } elsif ($name =~ /\.xs$/){
-           my($c); ($c = $name) =~ s/\.xs$/.c/;
+       } elsif ($name =~ /\.xs\z/){
+           my($c); ($c = $name) =~ s/\.xs\z/.c/;
            $xs{$name} = $c;
            $c{$c} = 1;
-       } elsif ($name =~ /\.c(pp|xx|c)?$/i){  # .c .C .cpp .cxx .cc
+       } elsif ($name =~ /\.c(pp|xx|c)?\z/i){  # .c .C .cpp .cxx .cc
            $c{$name} = 1
                unless $name =~ m/perlmain\.c/; # See MAP_TARGET
-       } elsif ($name =~ /\.h$/i){
+       } elsif ($name =~ /\.h\z/i){
            $h{$name} = 1;
-       } elsif ($name =~ /\.PL$/) {
-           ($pl_files{$name} = $name) =~ s/\.PL$// ;
+       } elsif ($name =~ /\.PL\z/) {
+           ($pl_files{$name} = $name) =~ s/\.PL\z// ;
        } elsif (($Is_VMS || $Is_Dos) && $name =~ /[._]pl$/i) {
            # case-insensitive filesystem, one dot per name, so foo.h.PL
            # under Unix appears as foo.h_pl under VMS or fooh.pl on Dos
            local($/); open(PL,$name); my $txt = <PL>; close PL;
            if ($txt =~ /Extracting \S+ \(with variable substitutions/) {
-               ($pl_files{$name} = $name) =~ s/[._]pl$//i ;
+               ($pl_files{$name} = $name) =~ s/[._]pl\z//i ;
            }
            else { $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name); }
-       } elsif ($name =~ /\.(p[ml]|pod)$/){
+       } elsif ($name =~ /\.(p[ml]|pod)\z/){
            $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name);
        }
     }
@@ -1486,7 +1518,7 @@ sub init_dirscan {        # --- File and Directory Lists (.xs .pm .pod etc)
     $self->{PM}  = \%pm             unless $self->{PM};
     $self->{C}   = [sort keys %c]   unless $self->{C};
     my(@o_files) = @{$self->{C}};
-    $self->{O_FILES} = [grep s/\.c(pp|xx|c)?$/$self->{OBJ_EXT}/i, @o_files] ;
+    $self->{O_FILES} = [grep s/\.c(pp|xx|c)?\z/$self->{OBJ_EXT}/i, @o_files] ;
     $self->{H}   = [sort keys %h]   unless $self->{H};
     $self->{PL_FILES} = \%pl_files unless $self->{PL_FILES};
 
@@ -1532,9 +1564,9 @@ sub init_dirscan {        # --- File and Directory Lists (.xs .pm .pod etc)
        my %manifypods = (); # we collect the keys first, i.e. the files
                             # we have to convert to pod
        foreach $name (keys %{$self->{PM}}) {
-           if ($name =~ /\.pod$/ ) {
+           if ($name =~ /\.pod\z/ ) {
                $manifypods{$name} = $self->{PM}{$name};
-           } elsif ($name =~ /\.p[ml]$/ ) {
+           } elsif ($name =~ /\.p[ml]\z/ ) {
                local *FH;
                my($ispod)=0;
                if (open(FH,"<$name")) {
@@ -1557,17 +1589,17 @@ sub init_dirscan {      # --- File and Directory Lists (.xs .pm .pod etc)
        # Remove "Configure.pm" and similar, if it's not the only pod listed
        # To force inclusion, just name it "Configure.pod", or override MAN3PODS
        foreach $name (keys %manifypods) {
-           if ($name =~ /(config|setup).*\.pm/i) {
+           if ($self->{PERL_CORE} and $name =~ /(config|setup).*\.pm/is) {
                delete $manifypods{$name};
                next;
            }
            my($manpagename) = $name;
-           $manpagename =~ s/\.p(od|m|l)$//;
+           $manpagename =~ s/\.p(od|m|l)\z//;
            if ($pods{HTMLLIB}) {
                $self->{HTMLLIBPODS}->{$name} =
                  $self->catfile("\$(INST_HTMLLIBDIR)", "$manpagename.\$(HTMLEXT)");
            }
-           unless ($manpagename =~ s!^\W*lib\W+!!) { # everything below lib is ok
+           unless ($manpagename =~ s!^\W*lib\W+!!s) { # everything below lib is ok
                $manpagename = $self->catfile(split(/::/,$self->{PARENT_NAME}),$manpagename);
            }
            if ($pods{MAN3}) {
@@ -1616,7 +1648,7 @@ sub init_main {
         $modfname = &DynaLoader::mod2fname(\@modparts);
     }
 
-    ($self->{PARENT_NAME}, $self->{BASEEXT}) = $self->{NAME} =~ m!(?:([\w:]+)::)?(\w+)$! ;
+    ($self->{PARENT_NAME}, $self->{BASEEXT}) = $self->{NAME} =~ m!(?:([\w:]+)::)?(\w+)\z! ;
 
     if (defined &DynaLoader::mod2fname) {
        # As of 5.001m, dl_os2 appends '_'
@@ -1640,7 +1672,7 @@ sub init_main {
 
     unless ($self->{PERL_SRC}){
        my($dir);
-       foreach $dir ($self->updir(),$self->catdir($self->updir(),$self->updir()),$self->catdir($self->updir(),$self->updir(),$self->updir())){
+       foreach $dir ($self->updir(),$self->catdir($self->updir(),$self->updir()),$self->catdir($self->updir(),$self->updir(),$self->updir()),$self->catdir($self->updir(),$self->updir(),$self->updir(),$self->updir())){
            if (
                -f $self->catfile($dir,"config.sh")
                &&
@@ -1692,6 +1724,7 @@ from the perl source tree.
        $self->{PERL_INC}     = $self->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now
        my $perl_h;
 
+       no warnings 'uninitialized' ;
        if (not -f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h"))
            and not $old){
            # Maybe somebody tries to build an extension with an
@@ -1768,7 +1801,7 @@ usually solves this kind of problem.
     $self->{INST_SCRIPT} ||= $self->catdir($self->curdir,'blib','script');
 
     # The user who requests an installation directory explicitly
-    # should not have to tell us a architecture installation directory
+    # should not have to tell us an architecture installation directory
     # as well. We look if a directory exists that is named after the
     # architecture. If not we take it as a sign that it should be the
     # same as the requested installation directory. Otherwise we take
@@ -1992,7 +2025,8 @@ usually solves this kind of problem.
        push @defpath, $component if defined $component;
     }
     $self->{PERL} ||=
-        $self->find_perl(5.0, [ $self->canonpath($^X), 'miniperl','perl','perl5',"perl$]" ],
+        $self->find_perl(5.0, [ $self->canonpath($^X), 'miniperl',
+                               'perl','perl5',"perl$Config{version}" ],
            \@defpath, $Verbose );
     # don't check if perl is executable, maybe they have decided to
     # supply switches with perl
@@ -2000,6 +2034,25 @@ usually solves this kind of problem.
     # Define 'FULLPERL' to be a non-miniperl (used in test: target)
     ($self->{FULLPERL} = $self->{PERL}) =~ s/miniperl/perl/i
        unless ($self->{FULLPERL});
+
+    # Are we building the core?
+    $self->{PERL_CORE} = 0 unless exists $self->{PERL_CORE};
+
+    # How do we run perl?
+    $self->{PERLRUN}      = $self->{PERL};
+
+    # How do we run perl when installing libraries?
+    $self->{PERLRUNINST} .= $self->{PERL}. ' -I$(INST_ARCHLIB) -I$(INST_LIB)';
+
+    # What extra library dirs do we need when running the tests?
+    $self->{TEST_LIBS}   .= ' -I$(INST_ARCHLIB) -I$(INST_LIB)';
+
+    # When building the core, we need to add some helper libs since
+    # perl's @INC won't work (we're not installed yet).
+    foreach my $targ (qw(PERLRUN PERLRUNINST TEST_LIBS)) {
+        $self->{$targ} .= ' -I$(PERL_ARCHLIB) -I$(PERL_LIB)'
+          if $self->{PERL_CORE};
+    }
 }
 
 =item init_others
@@ -2195,9 +2248,9 @@ sub installbin {
 EXE_FILES = @{$self->{EXE_FILES}}
 
 } . ($Is_Win32
-  ? q{FIXIN = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
+  ? q{FIXIN = $(PERLRUN) \
     -e "system qq[pl2bat.bat ].shift"
-} : q{FIXIN = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::MakeMaker \
+} : q{FIXIN = $(PERLRUN) -MExtUtils::MakeMaker \
     -e "MY->fixin(shift)"
 }).qq{
 pure_all :: @to
@@ -2322,7 +2375,7 @@ $(MAP_TARGET) :: static $(MAKE_APERL_FILE)
 
 $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
        }.$self->{NOECHO}.q{echo Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET)
-       }.$self->{NOECHO}.q{$(PERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
+       }.$self->{NOECHO}.q{$(PERLRUNINST) \
                Makefile.PL DIR=}, $dir, q{ \
                MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
                MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=};
@@ -2353,7 +2406,7 @@ $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
 
     # The front matter of the linkcommand...
     $linkcmd = join ' ', "\$(CC)",
-           grep($_, @Config{qw(large split ldflags ccdlflags)});
+           grep($_, @Config{qw(ldflags ccdlflags)});
     $linkcmd =~ s/\s+/ /g;
     $linkcmd =~ s,(perl\.exp),\$(PERL_INC)/$1,;
 
@@ -2371,7 +2424,7 @@ $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
                my $incl;
                my $xx;
 
-               ($xx = $File::Find::name) =~ s,.*?/auto/,,;
+               ($xx = $File::Find::name) =~ s,.*?/auto/,,s;
                $xx =~ s,/?$_,,;
                $xx =~ s,/,::,g;
 
@@ -2389,7 +2442,7 @@ $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
                my $excl;
                my $xx;
 
-               ($xx = $File::Find::name) =~ s,.*?/auto/,,;
+               ($xx = $File::Find::name) =~ s,.*?/auto/,,s;
                $xx =~ s,/?$_,,;
                $xx =~ s,/,::,g;
 
@@ -2406,7 +2459,7 @@ $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
 
        # Once the patch to minimod.PL is in the distribution, I can
        # drop it
-       return if $File::Find::name =~ m:auto/$self->{FULLEXT}/$self->{BASEEXT}$self->{LIB_EXT}$:;
+       return if $File::Find::name =~ m:auto/$self->{FULLEXT}/$self->{BASEEXT}$self->{LIB_EXT}\z:;
        use Cwd 'cwd';
        $static{cwd() . "/" . $_}++;
     }, grep( -d $_, @{$searchdirs || []}) );
@@ -2417,7 +2470,7 @@ $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
 
     $extra = [] unless $extra && ref $extra eq 'ARRAY';
     for (sort keys %static) {
-       next unless /\Q$self->{LIB_EXT}\E$/;
+       next unless /\Q$self->{LIB_EXT}\E\z/;
        $_ = dirname($_) . "/extralibs.ld";
        push @$extra, $_;
     }
@@ -2436,7 +2489,7 @@ MAP_PERLINC   = @{$perlinc || []}
 MAP_STATIC    = ",
 join(" \\\n\t", reverse sort keys %static), "
 
-MAP_PRELIBS   = $Config::Config{libs} $Config::Config{cryptlib}
+MAP_PRELIBS   = $Config::Config{perllibs} $Config::Config{cryptlib}
 ";
 
     if (defined $libperl) {
@@ -2444,6 +2497,7 @@ MAP_PRELIBS   = $Config::Config{libs} $Config::Config{cryptlib}
     }
     unless ($libperl && -f $lperl) { # Ilya's code...
        my $dir = $self->{PERL_SRC} || "$self->{PERL_ARCHLIB}/CORE";
+       $dir = "$self->{PERL_ARCHLIB}/.." if $self->{UNINSTALLED_PERL};
        $libperl ||= "libperl$self->{LIB_EXT}";
        $libperl   = "$dir/$libperl";
        $lperl   ||= "libperl$self->{LIB_EXT}";
@@ -2481,14 +2535,9 @@ MAP_LIBPERL = $libperl
     # SUNOS ld does not take the full path to a shared library
     my $llibperl = ($libperl)?'$(MAP_LIBPERL)':'-lperl';
 
-    # Brain dead solaris linker does not use LD_RUN_PATH?
-    # This fixes dynamic extensions which need shared libs
-    my $ldfrom = ($^O eq 'solaris')?
-           join(' ', map "-R$_", split /:/, $self->{LD_RUN_PATH}):'';
-
 push @m, "
 \$(MAP_TARGET) :: $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) \$(INST_ARCHAUTODIR)/extralibs.all
-       \$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE) $tmp/perlmain\$(OBJ_EXT) $ldfrom \$(MAP_STATIC) $llibperl `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS)
+       \$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE) $tmp/perlmain\$(OBJ_EXT) \$(LDFROM) \$(MAP_STATIC) $llibperl `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS)
        $self->{NOECHO}echo 'To install the new \"\$(MAP_TARGET)\" binary, call'
        $self->{NOECHO}echo '    make -f $makefilename inst_perl MAP_TARGET=\$(MAP_TARGET)'
        $self->{NOECHO}echo 'To remove the intermediate files say'
@@ -2502,7 +2551,7 @@ $tmp/perlmain\$(OBJ_EXT): $tmp/perlmain.c
 $tmp/perlmain.c: $makefilename}, q{
        }.$self->{NOECHO}.q{echo Writing $@
        }.$self->{NOECHO}.q{$(PERL) $(MAP_PERLINC) -MExtUtils::Miniperl \\
-               -e "writemain(grep s#.*/auto/##, split(q| |, q|$(MAP_STATIC)|))" > $@t && $(MV) $@t $@
+               -e "writemain(grep s#.*/auto/##s, split(q| |, q|$(MAP_STATIC)|))" > $@t && $(MV) $@t $@
 
 };
     push @m, "\t",$self->{NOECHO}.q{$(PERL) $(INSTALLSCRIPT)/fixpmain
@@ -2562,7 +2611,7 @@ $(OBJECT) : $(FIRST_MAKEFILE)
        -}.$self->{NOECHO}.q{$(RM_F) }."$self->{MAKEFILE}.old".q{
        -}.$self->{NOECHO}.q{$(MV) }."$self->{MAKEFILE} $self->{MAKEFILE}.old".q{
        -$(MAKE) -f }.$self->{MAKEFILE}.q{.old clean $(DEV_NULL) || $(NOOP)
-       $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL }.join(" ",map(qq["$_"],@ARGV)).q{
+       $(PERLRUN) Makefile.PL }.join(" ",map(qq["$_"],@ARGV)).q{
        }.$self->{NOECHO}.q{echo "==> Your Makefile has been rebuilt. <=="
        }.$self->{NOECHO}.q{echo "==> Please rerun the make command.  <=="
        false
@@ -2615,7 +2664,7 @@ qq[POD2MAN = \$(PERL) -we '%m=\@ARGV;for (keys %m){' \\\n],
 q[-e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "],
  $self->{MAKEFILE}, q[";' \\
 -e 'print "Manifying $$m{$$_}\n";' \\
--e 'system(qq[$$^X ].q["-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" $(POD2MAN_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\
+-e 'system(q[$(PERLRUN) $(POD2MAN_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\
 -e 'chmod(oct($(PERM_RW))), $$m{$$_} or warn "chmod $(PERM_RW) $$m{$$_}: $$!\n";}'
 ];
     push @m, "\nmanifypods : pure_all ";
@@ -2740,7 +2789,7 @@ sub parse_version {
     my $inpod = 0;
     while (<FH>) {
        $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
-       next if $inpod;
+       next if $inpod || /^\s*#/;
        chop;
        # next unless /\$(([\w\:\']*)\bVERSION)\b.*\=/;
        next unless /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/;
@@ -2753,7 +2802,7 @@ sub parse_version {
                $_
            }; \$$2
        };
-       local($^W) = 0;
+       no warnings;
        $result = eval($eval);
        warn "Could not eval '$eval' in $parsefile: $@" if $@;
        $result = "undef" unless defined $result;
@@ -2805,10 +2854,14 @@ sub pasthru {
     my($sep) = $Is_VMS ? ',' : '';
     $sep .= "\\\n\t";
 
-    foreach $key (qw(LIB LIBPERL_A LINKTYPE PREFIX OPTIMIZE)){
+    foreach $key (qw(LIB LIBPERL_A LINKTYPE PREFIX OPTIMIZE)) {
        push @pasthru, "$key=\"\$($key)\"";
     }
 
+    foreach $key (qw(DEFINE INC)) {
+       push @pasthru, "PASTHRU_$key=\"\$(PASTHRU_$key)\"";
+    }
+
     push @m, "\nPASTHRU = ", join ($sep, @pasthru), "\n";
     join "", @m;
 }
@@ -2869,16 +2922,52 @@ $(PERL_ARCHLIB)/Config.pm: $(PERL_SRC)/config.sh
 
     push @m, q{
 PERL_HDRS = \
-$(PERL_INC)/EXTERN.h       $(PERL_INC)/gv.h           $(PERL_INC)/pp.h       \
-$(PERL_INC)/INTERN.h       $(PERL_INC)/handy.h        $(PERL_INC)/proto.h    \
-$(PERL_INC)/XSUB.h         $(PERL_INC)/hv.h           $(PERL_INC)/regcomp.h  \
-$(PERL_INC)/av.h           $(PERL_INC)/keywords.h     $(PERL_INC)/regexp.h   \
-$(PERL_INC)/config.h       $(PERL_INC)/mg.h           $(PERL_INC)/scope.h    \
-$(PERL_INC)/cop.h          $(PERL_INC)/op.h           $(PERL_INC)/sv.h      \
-$(PERL_INC)/cv.h           $(PERL_INC)/opcode.h       $(PERL_INC)/unixish.h  \
-$(PERL_INC)/dosish.h       $(PERL_INC)/patchlevel.h   $(PERL_INC)/util.h     \
-$(PERL_INC)/embed.h        $(PERL_INC)/perl.h         $(PERL_INC)/iperlsys.h \
-$(PERL_INC)/form.h         $(PERL_INC)/perly.h
+       $(PERL_INC)/EXTERN.h            \
+       $(PERL_INC)/INTERN.h            \
+       $(PERL_INC)/XSUB.h              \
+       $(PERL_INC)/av.h                \
+       $(PERL_INC)/cc_runtime.h        \
+       $(PERL_INC)/config.h            \
+       $(PERL_INC)/cop.h               \
+       $(PERL_INC)/cv.h                \
+       $(PERL_INC)/dosish.h            \
+       $(PERL_INC)/embed.h             \
+       $(PERL_INC)/embedvar.h          \
+       $(PERL_INC)/fakethr.h           \
+       $(PERL_INC)/form.h              \
+       $(PERL_INC)/gv.h                \
+       $(PERL_INC)/handy.h             \
+       $(PERL_INC)/hv.h                \
+       $(PERL_INC)/intrpvar.h          \
+       $(PERL_INC)/iperlsys.h          \
+       $(PERL_INC)/keywords.h          \
+       $(PERL_INC)/mg.h                \
+       $(PERL_INC)/nostdio.h           \
+       $(PERL_INC)/op.h                \
+       $(PERL_INC)/opcode.h            \
+       $(PERL_INC)/opnames.h           \
+       $(PERL_INC)/patchlevel.h        \
+       $(PERL_INC)/perl.h              \
+       $(PERL_INC)/perlapi.h           \
+       $(PERL_INC)/perlio.h            \
+       $(PERL_INC)/perlsdio.h          \
+       $(PERL_INC)/perlsfio.h          \
+       $(PERL_INC)/perlvars.h          \
+       $(PERL_INC)/perly.h             \
+       $(PERL_INC)/pp.h                \
+       $(PERL_INC)/pp_proto.h          \
+       $(PERL_INC)/proto.h             \
+       $(PERL_INC)/regcomp.h           \
+       $(PERL_INC)/regexp.h            \
+       $(PERL_INC)/regnodes.h          \
+       $(PERL_INC)/scope.h             \
+       $(PERL_INC)/sv.h                \
+       $(PERL_INC)/thrdvar.h           \
+       $(PERL_INC)/thread.h            \
+       $(PERL_INC)/unixish.h           \
+       $(PERL_INC)/utf8.h              \
+       $(PERL_INC)/util.h              \
+       $(PERL_INC)/warnings.h
 
 $(OBJECT) : $(PERL_HDRS)
 } if $self->{OBJECT};
@@ -2980,16 +3069,36 @@ destination and autosplits them. See L<ExtUtils::Install/DESCRIPTION>
 
 =cut
 
+sub _pm_to_blib_flush {
+    my ($self, $autodir, $rr, $ra, $rl) = @_;
+    $$rr .= 
+q{     }.$self->{NOECHO}.q[$(PERLRUNINST) -MExtUtils::Install \
+       -e "pm_to_blib({qw{].qq[@$ra].q[}},'].$autodir.q{','$(PM_FILTER)')"
+};
+    @$ra = ();
+    $$rl = 0;
+}
+
 sub pm_to_blib {
     my $self = shift;
     my($autodir) = $self->catdir('$(INST_LIB)','auto');
-    return q{
+    my $r = q{
 pm_to_blib: $(TO_INST_PM)
-       }.$self->{NOECHO}.q{$(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" \
-       "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Install \
-        -e "pm_to_blib({qw{$(PM_TO_BLIB)}},'}.$autodir.q{')"
-       }.$self->{NOECHO}.q{$(TOUCH) $@
 };
+    my %pm_to_blib = %{$self->{PM}};
+    my @a;
+    my $l;
+    while (my ($pm, $blib) = each %pm_to_blib) {
+       my $la = length $pm;
+       my $lb = length $blib;
+       if ($l + $la + $lb + @a / 2 > 200) { # limit line length
+           _pm_to_blib_flush($self, $autodir, \$r, \@a, \$l);
+        }
+        push @a, $pm, $blib;
+       $l += $la + $lb;
+    }
+    _pm_to_blib_flush($self, $autodir, \$r, \@a, \$l);
+    return $r.q{       }.$self->{NOECHO}.q{$(TOUCH) $@};
 }
 
 =item post_constants (o)
@@ -3042,7 +3151,7 @@ sub prefixify {
     my($self,$var,$sprefix,$rprefix) = @_;
     $self->{uc $var} ||= $Config{lc $var};
     $self->{uc $var} = VMS::Filespec::unixpath($self->{uc $var}) if $Is_VMS;
-    $self->{uc $var} =~ s/\Q$sprefix\E/$rprefix/;
+    $self->{uc $var} =~ s,^\Q$sprefix\E(?=/|\z),$rprefix,s;
 }
 
 =item processPL (o)
@@ -3059,19 +3168,36 @@ sub processPL {
         my $list = ref($self->{PL_FILES}->{$plfile})
                ? $self->{PL_FILES}->{$plfile}
                : [$self->{PL_FILES}->{$plfile}];
+       my $target;
        foreach $target (@$list) {
        push @m, "
 all :: $target
        $self->{NOECHO}\$(NOOP)
 
 $target :: $plfile
-       \$(PERL) -I\$(INST_ARCHLIB) -I\$(INST_LIB) -I\$(PERL_ARCHLIB) -I\$(PERL_LIB) $plfile $target
+       \$(PERLRUNINST) $plfile $target
 ";
        }
     }
     join "", @m;
 }
 
+=item quote_paren
+
+Backslashes parentheses C<()> in command line arguments.
+Doesn't handle recursive Makefile C<$(...)> constructs,
+but handles simple ones.
+
+=cut
+
+sub quote_paren {
+    local $_ = shift;
+    s/\$\((.+?)\)/\$\\\\($1\\\\)/g;    # protect $(...)
+    s/(?<!\\)([()])/\\$1/g;            # quote unprotected
+    s/\$\\\\\((.+?)\\\\\)/\$($1)/g;    # unprotect $(...)
+    return $_;
+}
+
 =item realclean (o)
 
 Defines the realclean target.
@@ -3098,8 +3224,22 @@ realclean purge ::  clean
         push(@m, "     $self->{RM_F} \$(INST_DYNAMIC) \$(INST_BOOT)\n");
         push(@m, "     $self->{RM_F} \$(INST_STATIC)\n");
     }
-    push(@m, " $self->{RM_F} " . join(" ", values %{$self->{PM}}) . "\n")
-       if keys %{$self->{PM}};
+    # Issue a several little RM_F commands rather than risk creating a
+    # very long command line (useful for extensions such as Encode
+    # that have many files).
+    if (keys %{$self->{PM}}) {
+       my $line = "";
+       foreach (values %{$self->{PM}}) {
+           if (length($line) + length($_) > 80) {
+               push @m, "\t$self->{RM_F} $line\n";
+               $line = $_;
+           }
+           else {
+               $line .= " $_"; 
+           }
+       }
+    push @m, "\t$self->{RM_F} $line\n" if $line;
+    }
     my(@otherfiles) = ($self->{MAKEFILE},
                       "$self->{MAKEFILE}.old"); # Makefiles last
     push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
@@ -3118,9 +3258,11 @@ form Foo/Bar and replaces the slash with C<::>. Returns the replacement.
 sub replace_manpage_separator {
     my($self,$man) = @_;
        if ($^O eq 'uwin') {
-               $man =~ s,/+,.,g;
+           $man =~ s,/+,.,g;
+       } elsif ($Is_Dos) {
+           $man =~ s,/+,__,g;
        } else {
-               $man =~ s,/+,::,g;
+           $man =~ s,/+,::,g;
        }
     $man;
 }
@@ -3162,13 +3304,22 @@ sub static_lib {
 $(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)/.exists
        $(RM_RF) $@
 END
-    # If this extension has it's own library (eg SDBM_File)
+    # If this extension has its own library (eg SDBM_File)
     # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
     push(@m, "\t$self->{CP} \$(MYEXTLIB) \$\@\n") if $self->{MYEXTLIB};
 
+    my $ar; 
+    if (exists $self->{FULL_AR} && -x $self->{FULL_AR}) {
+        # Prefer the absolute pathed ar if available so that PATH
+        # doesn't confuse us.  Perl itself is built with the full_ar.  
+        $ar = 'FULL_AR';
+    } else {
+        $ar = 'AR';
+    }
     push @m,
-q{     $(AR) $(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@
-       $(CHMOD) $(PERM_RWX) $@
+        "\t\$($ar) ".'$(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@'."\n";
+    push @m,
+q{     $(CHMOD) $(PERM_RWX) $@
        }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)/extralibs.ld
 };
     # Old mechanism - still available:
@@ -3233,22 +3384,30 @@ sub subdir_x {
     my($self, $subdir) = @_;
     my(@m);
     if ($Is_Win32 && Win32::IsWin95()) {
-       # XXX: dmake-specific, like rest of Win95 port
-       return <<EOT;
+       if ($Config{'make'} =~ /dmake/i) {
+           # dmake-specific
+           return <<EOT;
 subdirs ::
 @[
        cd $subdir
-       \$(MAKE) all \$(PASTHRU)
+       \$(MAKE) -f \$(FIRST_MAKEFILE) all \$(PASTHRU)
        cd ..
 ]
 EOT
-    }
-    else {
+        } elsif ($Config{'make'} =~ /nmake/i) {
+           # nmake-specific
+           return <<EOT;
+subdirs ::
+       cd $subdir
+       \$(MAKE) -f \$(FIRST_MAKEFILE) all \$(PASTHRU)
+       cd ..
+EOT
+       }
+    } else {
        return <<EOT;
 
 subdirs ::
-       $self->{NOECHO}cd $subdir && \$(MAKE) all \$(PASTHRU)
-
+       $self->{NOECHO}cd $subdir && \$(MAKE) -f \$(FIRST_MAKEFILE) all \$(PASTHRU)
 EOT
     }
 }
@@ -3351,7 +3510,7 @@ Helper method to write the test targets
 sub test_via_harness {
     my($self, $perl, $tests) = @_;
     $perl = "PERL_DL_NONLAZY=1 $perl" unless $Is_Win32;
-    "\t$perl".q! -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use Test::Harness qw(&runtests $$verbose); $$verbose=$(TEST_VERBOSE); runtests @ARGV;' !."$tests\n";
+    "\t$perl".q! $(TEST_LIBS) -e 'use Test::Harness qw(&runtests $$verbose); $$verbose=$(TEST_VERBOSE); runtests @ARGV;' !."$tests\n";
 }
 
 =item test_via_script (o)
@@ -3363,7 +3522,7 @@ Other helper method for test.
 sub test_via_script {
     my($self, $perl, $script) = @_;
     $perl = "PERL_DL_NONLAZY=1 $perl" unless $Is_Win32;
-    qq{\t$perl}.q{ -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) }.qq{$script
+    qq{\t$perl}.q{ $(TEST_LIBS) }.qq{$script
 };
 }
 
@@ -3382,7 +3541,7 @@ sub tool_autosplit {
     $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
     q{
 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
-AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e 'use AutoSplit;}.$asl.q{autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1) ;'
+AUTOSPLITFILE = $(PERLRUN) -e 'use AutoSplit;}.$asl.q{autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1) ;'
 };
 }
 
@@ -3409,13 +3568,13 @@ SHELL = $bin_sh
     push @m, q{
 # The following is a portable way to say mkdir -p
 # To see which directories are created, change the if 0 to if 1
-MKPATH = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e mkpath
+MKPATH = $(PERLRUN) -MExtUtils::Command -e mkpath
 
 # This helps us to minimize the effect of the .exists files A yet
 # better solution would be to have a stable file in the perl
 # distribution with a timestamp of zero. But this solution doesn't
 # need any changes to the core distribution and works with older perls
-EQUALIZE_TIMESTAMP = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e eqtime
+EQUALIZE_TIMESTAMP = $(PERLRUN) -MExtUtils::Command -e eqtime
 };
 
 
@@ -3430,13 +3589,13 @@ WARN_IF_OLD_PACKLIST = $(PERL) -we 'exit unless -f $$ARGV[0];' \\
 -e 'print "Please make sure the two installations are not conflicting\n";'
 
 UNINST=0
-VERBINST=1
+VERBINST=0
 
 MOD_INSTALL = $(PERL) -I$(INST_LIB) -I$(PERL_LIB) -MExtUtils::Install \
 -e "install({@ARGV},'$(VERBINST)',0,'$(UNINST)');"
 
 DOC_INSTALL = $(PERL) -e '$$\="\n\n";' \
--e 'print "=head2 ", scalar(localtime), ": C<", shift, ">", " L<", shift, ">";' \
+-e 'print "=head2 ", scalar(localtime), ": C<", shift, ">", " L<", $$arg=shift, "|", $$arg, ">";' \
 -e 'print "=over 4";' \
 -e 'while (defined($$key = shift) and defined($$val = shift)){print "=item *";print "C<$$key: $$val>";}' \
 -e 'print "=back";'
@@ -3503,6 +3662,7 @@ XSUBPP = \$(XSUBPPDIR)/$xsubpp
 XSPROTOARG = $self->{XSPROTOARG}
 XSUBPPDEPS = @tmdeps \$(XSUBPP)
 XSUBPPARGS = @tmargs
+XSUBPP_EXTRA_ARGS = 
 };
 };
 
@@ -3599,12 +3759,6 @@ config :: $(INST_AUTODIR)/.exists
        '.$self->{NOECHO}.'$(NOOP)
 ';
 
-    push @m, qq{
-config :: Version_check
-       $self->{NOECHO}\$(NOOP)
-
-} unless $self->{PARENT} or ($self->{PERL_SRC} && $self->{INSTALLDIRS} eq "perl") or $self->{NO_VC};
-
     push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
 
     if (%{$self->{HTMLLIBPODS}}) {
@@ -3653,7 +3807,7 @@ help:
 
     push @m, q{
 Version_check:
-       }.$self->{NOECHO}.q{$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
+       }.$self->{NOECHO}.q{$(PERLRUN) \
                -MExtUtils::MakeMaker=Version_check \
                -e "Version_check('$(MM_VERSION)')"
 };
@@ -3687,7 +3841,7 @@ sub xs_c {
     return '' unless $self->needs_linking();
     '
 .xs.c:
-       $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c
+       $(PERLRUN) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(XSUBPP_EXTRA_ARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c
 ';
 }
 
@@ -3702,7 +3856,7 @@ sub xs_cpp {
     return '' unless $self->needs_linking();
     '
 .xs.cpp:
-       $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.cpp
+       $(PERLRUN) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.cpp
 ';
 }
 
@@ -3718,8 +3872,8 @@ sub xs_o {        # many makes are too dumb to use xs_c then c_o
     return '' unless $self->needs_linking();
     '
 .xs$(OBJ_EXT):
-       $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c
-       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
+       $(PERLRUN) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c
+       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.c
 ';
 }
 
@@ -3737,6 +3891,21 @@ sub perl_archive
  return "";
 }
 
+=item perl_archive_after
+
+This is an internal method that returns path to a library which
+should be put on the linker command line I<after> the external libraries
+to be linked to dynamic extensions.  This may be needed if the linker
+is one-pass, and Perl includes some overrides for C RTL functions,
+such as malloc().
+
+=cut 
+
+sub perl_archive_after
+{
+ return "";
+}
+
 =item export_list
 
 This is internal method that returns name of a file that is