Introduce a 'veryclean' target that is like 'distclean'
[p5sagit/p5-mst-13.2.git] / lib / ExtUtils / MM_Unix.pm
index 248ad8b..c55cc0a 100644 (file)
@@ -8,7 +8,7 @@ use strict;
 use vars qw($VERSION $Is_Mac $Is_OS2 $Is_VMS $Is_Win32 $Is_Dos $Is_PERL_OBJECT
            $Verbose %pm %static $Xsubpp_Version);
 
-$VERSION = substr q$Revision: 1.12602 $, 10;
+$VERSION = substr q$Revision: 1.12603 $, 10;
 # $Id: MM_Unix.pm,v 1.126 1998/06/28 21:32:49 k Exp k $
 
 Exporter::import('ExtUtils::MakeMaker', qw($Verbose &neatvalue));
@@ -80,13 +80,13 @@ path. On UNIX eliminated successive slashes and successive "/.".
 sub canonpath {
     my($self,$path) = @_;
     my $node = '';
-    if ( $^O eq 'qnx' && $path =~ s|^(//\d+)/|/| ) {
+    if ( $^O eq 'qnx' && $path =~ s|^(//\d+)/|/|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
+    $path =~ s|^(\./)+||s unless $path eq "./";    # ./xx      -> xx
+    $path =~ s|(?<=[^/])/\z|| ;                    # xx/       -> xx
     "$node$path";
 }
 
@@ -377,10 +377,22 @@ sub cflags {
 
     if ($Is_PERL_OBJECT) {
         $self->{CCFLAGS} =~ s/-DPERL_OBJECT(\b|$)/-DPERL_CAPI/g;
-        if ($Is_Win32 && $Config{'cc'} =~ /^cl.exe/i) {
-            # Turn off C++ mode of the MSC compiler
-            $self->{CCFLAGS} =~ s/-TP(\s|$)//;
-            $self->{OPTIMIZE} =~ s/-TP(\s|$)//;
+        if ($Is_Win32) { 
+           if ($Config{'cc'} =~ /^cl/i) {
+               # Turn off C++ mode of the MSC compiler
+               $self->{CCFLAGS} =~ s/-TP(\s|$)//g;
+               $self->{OPTIMIZE} =~ s/-TP(\s|$)//g;
+           }
+           elsif ($Config{'cc'} =~ /^bcc32/i) {
+               # Turn off C++ mode of the Borland compiler
+               $self->{CCFLAGS} =~ s/-P(\s|$)//g;
+               $self->{OPTIMIZE} =~ s/-P(\s|$)//g;
+           }
+           elsif ($Config{'cc'} =~ /^gcc/i) {
+               # Turn off C++ mode of the GCC compiler
+               $self->{CCFLAGS} =~ s/-xc\+\+(\s|$)//g;
+               $self->{OPTIMIZE} =~ s/-xc\+\+(\s|$)//g;
+           }
         }
     }
 
@@ -388,12 +400,20 @@ sub cflags {
        $self->{CCFLAGS} .= ' -DPERL_POLLUTE ';
     }
 
+    my $pollute = '';
+    if ($Config{usemymalloc} and not $Config{bincompat5005}
+       and not $Config{ccflags} =~ /-DPERL_POLLUTE_MALLOC\b/
+       and $self->{PERL_MALLOC_OK}) {
+       $pollute = '$(PERL_MALLOC_DEF)';
+    }
+
     return $self->{CFLAGS} = qq{
 CCFLAGS = $self->{CCFLAGS}
 OPTIMIZE = $self->{OPTIMIZE}
 PERLTYPE = $self->{PERLTYPE}
 LARGE = $self->{LARGE}
 SPLIT = $self->{SPLIT}
+MPOLLUTE = $pollute
 };
 
 }
@@ -417,14 +437,27 @@ clean ::
 ');
     # clean subdirectories first
     for $dir (@{$self->{DIR}}) {
-       push @m, "\t-cd $dir && \$(TEST_F) $self->{MAKEFILE} && \$(MAKE) clean\n";
+       if ($Is_Win32  &&  Win32::IsWin95()) {
+           push @m, <<EOT;
+       cd $dir
+       \$(TEST_F) $self->{MAKEFILE}
+       \$(MAKE) clean
+       cd ..
+EOT
+       }
+       else {
+           push @m, <<EOT;
+       -cd $dir && \$(TEST_F) $self->{MAKEFILE} && \$(MAKE) clean
+EOT
+       }
     }
 
     my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
     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
+                        perlmain.c mon.out core core.*perl.*.?
+                        *perl.core so_locations pm_to_blib
+                        *$(OBJ_EXT) *$(LIB_EXT) perl.exe
                         $(BOOTSTRAP) $(BASEEXT).bso $(BASEEXT).def
                         $(BASEEXT).exp
                        ]);
@@ -450,7 +483,7 @@ sub const_cccmd {
     return '' unless $self->needs_linking();
     return $self->{CONST_CCCMD} =
        q{CCCMD = $(CC) -c $(INC) $(CCFLAGS) $(OPTIMIZE) \\
-       $(PERLTYPE) $(LARGE) $(SPLIT) $(DEFINE_VERSION) \\
+       $(PERLTYPE) $(LARGE) $(SPLIT) $(MPOLLUTE) $(DEFINE_VERSION) \\
        $(XS_DEFINE_VERSION)};
 }
 
@@ -523,7 +556,7 @@ 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 FULL_AR
 
              / ) {
        next unless defined $self->{$tmp};
@@ -535,6 +568,7 @@ VERSION_MACRO = VERSION
 DEFINE_VERSION = -D\$(VERSION_MACRO)=\\\"\$(VERSION)\\\"
 XS_VERSION_MACRO = XS_VERSION
 XS_DEFINE_VERSION = -D\$(XS_VERSION_MACRO)=\\\"\$(XS_VERSION)\\\"
+PERL_MALLOC_DEF = -DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc -Dfree=Perl_mfree -Drealloc=Perl_realloc -Dcalloc=Perl_calloc
 };
 
     push @m, qq{
@@ -704,7 +738,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);
@@ -778,7 +812,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
 
@@ -806,6 +840,11 @@ manifest :
        $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=mkmanifest \\
                -e mkmanifest
 };
+
+    push @m, q{
+veryclean : realclean
+       $(RM_F) *~ *.orig */*~ */*.orig
+};
     join "", @m;
 }
 
@@ -1090,10 +1129,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 ;
     }
 }
 
@@ -1215,11 +1254,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 $\;
@@ -1227,7 +1261,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;
@@ -1242,6 +1284,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 ':';;
@@ -1276,7 +1319,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";
@@ -1371,26 +1414,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 ($Is_VMS && $name =~ /[._]pl$/i) {
+       } 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
+           # 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);
        }
     }
@@ -1465,7 +1508,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};
 
@@ -1511,9 +1554,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")) {
@@ -1536,17 +1579,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 ($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}) {
@@ -1595,7 +1638,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 '_'
@@ -1665,10 +1708,34 @@ from the perl source tree.
        }
     } else {
        # we should also consider $ENV{PERL5LIB} here
+        my $old = $self->{PERL_LIB} || $self->{PERL_ARCHLIB} || $self->{PERL_INC};
        $self->{PERL_LIB}     ||= $Config::Config{privlibexp};
        $self->{PERL_ARCHLIB} ||= $Config::Config{archlibexp};
        $self->{PERL_INC}     = $self->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now
        my $perl_h;
+
+       if (not -f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h"))
+           and not $old){
+           # Maybe somebody tries to build an extension with an
+           # uninstalled Perl outside of Perl build tree
+           my $found;
+           for my $dir (@INC) {
+             $found = $dir, last if -e $self->catdir($dir, "Config.pm");
+           }
+           if ($found) {
+             my $inc = dirname $found;
+             if (-e $self->catdir($inc, "perl.h")) {
+               $self->{PERL_LIB}          = $found;
+               $self->{PERL_ARCHLIB}      = $found;
+               $self->{PERL_INC}          = $inc;
+               $self->{UNINSTALLED_PERL}  = 1;
+               print STDOUT <<EOP;
+... Detected uninstalled Perl.  Trying to continue.
+EOP
+             }
+           }
+       }
+       
        unless (-f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h"))){
            die qq{
 Error: Unable to locate installed Perl libraries or Perl source code.
@@ -1785,7 +1852,7 @@ usually solves this kind of problem.
        $self->prefixify($install_variable,$configure_prefix,$replace_prefix);
     }
     my $funkylibdir = $self->catdir($configure_prefix,"lib","perl5");
-    $funkylibdir = '' unless -d $funklibdir;
+    $funkylibdir = '' unless -d $funkylibdir;
     $search_prefix = $funkylibdir || $self->catdir($configure_prefix,"lib");
     if ($self->{LIB}) {
        $self->{INSTALLPRIVLIB} = $self->{INSTALLSITELIB} = $self->{LIB};
@@ -1810,7 +1877,7 @@ usually solves this kind of problem.
        }
     }
     my $funkymandir = $self->catdir($configure_prefix,"lib","perl5","man");
-    $funkymandir = '' unless -d $funkmandir;
+    $funkymandir = '' unless -d $funkymandir;
     $search_prefix = $funkymandir || $self->catdir($configure_prefix,"man");
     if (-d $self->catdir($self->{PREFIX},"lib","perl5", "man")) {
        $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib", "perl5", "man");
@@ -1947,7 +2014,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
@@ -2090,6 +2158,7 @@ pure_site_install ::
                }.$self->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{
 
 doc_perl_install ::
+       -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB)
        -}.$self->{NOECHO}.q{$(DOC_INSTALL) \
                "Module" "$(NAME)" \
                "installed into" "$(INSTALLPRIVLIB)" \
@@ -2099,6 +2168,7 @@ doc_perl_install ::
                >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
 
 doc_site_install ::
+       -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB)
        -}.$self->{NOECHO}.q{$(DOC_INSTALL) \
                "Module" "$(NAME)" \
                "installed into" "$(INSTALLSITELIB)" \
@@ -2324,7 +2394,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;
 
@@ -2342,7 +2412,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;
 
@@ -2359,7 +2429,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 || []}) );
@@ -2370,7 +2440,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, $_;
     }
@@ -2455,7 +2525,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
@@ -2465,6 +2535,7 @@ $tmp/perlmain.c: $makefilename}, q{
     push @m, q{
 doc_inst_perl:
        }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
+       -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB)
        -}.$self->{NOECHO}.q{$(DOC_INSTALL) \
                "Perl binary" "$(MAP_TARGET)" \
                MAP_STATIC "$(MAP_STATIC)" \
@@ -2547,6 +2618,10 @@ sub manifypods {
        $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
     }
     unless ($pod2man_exe = $self->perl_script($pod2man_exe)) {
+      # Maybe a build by uninstalled Perl?
+      $pod2man_exe = $self->catfile($self->{PERL_INC}, "pod", "pod2man");
+    }
+    unless ($pod2man_exe = $self->perl_script($pod2man_exe)) {
        # No pod2man but some MAN3PODS to be installed
        print <<END;
 
@@ -2701,7 +2776,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;
@@ -2817,16 +2892,53 @@ $(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)/objXSUB.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};
@@ -2990,7 +3102,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/$rprefix/s;
 }
 
 =item processPL (o)
@@ -3034,7 +3146,9 @@ sub realclean {
 realclean purge ::  clean
 ');
     # realclean subdirectories first (already cleaned)
-    my $sub = "\t-cd %s && \$(TEST_F) %s && \$(MAKE) %s realclean\n";
+    my $sub = ($Is_Win32  &&  Win32::IsWin95()) ?
+      "\tcd %s\n\t\$(TEST_F) %s\n\t\$(MAKE) %s realclean\n\tcd ..\n" :
+      "\t-cd %s && \$(TEST_F) %s && \$(MAKE) %s realclean\n";
     foreach(@{$self->{DIR}}){
        push(@m, sprintf($sub,$_,"$self->{MAKEFILE}.old","-f $self->{MAKEFILE}.old"));
        push(@m, sprintf($sub,$_,"$self->{MAKEFILE}",''));
@@ -3112,9 +3226,18 @@ END
     # 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:
@@ -3178,12 +3301,25 @@ Helper subroutine for subdirs
 sub subdir_x {
     my($self, $subdir) = @_;
     my(@m);
-    qq{
+    if ($Is_Win32 && Win32::IsWin95()) {
+       # XXX: dmake-specific, like rest of Win95 port
+       return <<EOT;
+subdirs ::
+@[
+       cd $subdir
+       \$(MAKE) all \$(PASTHRU)
+       cd ..
+]
+EOT
+    }
+    else {
+       return <<EOT;
 
 subdirs ::
        $self->{NOECHO}cd $subdir && \$(MAKE) all \$(PASTHRU)
 
-};
+EOT
+    }
 }
 
 =item subdirs (o)
@@ -3369,7 +3505,7 @@ 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";'
@@ -3434,7 +3570,7 @@ sub tool_xsubpp {
 XSUBPPDIR = $xsdir
 XSUBPP = \$(XSUBPPDIR)/$xsubpp
 XSPROTOARG = $self->{XSPROTOARG}
-XSUBPPDEPS = @tmdeps
+XSUBPPDEPS = @tmdeps \$(XSUBPP)
 XSUBPPARGS = @tmargs
 };
 };
@@ -3532,12 +3668,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}}) {