This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate mainline
[perl5.git] / lib / ExtUtils / MM_Unix.pm
index 1018121..c88f8f7 100644 (file)
@@ -1,24 +1,27 @@
 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
+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.118 $, 10;
-# $Id: MM_Unix.pm,v 1.118 1997/08/01 09:42:52 k Exp $
+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 );
@@ -78,11 +81,15 @@ path. On UNIX eliminated successive slashes and successive "/.".
 
 sub canonpath {
     my($self,$path) = @_;
-    $path =~ s|/+|/|g ;                            # xx////xx  -> xx/xx
+    my $node = '';
+    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|/$|| unless $path eq "/";           # xx/       -> xx
-    $path;
+    $path =~ s|^(\./)+||s unless $path eq "./";    # ./xx      -> xx
+    $path =~ s|(?<=[^/])/\z|| ;                    # xx/       -> xx
+    "$node$path";
 }
 
 =item catdir
@@ -182,6 +189,7 @@ sub ExtUtils::MM_Unix::fixin ;
 sub ExtUtils::MM_Unix::force ;
 sub ExtUtils::MM_Unix::guess_name ;
 sub ExtUtils::MM_Unix::has_link_code ;
+sub ExtUtils::MM_Unix::htmlifypods ;
 sub ExtUtils::MM_Unix::init_dirscan ;
 sub ExtUtils::MM_Unix::init_main ;
 sub ExtUtils::MM_Unix::init_others ;
@@ -208,6 +216,7 @@ sub ExtUtils::MM_Unix::pm_to_blib ;
 sub ExtUtils::MM_Unix::post_constants ;
 sub ExtUtils::MM_Unix::post_initialize ;
 sub ExtUtils::MM_Unix::postamble ;
+sub ExtUtils::MM_Unix::ppd ;
 sub ExtUtils::MM_Unix::prefixify ;
 sub ExtUtils::MM_Unix::processPL ;
 sub ExtUtils::MM_Unix::realclean ;
@@ -226,6 +235,7 @@ sub ExtUtils::MM_Unix::tools_other ;
 sub ExtUtils::MM_Unix::top_targets ;
 sub ExtUtils::MM_Unix::writedoc ;
 sub ExtUtils::MM_Unix::xs_c ;
+sub ExtUtils::MM_Unix::xs_cpp ;
 sub ExtUtils::MM_Unix::xs_o ;
 sub ExtUtils::MM_Unix::xsubpp_version ;
 
@@ -297,8 +307,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} ||= '';
@@ -333,16 +343,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){
@@ -360,19 +366,50 @@ 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) { 
+           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;
+           }
+        }
+    }
+
+    if ($self->{POLLUTE}) {
+       $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
 };
 
 }
@@ -396,14 +433,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
                        ]);
@@ -429,7 +479,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) $(MPOLLUTE) $(DEFINE_VERSION) \\
        $(XS_DEFINE_VERSION)};
 }
 
@@ -502,7 +552,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};
@@ -514,6 +564,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{
@@ -543,17 +594,33 @@ XS_FILES= ".join(" \\\n\t", sort keys %{$self->{XS}})."
 C_FILES = ".join(" \\\n\t", @{$self->{C}})."
 O_FILES = ".join(" \\\n\t", @{$self->{O_FILES}})."
 H_FILES = ".join(" \\\n\t", @{$self->{H}})."
+HTMLLIBPODS    = ".join(" \\\n\t", sort keys %{$self->{HTMLLIBPODS}})."
+HTMLSCRIPTPODS = ".join(" \\\n\t", sort keys %{$self->{HTMLSCRIPTPODS}})."
 MAN1PODS = ".join(" \\\n\t", sort keys %{$self->{MAN1PODS}})."
 MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})."
 ";
 
     for $tmp (qw/
-             INST_MAN1DIR INSTALLMAN1DIR MAN1EXT INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
+             INST_HTMLPRIVLIBDIR INSTALLHTMLPRIVLIBDIR
+             INST_HTMLSITELIBDIR INSTALLHTMLSITELIBDIR
+             INST_HTMLSCRIPTDIR  INSTALLHTMLSCRIPTDIR
+             INST_HTMLLIBDIR                    HTMLEXT
+             INST_MAN1DIR        INSTALLMAN1DIR MAN1EXT
+             INST_MAN3DIR        INSTALLMAN3DIR MAN3EXT
              /) {
        next unless defined $self->{$tmp};
        push @m, "$tmp = $self->{$tmp}\n";
     }
 
+    for $tmp (qw(
+               PERM_RW PERM_RWX
+               )
+            ) {
+        my $method = lc($tmp);
+       # warn "self[$self] method[$method]";
+        push @m, "$tmp = ", $self->$method(), "\n";
+    }
+
     push @m, q{
 .NO_CONFIG_REC: Makefile
 } if $ENV{CLEARCASE_ROOT};
@@ -667,7 +734,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);
@@ -678,8 +745,8 @@ $targ :: $src
        $self->{NOECHO}\$(MKPATH) $targdir
        $self->{NOECHO}\$(EQUALIZE_TIMESTAMP) $src $targ
 };
-       push(@m,qq{
-       -$self->{NOECHO}\$(CHMOD) 755 $targdir
+       push(@m, qq{
+       -$self->{NOECHO}\$(CHMOD) \$(PERM_RWX) $targdir
 }) unless $Is_VMS;
     }
     join "", @m;
@@ -702,8 +769,8 @@ sub dist {
     my($tarflags) = $attribs{TARFLAGS} || 'cvf';
     my($zip)      = $attribs{ZIP}      || 'zip';        # eg pkzip Yuck!
     my($zipflags) = $attribs{ZIPFLAGS} || '-r';
-    my($compress) = $attribs{COMPRESS} || 'compress';   # eg gzip
-    my($suffix)   = $attribs{SUFFIX}   || '.Z';          # eg .gz
+    my($compress) = $attribs{COMPRESS} || 'gzip --best';
+    my($suffix)   = $attribs{SUFFIX}   || '.gz';          # eg .gz
     my($shar)     = $attribs{SHAR}     || 'shar';       # eg "shar --gzip"
     my($preop)    = $attribs{PREOP}    || "$self->{NOECHO}\$(NOOP)"; # eg update MANIFEST
     my($postop)   = $attribs{POSTOP}   || "$self->{NOECHO}\$(NOOP)"; # eg remove the distdir
@@ -741,7 +808,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
 
@@ -769,6 +836,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;
 }
 
@@ -793,7 +865,7 @@ ci :
 
 =item dist_core (o)
 
-Defeines the targets dist, tardist, zipdist, uutardist, shdist
+Defines the targets dist, tardist, zipdist, uutardist, shdist
 
 =cut
 
@@ -890,6 +962,7 @@ sub dlsyms {
 
     my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
     my($vars)  = $attribs{DL_VARS} || $self->{DL_VARS} || [];
+    my($funclist)  = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
     my(@m);
 
     push(@m,"
@@ -906,7 +979,8 @@ static :: $self->{BASEEXT}.exp
 $self->{BASEEXT}.exp: Makefile.PL
 ",'    $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e \'use ExtUtils::Mksymlists; \\
        Mksymlists("NAME" => "',$self->{NAME},'", "DL_FUNCS" => ',
-       neatvalue($funcs),', "DL_VARS" => ', neatvalue($vars), ');\'
+       neatvalue($funcs), ', "FUNCLIST" => ', neatvalue($funclist),
+       ', "DL_VARS" => ', neatvalue($vars), ');\'
 ');
 
     join('',@m);
@@ -955,12 +1029,12 @@ $(BOOTSTRAP): '."$self->{MAKEFILE} $self->{BOOTDEP}".' $(INST_ARCHAUTODIR)/.exis
                -MExtUtils::Mkbootstrap \
                -e "Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
        '.$self->{NOECHO}.'$(TOUCH) $(BOOTSTRAP)
-       $(CHMOD) 644 $@
+       $(CHMOD) $(PERM_RW) $@
 
 $(INST_BOOT): $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists
        '."$self->{NOECHO}$self->{RM_RF}".' $(INST_BOOT)
        -'.$self->{CP}.' $(BOOTSTRAP) $(INST_BOOT)
-       $(CHMOD) 644 $@
+       $(CHMOD) $(PERM_RW) $@
 ';
 }
 
@@ -998,20 +1072,22 @@ $(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
+    # The IRIX linker doesn't use LD_RUN_PATH
     $ldrun = qq{-rpath "$self->{LD_RUN_PATH}"}
        if ($^O eq 'irix' && $self->{LD_RUN_PATH});
 
+    # 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) -o $@ '.$ldrun.' $(LDDLFLAGS) '.$ldfrom.
                ' $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) $(EXPORT_LIST)');
     push @m, '
-       $(CHMOD) 755 $@
+       $(CHMOD) $(PERM_RWX) $@
 ';
 
     push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
@@ -1051,10 +1127,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 ;
     }
 }
 
@@ -1074,9 +1150,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;
@@ -1176,8 +1252,6 @@ eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}'
            next;
        }
        my($dev,$ino,$mode) = stat FIXIN;
-       $mode = 0755 unless $dev;
-       chmod $mode, $file;
        
        # Print out the new #! line (or equivalent).
        local $\;
@@ -1185,7 +1259,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;
@@ -1200,7 +1282,9 @@ eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}'
        }
        unlink "$file.bak";
     } continue {
-       chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
+       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 ':';;
     }
 }
@@ -1233,7 +1317,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";
@@ -1258,9 +1342,60 @@ sub has_link_code {
     return $self->{HAS_LINK_CODE} = 0;
 }
 
+=item htmlifypods (o)
+
+Defines targets and routines to translate the pods into HTML manpages
+and put them into the INST_HTMLLIBDIR and INST_HTMLSCRIPTDIR
+directories.
+
+=cut
+
+sub htmlifypods {
+    my($self, %attribs) = @_;
+    return "\nhtmlifypods : pure_all\n\t$self->{NOECHO}\$(NOOP)\n" unless
+       %{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}};
+    my($dist);
+    my($pod2html_exe);
+    if (defined $self->{PERL_SRC}) {
+       $pod2html_exe = $self->catfile($self->{PERL_SRC},'pod','pod2html');
+    } else {
+       $pod2html_exe = $self->catfile($Config{scriptdirexp},'pod2html');
+    }
+    unless ($pod2html_exe = $self->perl_script($pod2html_exe)) {
+       # No pod2html but some HTMLxxxPODS to be installed
+       print <<END;
+
+Warning: I could not locate your pod2html program. Please make sure,
+         your pod2html program is in your PATH before you execute 'make'
+
+END
+        $pod2html_exe = "-S pod2html";
+    }
+    my(@m);
+    push @m,
+qq[POD2HTML_EXE = $pod2html_exe\n],
+qq[POD2HTML = \$(PERL) -we 'use File::Basename; use File::Path qw(mkpath); %m=\@ARGV;for (keys %m){' \\\n],
+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 'chmod(oct($(PERM_RW))), $$m{$$_} or warn "chmod $(PERM_RW) $$m{$$_}: $$!\n";}'
+];
+    push @m, "\nhtmlifypods : pure_all ";
+    push @m, join " \\\n\t", keys %{$self->{HTMLLIBPODS}}, keys %{$self->{HTMLSCRIPTPODS}};
+
+    push(@m,"\n");
+    if (%{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}}) {
+       push @m, "\t$self->{NOECHO}\$(POD2HTML) \\\n\t";
+       push @m, join " \\\n\t", %{$self->{HTMLLIBPODS}}, %{$self->{HTMLSCRIPTPODS}};
+    }
+    join('', @m);
+}
+
 =item init_dirscan
 
-Initializes DIR, XS, PM, C, O_FILES, H, PL_FILES, MAN*PODS, EXE_FILES.
+Initializes DIR, XS, PM, C, O_FILES, H, PL_FILES, HTML*PODS, MAN*PODS, EXE_FILES.
 
 =cut
 
@@ -1277,24 +1412,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$/) {  # case-insensitive filesystem
+       } 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$// ;
+               ($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);
        }
     }
@@ -1369,70 +1506,64 @@ 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};
 
     # Set up names of manual pages to generate from pods
-    if ($self->{MAN1PODS}) {
-    } elsif ( $self->{INST_MAN1DIR} =~ /^(none|\s*)$/ ) {
-       $self->{MAN1PODS} = {};
-    } else {
-       my %manifypods = ();
+    my %pods;
+    foreach my $man (qw(MAN1 MAN3 HTMLLIB HTMLSCRIPT)) {
+       unless ($self->{"${man}PODS"}) {
+           $self->{"${man}PODS"} = {};
+           $pods{$man} = 1 unless $self->{"INST_${man}DIR"} =~ /^(none|\s*)$/;
+       }
+    }
+
+    if ($pods{MAN1} || $pods{HTMLSCRIPT}) {
        if ( exists $self->{EXE_FILES} ) {
            foreach $name (@{$self->{EXE_FILES}}) {
-#              use FileHandle ();
-#              my $fh = new FileHandle;
                local *FH;
                my($ispod)=0;
-#              if ($fh->open("<$name")) {
                if (open(FH,"<$name")) {
-#                  while (<$fh>) {
                    while (<FH>) {
                        if (/^=head1\s+\w+/) {
                            $ispod=1;
                            last;
                        }
                    }
-#                  $fh->close;
                    close FH;
                } else {
                    # If it doesn't exist yet, we assume, it has pods in it
                    $ispod = 1;
                }
-               if( $ispod ) {
-                   $manifypods{$name} =
-                       $self->catfile('$(INST_MAN1DIR)',
-                                      basename($name).'.$(MAN1EXT)');
+               next unless $ispod;
+               if ($pods{HTMLSCRIPT}) {
+                   $self->{HTMLSCRIPTPODS}->{$name} =
+                     $self->catfile("\$(INST_HTMLSCRIPTDIR)", basename($name).".\$(HTMLEXT)");
+               }
+               if ($pods{MAN1}) {
+                   $self->{MAN1PODS}->{$name} =
+                     $self->catfile("\$(INST_MAN1DIR)", basename($name).".\$(MAN1EXT)");
                }
            }
        }
-       $self->{MAN1PODS} = \%manifypods;
     }
-    if ($self->{MAN3PODS}) {
-    } elsif ( $self->{INST_MAN3DIR} =~ /^(none|\s*)$/ ) {
-       $self->{MAN3PODS} = {};
-    } else {
+    if ($pods{MAN3} || $pods{HTMLLIB}) {
        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]$/ ) {
-#              use FileHandle ();
-#              my $fh = new FileHandle;
+           } elsif ($name =~ /\.p[ml]\z/ ) {
                local *FH;
                my($ispod)=0;
-#              $fh->open("<$name");
                if (open(FH,"<$name")) {
-                   #           while (<$fh>) {
                    while (<FH>) {
                        if (/^=head1\s+\w+/) {
                            $ispod=1;
                            last;
                        }
                    }
-                   #           $fh->close;
                    close FH;
                } else {
                    $ispod = 1;
@@ -1446,19 +1577,25 @@ 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;
-           unless ($manpagename =~ s!^\W*lib\W+!!) { # everything below lib is ok
+           $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+!!s) { # everything below lib is ok
                $manpagename = $self->catfile(split(/::/,$self->{PARENT_NAME}),$manpagename);
            }
-           $manpagename =~ s/\.p(od|m|l)$//;
-           $manpagename = $self->replace_manpage_separator($manpagename);
-           $manifypods{$name} = $self->catfile("\$(INST_MAN3DIR)","$manpagename.\$(MAN3EXT)");
+           if ($pods{MAN3}) {
+               $manpagename = $self->replace_manpage_separator($manpagename);
+               $self->{MAN3PODS}->{$name} =
+                 $self->catfile("\$(INST_MAN3DIR)", "$manpagename.\$(MAN3EXT)");
+           }
        }
-       $self->{MAN3PODS} = \%manifypods;
     }
 }
 
@@ -1499,7 +1636,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 '_'
@@ -1523,7 +1660,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")
                &&
@@ -1569,10 +1706,35 @@ 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;
+
+       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
+           # 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.
@@ -1663,8 +1825,7 @@ usually solves this kind of problem.
 
     my($install_variable,$search_prefix,$replace_prefix);
 
-    # The rule, taken from Configure, is that if prefix contains perl,
-    # we shape the tree
+    # If the prefix contains perl, Configure shapes the tree as follows:
     #    perlprefix/lib/                INSTALLPRIVLIB
     #    perlprefix/lib/pod/
     #    perlprefix/lib/site_perl/     INSTALLSITELIB
@@ -1676,6 +1837,11 @@ usually solves this kind of problem.
     #    prefix/lib/perl5/site_perl/   INSTALLSITELIB
     #    prefix/bin/                   INSTALLBIN
     #    prefix/lib/perl5/man/         INSTALLMAN1DIR
+    #
+    # The above results in various kinds of breakage on various
+    # platforms, so we cope with it as follows: if prefix/lib/perl5
+    # or prefix/lib/perl5/man exist, we'll replace those instead
+    # of /prefix/{lib,man}
 
     $replace_prefix = qq[\$\(PREFIX\)];
     for $install_variable (qw/
@@ -1684,36 +1850,45 @@ usually solves this kind of problem.
                           /) {
        $self->prefixify($install_variable,$configure_prefix,$replace_prefix);
     }
-    $search_prefix = $configure_prefix =~ /perl/ ?
-       $self->catdir($configure_prefix,"lib") :
-       $self->catdir($configure_prefix,"lib","perl5");
+    my $funkylibdir = $self->catdir($configure_prefix,"lib","perl5");
+    $funkylibdir = '' unless -d $funkylibdir;
+    $search_prefix = $funkylibdir || $self->catdir($configure_prefix,"lib");
     if ($self->{LIB}) {
        $self->{INSTALLPRIVLIB} = $self->{INSTALLSITELIB} = $self->{LIB};
        $self->{INSTALLARCHLIB} = $self->{INSTALLSITEARCH} = 
            $self->catdir($self->{LIB},$Config{'archname'});
-    } else {
-       $replace_prefix = $self->{PREFIX} =~ /perl/ ? 
-           $self->catdir(qq[\$\(PREFIX\)],"lib") :
-               $self->catdir(qq[\$\(PREFIX\)],"lib","perl5");
+    }
+    else {
+       if (-d $self->catdir($self->{PREFIX},"lib","perl5")) {
+           $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib", "perl5");
+       }
+       else {
+           $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib");
+       }
        for $install_variable (qw/
                               INSTALLPRIVLIB
                               INSTALLARCHLIB
                               INSTALLSITELIB
                               INSTALLSITEARCH
-                              /) {
+                              /)
+       {
            $self->prefixify($install_variable,$search_prefix,$replace_prefix);
        }
     }
-    $search_prefix = $configure_prefix =~ /perl/ ?
-       $self->catdir($configure_prefix,"man") :
-           $self->catdir($configure_prefix,"lib","perl5","man");
-    $replace_prefix = $self->{PREFIX} =~ /perl/ ? 
-       $self->catdir(qq[\$\(PREFIX\)],"man") :
-           $self->catdir(qq[\$\(PREFIX\)],"lib","perl5","man");
+    my $funkymandir = $self->catdir($configure_prefix,"lib","perl5","man");
+    $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");
+    }
+    else {
+       $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"man");
+    }
     for $install_variable (qw/
                           INSTALLMAN1DIR
                           INSTALLMAN3DIR
-                          /) {
+                          /)
+    {
        $self->prefixify($install_variable,$search_prefix,$replace_prefix);
     }
 
@@ -1741,6 +1916,30 @@ usually solves this kind of problem.
     }
     $self->{MAN3EXT} ||= $Config::Config{man3ext};
 
+    $self->{INSTALLHTMLPRIVLIBDIR} = $Config::Config{installhtmlprivlibdir}
+        unless defined $self->{INSTALLHTMLPRIVLIBDIR};
+    $self->{INSTALLHTMLSITELIBDIR} = $Config::Config{installhtmlsitelibdir}
+        unless defined $self->{INSTALLHTMLSITELIBDIR};
+
+    unless (defined $self->{INST_HTMLLIBDIR}){
+       if ($self->{INSTALLHTMLSITELIBDIR} =~ /^(none|\s*)$/){
+           $self->{INST_HTMLLIBDIR} = $self->{INSTALLHTMLSITELIBDIR};
+       } else {
+           $self->{INST_HTMLLIBDIR} = $self->catdir($self->curdir,'blib','html','lib');
+       }
+    }
+
+    $self->{INSTALLHTMLSCRIPTDIR} = $Config::Config{installhtmlscriptdir}
+        unless defined $self->{INSTALLHTMLSCRIPTDIR};
+    unless (defined $self->{INST_HTMLSCRIPTDIR}){
+       if ($self->{INSTALLHTMLSCRIPTDIR} =~ /^(none|\s*)$/){
+           $self->{INST_HTMLSCRIPTDIR} = $self->{INSTALLHTMLSCRIPTDIR};
+       } else {
+           $self->{INST_HTMLSCRIPTDIR} = $self->catdir($self->curdir,'blib','html','bin');
+       }
+    }
+    $self->{HTMLEXT} ||= $Config::Config{htmlext} || 'html';
+
 
     # Get some stuff out of %Config if we haven't yet done so
     print STDOUT "CONFIG must be an array ref\n"
@@ -1814,7 +2013,8 @@ usually solves this kind of problem.
        push @defpath, $component if defined $component;
     }
     $self->{PERL} ||=
-        $self->find_perl(5.0, [ $^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
@@ -1933,6 +2133,8 @@ pure_perl_install ::
                $(INST_ARCHLIB) $(INSTALLARCHLIB) \
                $(INST_BIN) $(INSTALLBIN) \
                $(INST_SCRIPT) $(INSTALLSCRIPT) \
+               $(INST_HTMLLIBDIR) $(INSTALLHTMLPRIVLIBDIR) \
+               $(INST_HTMLSCRIPTDIR) $(INSTALLHTMLSCRIPTDIR) \
                $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
                $(INST_MAN3DIR) $(INSTALLMAN3DIR)
        }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
@@ -1947,12 +2149,15 @@ pure_site_install ::
                $(INST_ARCHLIB) $(INSTALLSITEARCH) \
                $(INST_BIN) $(INSTALLBIN) \
                $(INST_SCRIPT) $(INSTALLSCRIPT) \
+               $(INST_HTMLLIBDIR) $(INSTALLHTMLSITELIBDIR) \
+               $(INST_HTMLSCRIPTDIR) $(INSTALLHTMLSCRIPTDIR) \
                $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
                $(INST_MAN3DIR) $(INSTALLMAN3DIR)
        }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
                }.$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)" \
@@ -1962,6 +2167,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)" \
@@ -1989,7 +2195,7 @@ uninstall_from_sitedirs ::
 
 =item installbin (o)
 
-Defines targets to install EXE_FILES.
+Defines targets to make and to install EXE_FILES.
 
 =cut
 
@@ -2016,7 +2222,7 @@ EXE_FILES = @{$self->{EXE_FILES}}
 } : q{FIXIN = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::MakeMaker \
     -e "MY->fixin(shift)"
 }).qq{
-all :: @to
+pure_all :: @to
        $self->{NOECHO}\$(NOOP)
 
 realclean ::
@@ -2031,6 +2237,7 @@ $to: $from $self->{MAKEFILE} " . $self->catdir($todir,'.exists') . "
        $self->{NOECHO}$self->{RM_F} $to
        $self->{CP} $from $to
        \$(FIXIN) $to
+       -$self->{NOECHO}\$(CHMOD) \$(PERM_RWX) $to
 ";
     }
     join "", @m;
@@ -2168,7 +2375,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,;
 
@@ -2186,7 +2393,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;
 
@@ -2204,7 +2411,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;
 
@@ -2221,7 +2428,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 || []}) );
@@ -2232,7 +2439,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, $_;
     }
@@ -2251,7 +2458,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) {
@@ -2259,6 +2466,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}";
@@ -2296,14 +2504,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 $llibperl \$(MAP_STATIC) `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'
@@ -2317,7 +2520,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/##, qw|$(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
@@ -2327,6 +2530,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)" \
@@ -2373,6 +2577,7 @@ $(OBJECT) : $(FIRST_MAKEFILE)
 }.$self->{MAKEFILE}.q{ : Makefile.PL $(CONFIGDEP)
        }.$self->{NOECHO}.q{echo "Makefile out-of-date with respect to $?"
        }.$self->{NOECHO}.q{echo "Cleaning current config before rebuilding 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{
@@ -2398,7 +2603,8 @@ put them into the INST_* directories.
 
 sub manifypods {
     my($self, %attribs) = @_;
-    return "\nmanifypods :\n\t$self->{NOECHO}\$(NOOP)\n" unless %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
+    return "\nmanifypods : pure_all\n\t$self->{NOECHO}\$(NOOP)\n" unless
+       %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
     my($dist);
     my($pod2man_exe);
     if (defined $self->{PERL_SRC}) {
@@ -2406,7 +2612,11 @@ sub manifypods {
     } else {
        $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
     }
-    unless ($self->perl_script($pod2man_exe)) {
+    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;
 
@@ -2419,13 +2629,14 @@ END
     my(@m);
     push @m,
 qq[POD2MAN_EXE = $pod2man_exe\n],
-q[POD2MAN = $(PERL) -we '%m=@ARGV;for (keys %m){' \\
--e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "].$self->{MAKEFILE}.q[";' \\
+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 'chmod 0644, $$m{$$_} or warn "chmod 644 $$m{$$_}: $$!\n";}'
+-e 'chmod(oct($(PERM_RW))), $$m{$$_} or warn "chmod $(PERM_RW) $$m{$$_}: $$!\n";}'
 ];
-    push @m, "\nmanifypods : ";
+    push @m, "\nmanifypods : pure_all ";
     push @m, join " \\\n\t", keys %{$self->{MAN1PODS}}, keys %{$self->{MAN3PODS}};
 
     push(@m,"\n");
@@ -2532,7 +2743,9 @@ sub nicetext {
 
 =item parse_version
 
-parse a file and return what you think is $VERSION in this file set to
+parse a file and return what you think is $VERSION in this file set to.
+It will return the string "undef" if it can't figure out what $VERSION
+is.
 
 =cut
 
@@ -2558,9 +2771,9 @@ sub parse_version {
                $_
            }; \$$2
        };
-       local($^W) = 0;
+       no warnings;
        $result = eval($eval);
-       die "Could not eval '$eval' in $parsefile: $@" if $@;
+       warn "Could not eval '$eval' in $parsefile: $@" if $@;
        $result = "undef" unless defined $result;
        last;
     }
@@ -2568,6 +2781,32 @@ sub parse_version {
     return $result;
 }
 
+=item parse_abstract
+
+parse a file and return what you think is the ABSTRACT
+
+=cut
+
+sub parse_abstract {
+    my($self,$parsefile) = @_;
+    my $result;
+    local *FH;
+    local $/ = "\n";
+    open(FH,$parsefile) or die "Could not open '$parsefile': $!";
+    my $inpod = 0;
+    my $package = $self->{DISTNAME};
+    $package =~ s/-/::/g;
+    while (<FH>) {
+        $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
+        next if !$inpod;
+        chop;
+        next unless /^($package\s-\s)(.*)/;
+        $result = $2;
+        last;
+    }
+    close FH;
+    return $result;
+}
 
 =item pasthru (o)
 
@@ -2648,16 +2887,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)/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};
@@ -2667,6 +2943,91 @@ $(OBJECT) : $(PERL_HDRS)
     join "\n", @m;
 }
 
+=item ppd
+
+Defines target that creates a PPD (Perl Package Description) file
+for a binary distribution.
+
+=cut
+
+sub ppd {
+    my($self) = @_;
+    my(@m);
+    if ($self->{ABSTRACT_FROM}){
+        $self->{ABSTRACT} = $self->parse_abstract($self->{ABSTRACT_FROM}) or
+            Carp::carp "WARNING: Setting ABSTRACT via file '$self->{ABSTRACT_FROM}' failed\n";
+    }
+    my ($pack_ver) = join ",", (split (/\./, $self->{VERSION}), (0) x 4) [0 .. 3];
+    push(@m, "# Creates a PPD (Perl Package Description) for a binary distribution.\n");
+    push(@m, "ppd:\n");
+    push(@m, "\t\@\$(PERL) -e \"print qq{<SOFTPKG NAME=\\\"$self->{DISTNAME}\\\" VERSION=\\\"$pack_ver\\\">\\n}");
+    push(@m, ". qq{\\t<TITLE>$self->{DISTNAME}</TITLE>\\n}");
+    my $abstract = $self->{ABSTRACT};
+    $abstract =~ s/\n/\\n/sg;
+    $abstract =~ s/</&lt;/g;
+    $abstract =~ s/>/&gt;/g;
+    push(@m, ". qq{\\t<ABSTRACT>$abstract</ABSTRACT>\\n}");
+    my ($author) = $self->{AUTHOR};
+    $author =~ s/</&lt;/g;
+    $author =~ s/>/&gt;/g;
+    $author =~ s/@/\\@/g;
+    push(@m, ". qq{\\t<AUTHOR>$author</AUTHOR>\\n}");
+    push(@m, ". qq{\\t<IMPLEMENTATION>\\n}");
+    my ($prereq);
+    foreach $prereq (sort keys %{$self->{PREREQ_PM}}) {
+        my $pre_req = $prereq;
+        $pre_req =~ s/::/-/g;
+        my ($dep_ver) = join ",", (split (/\./, $self->{PREREQ_PM}{$prereq}), (0) x 4) [0 .. 3];
+        push(@m, ". qq{\\t\\t<DEPENDENCY NAME=\\\"$pre_req\\\" VERSION=\\\"$dep_ver\\\" />\\n}");
+    }
+    push(@m, ". qq{\\t\\t<OS NAME=\\\"\$(OSNAME)\\\" />\\n}");
+    push(@m, ". qq{\\t\\t<ARCHITECTURE NAME=\\\"$Config{'archname'}\\\" />\\n}");
+    my ($bin_location) = $self->{BINARY_LOCATION};
+    $bin_location =~ s/\\/\\\\/g;
+    if ($self->{PPM_INSTALL_SCRIPT}) {
+        if ($self->{PPM_INSTALL_EXEC}) {
+            push(@m, " . qq{\\t\\t<INSTALL EXEC=\\\"$self->{PPM_INSTALL_EXEC}\\\">$self->{PPM_INSTALL_SCRIPT}</INSTALL>\\n}");
+        }
+        else {
+            push(@m, " . qq{\\t\\t<INSTALL>$self->{PPM_INSTALL_SCRIPT}</INSTALL>\\n}");
+        }
+    }
+    push(@m, ". qq{\\t\\t<CODEBASE HREF=\\\"$bin_location\\\" />\\n}");
+    push(@m, ". qq{\\t</IMPLEMENTATION>\\n}");
+    push(@m, ". qq{</SOFTPKG>\\n}\" > $self->{DISTNAME}.ppd");
+
+    join("", @m);   
+}
+
+=item perm_rw (o)
+
+Returns the attribute C<PERM_RW> or the string C<644>.
+Used as the string that is passed
+to the C<chmod> command to set the permissions for read/writeable files.
+MakeMaker chooses C<644> because it has turned out in the past that
+relying on the umask provokes hard-to-track bug reports.
+When the return value is used by the perl function C<chmod>, it is
+interpreted as an octal value.
+
+=cut
+
+sub perm_rw {
+    shift->{PERM_RW} || "644";
+}
+
+=item perm_rwx (o)
+
+Returns the attribute C<PERM_RWX> or the string C<755>,
+i.e. the string that is passed
+to the C<chmod> command to set the permissions for executable files.
+See also perl_rw.
+
+=cut
+
+sub perm_rwx {
+    shift->{PERM_RWX} || "755";
+}
+
 =item pm_to_blib
 
 Defines target that copies all files in the hash PM to their
@@ -2736,7 +3097,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)
@@ -2750,13 +3111,18 @@ sub processPL {
     return "" unless $self->{PL_FILES};
     my(@m, $plfile);
     foreach $plfile (sort keys %{$self->{PL_FILES}}) {
+        my $list = ref($self->{PL_FILES}->{$plfile})
+               ? $self->{PL_FILES}->{$plfile}
+               : [$self->{PL_FILES}->{$plfile}];
+       foreach $target (@$list) {
        push @m, "
-all :: $self->{PL_FILES}->{$plfile}
+all :: $target
        $self->{NOECHO}\$(NOOP)
 
-$self->{PL_FILES}->{$plfile} :: $plfile
-       \$(PERL) -I\$(INST_ARCHLIB) -I\$(INST_LIB) -I\$(PERL_ARCHLIB) -I\$(PERL_LIB) $plfile
+$target :: $plfile
+       \$(PERL) -I\$(INST_ARCHLIB) -I\$(INST_LIB) -I\$(PERL_ARCHLIB) -I\$(PERL_LIB) $plfile $target
 ";
+       }
     }
     join "", @m;
 }
@@ -2775,7 +3141,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}",''));
@@ -2785,7 +3153,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");
+    # 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};
@@ -2803,7 +3186,13 @@ form Foo/Bar and replaces the slash with C<::>. Returns the replacement.
 
 sub replace_manpage_separator {
     my($self,$man) = @_;
-    $man =~ s,/+,::,g;
+       if ($^O eq 'uwin') {
+           $man =~ s,/+,.,g;
+       } elsif ($Is_Dos) {
+           $man =~ s,/+,__,g;
+       } else {
+           $man =~ s,/+,::,g;
+       }
     $man;
 }
 
@@ -2848,9 +3237,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,
+        "\t\$($ar) ".'$(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@'."\n";
     push @m,
-q{     $(AR) $(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@
-       $(CHMOD) 755 $@
+q{     $(CHMOD) $(PERM_RWX) $@
        }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)/extralibs.ld
 };
     # Old mechanism - still available:
@@ -2914,12 +3312,34 @@ Helper subroutine for subdirs
 sub subdir_x {
     my($self, $subdir) = @_;
     my(@m);
-    qq{
+    if ($Is_Win32 && Win32::IsWin95()) {
+       if ($Config{'make'} =~ /dmake/i) {
+           # dmake-specific
+           return <<EOT;
+subdirs ::
+@[
+       cd $subdir
+       \$(MAKE) all \$(PASTHRU)
+       cd ..
+]
+EOT
+        } elsif ($Config{'make'} =~ /nmake/i) {
+           # nmake-specific
+           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)
@@ -3099,13 +3519,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";'
@@ -3164,11 +3584,13 @@ sub tool_xsubpp {
        }
     }
 
+    my $xsubpp = "xsubpp";
+
     return qq{
 XSUBPPDIR = $xsdir
-XSUBPP = \$(XSUBPPDIR)/xsubpp
+XSUBPP = \$(XSUBPPDIR)/$xsubpp
 XSPROTOARG = $self->{XSPROTOARG}
-XSUBPPDEPS = @tmdeps
+XSUBPPDEPS = @tmdeps \$(XSUBPP)
 XSUBPPARGS = @tmargs
 };
 };
@@ -3244,7 +3666,7 @@ sub top_targets {
 ';
 
     push @m, '
-all :: pure_all manifypods
+all :: pure_all htmlifypods manifypods
        '.$self->{NOECHO}.'$(NOOP)
 ' 
          unless $self->{SKIPHASH}{'all'};
@@ -3266,13 +3688,25 @@ config :: $(INST_AUTODIR)/.exists
        '.$self->{NOECHO}.'$(NOOP)
 ';
 
-    push @m, qq{
-config :: Version_check
+    push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
+
+    if (%{$self->{HTMLLIBPODS}}) {
+       push @m, qq[
+config :: \$(INST_HTMLLIBDIR)/.exists
        $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_HTMLLIBDIR)]);
+    }
 
-    push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
+    if (%{$self->{HTMLSCRIPTPODS}}) {
+       push @m, qq[
+config :: \$(INST_HTMLSCRIPTDIR)/.exists
+       $self->{NOECHO}\$(NOOP)
+
+];
+       push @m, $self->dir_target(qw[$(INST_HTMLSCRIPTDIR)]);
+    }
 
     if (%{$self->{MAN1PODS}}) {
        push @m, qq[
@@ -3312,7 +3746,7 @@ Version_check:
 
 =item writedoc
 
-Obsolete, depecated method. Not used since Version 5.21.
+Obsolete, deprecated method. Not used since Version 5.21.
 
 =cut
 
@@ -3336,7 +3770,22 @@ sub xs_c {
     return '' unless $self->needs_linking();
     '
 .xs.c:
-       $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >$*.tc && $(MV) $*.tc $@
+       $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c
+';
+}
+
+=item xs_cpp (o)
+
+Defines the suffix rules to compile XS files to C++.
+
+=cut
+
+sub xs_cpp {
+    my($self) = shift;
+    return '' unless $self->needs_linking();
+    '
+.xs.cpp:
+       $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.cpp
 ';
 }
 
@@ -3352,7 +3801,7 @@ 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 >xstmp.c && $(MV) xstmp.c $*.c
+       $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c
        $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
 ';
 }
@@ -3367,6 +3816,7 @@ and Win32 do.
 
 sub perl_archive
 {
+ return '$(PERL_INC)' . "/$Config{libperl}" if $^O eq "beos";
  return "";
 }