Update to MakeMaker 5.34
Perl 5 Porters [Mon, 24 Jun 1996 04:56:22 +0000 (04:56 +0000)]
lib/ExtUtils/Install.pm
lib/ExtUtils/Liblist.pm
lib/ExtUtils/MM_Unix.pm
lib/ExtUtils/MM_VMS.pm
lib/ExtUtils/MakeMaker.pm
lib/ExtUtils/Manifest.pm
lib/ExtUtils/Mksymlists.pm

index 46b09d5..45bd2d7 100644 (file)
@@ -1,27 +1,30 @@
 package ExtUtils::Install;
 
+$VERSION = substr q$Revision: 1.12 $, 10;
+# $Id: Install.pm,v 1.12 1996/06/23 20:46:07 k Exp $
+
 use Exporter;
-use SelfLoader;
 use Carp ();
-
+use Config ();
+use vars qw(@ISA @EXPORT $VERSION);
 @ISA = ('Exporter');
 @EXPORT = ('install','uninstall','pm_to_blib');
 $Is_VMS = $^O eq 'VMS';
 
+my $splitchar = $^O eq 'VMS' ? '|' : $^O eq 'os2' ? ';' : ':';
+my @PERL_ENV_LIB = split $splitchar, defined $ENV{'PERL5LIB'} ? $ENV{'PERL5LIB'} : $ENV{'PERLLIB'};
+my $Inc_uninstall_warn_handler;
+
 #use vars qw( @EXPORT @ISA $Is_VMS );
 #use strict;
 
-1;
-
-sub ExtUtils::Install::install;
-sub ExtUtils::Install::uninstall;
-sub ExtUtils::Install::pm_to_blib;
-sub ExtUtils::Install::my_cmp;
-
-__DATA__
+sub forceunlink {
+    chmod 0666, $_[0];
+    unlink $_[0] or Carp::croak("Cannot forceunlink $_[0]: $!")
+}
 
 sub install {
-    my($hash,$verbose,$nonono) = @_;
+    my($hash,$verbose,$nonono,$inc_uninstall) = @_;
     $verbose ||= 0;
     $nonono  ||= 0;
 
@@ -31,7 +34,11 @@ sub install {
     use File::Copy qw(copy);
     use File::Find qw(find);
     use File::Path qw(mkpath);
-    # require "auto/ExtUtils/Install/my_cmp.al"; # Hairy, but for the first
+    # The following lines were needed with AutoLoader (left for the record)
+    # my $my_req = $self->catfile(qw(auto ExtUtils Install my_cmp.al));
+    # require $my_req;
+    # $my_req = $self->catfile(qw(auto ExtUtils Install forceunlink.al));
+    # require $my_req; # Hairy, but for the first
     # time use we are in a different directory when autoload happens, so
     # the relativ path to ./blib is ill.
 
@@ -47,7 +54,7 @@ sub install {
        #Check if there are files, and if yes, look if the corresponding
        #target directory is writable for us
        opendir DIR, $source_dir_or_file or next;
-       while ($_ = readdir DIR) {
+       for (readdir DIR) {
            next if $_ eq "." || $_ eq ".." || $_ eq ".exists";
            if (-w $hash{$source_dir_or_file} || mkpath($hash{$source_dir_or_file})) {
                last;
@@ -89,8 +96,8 @@ sub install {
            return if $_ eq ".exists";
            my $targetdir = $MY->catdir($hash{$source},$File::Find::dir);
            my $targetfile = $MY->catfile($targetdir,$_);
-           my $diff = 0;
 
+           my $diff = 0;
            if ( -f $targetfile && -s _ == $size) {
                # We have a good chance, we can skip this one
                $diff = my_cmp($_,$targetfile);
@@ -101,21 +108,28 @@ sub install {
 
            if ($diff){
                if (-f $targetfile){
-                   unlink $targetfile or Carp::croak("Couldn't unlink $targetfile");
+                   forceunlink($targetfile) unless $nonono;
                } else {
                    mkpath($targetdir,0,0755) unless $nonono;
                    print "mkpath($targetdir,0,0755)\n" if $verbose>1;
                }
                copy($_,$targetfile) unless $nonono;
-               print "Installing $targetfile\n" if $verbose;
+               print "Installing $targetfile\n";
                utime($atime,$mtime + $Is_VMS,$targetfile) unless $nonono>1;
                print "utime($atime,$mtime,$targetfile)\n" if $verbose>1;
+               $mode = 0444 | ( $mode & 0111 ? 0111 : 0 );
                chmod $mode, $targetfile;
                print "chmod($mode, $targetfile)\n" if $verbose>1;
            } else {
-               print "Skipping $targetfile (unchanged)\n";
+               print "Skipping $targetfile (unchanged)\n" if $verbose;
+           }
+           
+           if (! defined $inc_uninstall) { # it's called 
+           } elsif ($inc_uninstall == 0){
+               inc_uninstall($_,$File::Find::dir,$verbose,1); # nonono set to 1
+           } else {
+               inc_uninstall($_,$File::Find::dir,$verbose,0); # nonono set to 0
            }
-
            $write{$targetfile}++;
 
        }, ".");
@@ -163,15 +177,56 @@ sub my_cmp {
 sub uninstall {
     my($fil,$verbose,$nonono) = @_;
     die "no packlist file found: $fil" unless -f $fil;
+    # my $my_req = $self->catfile(qw(auto ExtUtils Install forceunlink.al));
+    # require $my_req; # Hairy, but for the first
     local *P;
     open P, $fil or Carp::croak("uninstall: Could not read packlist file $fil: $!");
     while (<P>) {
        chomp;
        print "unlink $_\n" if $verbose;
-       unlink($_) || Carp::carp("Couldn't unlink $_") unless $nonono;
+       forceunlink($_) unless $nonono;
     }
     print "unlink $fil\n" if $verbose;
-    unlink($fil) || Carp::carp("Couldn't unlink $fil") unless $nonono;
+    forceunlink($fil) unless $nonono;
+}
+
+sub inc_uninstall {
+    my($file,$libdir,$verbose,$nonono) = @_;
+    my($dir);
+    my $MY = {};
+    bless $MY, 'MY';
+    my %seen_dir = ();
+    foreach $dir (@INC, @PERL_ENV_LIB, @Config::Config{qw/archlibexp privlibexp sitearchexp sitelibexp/}) {
+       next if $dir eq ".";
+       next if $seen_dir{$dir}++;
+       my($targetfile) = $MY->catfile($dir,$libdir,$file);
+       next unless -f $targetfile;
+
+       # The reason why we compare file's contents is, that we cannot
+       # know, which is the file we just installed (AFS). So we leave
+       # an identical file in place
+       my $diff = 0;
+       if ( -f $targetfile && -s _ == -s $file) {
+           # We have a good chance, we can skip this one
+           $diff = my_cmp($file,$targetfile);
+       } else {
+           print "#$file and $targetfile differ\n" if $verbose>1;
+           $diff++;
+       }
+
+       next unless $diff;
+       if ($nonono) {
+           if ($verbose) {
+               $Inc_uninstall_warn_handler ||= new ExtUtils::Install::Warn;
+               $libdir =~ s|^\./|| ; # That's just cosmetics, no need to port. It looks prettier.
+               $Inc_uninstall_warn_handler->add("$libdir/$file",$targetfile);
+           }
+           # if not verbose, we just say nothing
+       } else {
+           print "Unlinking $targetfile (shadowing?)\n";
+           forceunlink($targetfile);
+       }
+    }
 }
 
 sub pm_to_blib {
@@ -181,6 +236,8 @@ sub pm_to_blib {
     use File::Copy qw(copy);
     use File::Path qw(mkpath);
     use AutoSplit;
+    # my $my_req = $self->catfile(qw(auto ExtUtils Install forceunlink.al));
+    # require $my_req; # Hairy, but for the first
 
     my $umask = umask 0022 unless $Is_VMS;
     mkpath($autodir,0,0755);
@@ -191,12 +248,12 @@ sub pm_to_blib {
            next;
        }
        if (-f $fromto->{$_}){
-           unlink $fromto->{$_} or Carp::carp("Couldn't unlink $fromto->{$_}");
+           forceunlink($fromto->{$_});
        } else {
            mkpath(dirname($fromto->{$_}),0,0755);
        }
        copy($_,$fromto->{$_});
-       chmod((stat)[2],$fromto->{$_});
+       chmod(0444 | ( (stat)[2] & 0111 ? 0111 : 0 ),$fromto->{$_});
        print "cp $_ $fromto->{$_}\n";
        next unless /\.pm$/;
        autosplit($fromto->{$_},$autodir);
@@ -204,6 +261,30 @@ sub pm_to_blib {
     umask $umask unless $Is_VMS;
 }
 
+package ExtUtils::Install::Warn;
+
+sub new { bless {}, shift }
+
+sub add {
+    my($self,$file,$targetfile) = @_;
+    push @{$self->{$file}}, $targetfile;
+}
+
+sub DESTROY {
+    my $self = shift;
+    my($file,$i,$plural);
+    foreach $file (sort keys %$self) {
+       $plural = @{$self->{$file}} > 1 ? "s" : "";
+       print "## Differing version$plural of $file found. You might like to\n";
+       for (0..$#{$self->{$file}}) {
+           print "rm ", $self->{$file}[$_], "\n";
+           $i++;
+       }
+    }
+    $plural = $i>1 ? "all those files" : "this file";
+    print "## Running 'make install UNINST=1' will unlink $plural for you.\n";
+}
+
 1;
 
 __END__
index 1064cb1..77aa831 100644 (file)
@@ -2,6 +2,8 @@ package ExtUtils::Liblist;
 
 # Broken out of MakeMaker from version 4.11
 
+$ExtUtils::Liblist::VERSION = substr q$Revision: 1.19 $, 10;
+
 use Config;
 use Cwd 'cwd';
 use File::Basename;
@@ -10,7 +12,7 @@ my $Config_libext = $Config{lib_ext} || ".a";
 
 sub ext {
     my($self,$potential_libs, $Verbose) = @_;
-    if ($^O eq 'os2' and $Config{libs}) { 
+    if ($^O =~ 'os2' and $Config{libs}) { 
        # Dynamic libraries are not transitive, so we may need including
        # the libraries linked against perl.dll again.
 
@@ -45,9 +47,9 @@ sub ext {
                        if $Verbose;
                next;
            }
-           if ($thislib !~ m|^/|) {
+           unless ($self->file_name_is_absolute($thislib)) {
              print STDOUT "Warning: $ptype$thislib changed to $ptype$pwd/$thislib\n";
-             $thislib = "$pwd/$thislib";
+             $thislib = $self->catdir($pwd,$thislib);
            }
            push(@searchpath, $thislib);
            push(@extralibs,  "$ptype$thislib");
index 7b5b173..34cf76e 100644 (file)
@@ -1,32 +1,23 @@
 package ExtUtils::MM_Unix;
 
-# $Id: MM_Unix.pm,v 1.14 1996/02/29 07:59:10 k Exp $
-
-                                                   # Loading Time cumulated
-require Exporter;                                          # 0.28          0.28
-use Config;                                        # 0.37          0.38
-use File::Basename qw(basename dirname fileparse);  # 0.47          0.48
-use DirHandle;                                     # 0.37          0.58
-# use FileHandle ();                               # 1.28   !!!!   1.46
-
-# And another benchmark. I have deleted MakeMaker completely from the perl installation
-# and deleted blib and pm_to_blib, the timestamp file.
-
-# MM_Unix with Selfloader:
-# perl Makefile.PL  4.34s user 0.57s system 84% cpu 5.844 total
-# make  14.77s user 3.16s system 78% cpu 22.698 total
-
-# MM_Unix with my own autoloader
-# perl Makefile.PL  3.82s user 0.55s system 73% cpu 5.920 total
-# make  14.70s user 3.27s system 82% cpu 21.714 total
-
+$VERSION = substr q$Revision: 1.101 $, 10;
+# $Id: MM_Unix.pm,v 1.101 1996/06/23 20:51:18 k Exp k $
 
+require Exporter;
+use Config;
+use File::Basename qw(basename dirname fileparse);
+use DirHandle;
 
 Exporter::import('ExtUtils::MakeMaker',
        qw( $Verbose &neatvalue));
 
-$Is_OS2 = $^O eq 'os2';
-$Is_VMS = $^O eq 'VMS';
+$Is_OS2 = $^O =~ m|^os/?2$|i;
+$Is_Mac = $^O eq "MacOS";
+
+if ($Is_VMS = $^O eq 'VMS') {
+    require VMS::Filespec;
+    import VMS::Filespec qw( &vmsify );
+}
 
 =head1 NAME
 
@@ -64,7 +55,7 @@ The following description of methods is still under
 development. Please refer to the code for not suitably documented
 sections and complain loudly to the makemaker mailing list.
 
-Not all of the methos below are overridable in a
+Not all of the methods below are overridable in a
 Makefile.PL. Overridable methods are marked as (o). All methods are
 overridable by a platform specific MM_*.pm file (See
 L<ExtUtils::MM_VMS>) and L<ExtUtils::MM_OS2>).
@@ -73,1864 +64,1792 @@ L<ExtUtils::MM_VMS>) and L<ExtUtils::MM_OS2>).
 
 =over 2
 
+=item canonpath
+
+No physical check on the filesystem, but a logical cleanup of a
+path. On UNIX eliminated successive slashes and successive "/.".
+
+=cut
+
+sub canonpath {
+    my($self,$path) = @_;
+    $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;
+}
+
 =item catdir
 
 Concatenate two or more directory names to form a complete path ending
-with a directory
+with a directory. But remove the trailing slash from the resulting
+string, because it doesn't look good, isn't necessary and confuses
+OS2. Of course, if this is the root directory, don't cut off the
+trailing slash :-)
 
 =cut
 
 # ';
 
-sub catdir  {
+sub catdir {
     shift;
-    my $result = join('/',@_);
-    $result =~ s:/(\./)+:/:g;
-    $result =~ s:/+:/:g;
-    $result =~ s:/$::;
+    my @args = @_;
+    for (@args) {
+       # append a slash to each argument unless it has one there
+       $_ .= "/" unless substr($_,length($_)-1,1) eq "/";
+    }
+    my $result = join('', @args);
+    # remove a trailing slash unless we are root
+    substr($result,length($result)-1,1) = ""
+       if length($result) > 1 && substr($result,length($result)-1,1) eq "/";
     $result;
 }
 
 =item catfile
 
-Concatenate two or more directory names and a filename to form a
+Concatenate one or more directory names and a filename to form a
 complete path ending with a filename
 
 =cut
 
 sub catfile {
-    shift;
-    my $result = join('/',@_);
-    $result =~ s:/(\./)+:/:g;
-    $result =~ s:/+:/:g;
-    $result;
+    my $self = shift @_;
+    my $file = pop @_;
+    return $file unless @_;
+    my $dir = $self->catdir(@_);
+    for ($dir) {
+       $_ .= "/" unless substr($_,length($_)-1,1) eq "/";
+    }
+    return $dir.$file;
 }
 
-sub ExtUtils::MM_Unix::guess_name ;
-sub ExtUtils::MM_Unix::init_main ;
-sub ExtUtils::MM_Unix::init_dirscan ;
-sub ExtUtils::MM_Unix::init_others ;
-sub ExtUtils::MM_Unix::find_perl ;
-sub ExtUtils::MM_Unix::post_initialize ;
+=item curdir
+
+Returns a string representing of the current directory.  "." on UNIX.
+
+=cut
+
+sub curdir {
+    return "." ;
+}
+
+=item rootdir
+
+Returns a string representing of the root directory.  "/" on UNIX.
+
+=cut
+
+sub rootdir {
+    return "/";
+}
+
+=item updir
+
+Returns a string representing of the parent directory.  ".." on UNIX.
+
+=cut
+
+sub updir {
+    return "..";
+}
+
+sub ExtUtils::MM_Unix::c_o ;
+sub ExtUtils::MM_Unix::clean ;
+sub ExtUtils::MM_Unix::const_cccmd ;
 sub ExtUtils::MM_Unix::const_config ;
-sub ExtUtils::MM_Unix::constants ;
 sub ExtUtils::MM_Unix::const_loadlibs ;
-sub ExtUtils::MM_Unix::const_cccmd ;
-sub ExtUtils::MM_Unix::tool_autosplit ;
-sub ExtUtils::MM_Unix::tool_xsubpp ;
-sub ExtUtils::MM_Unix::xsubpp_version ;
-sub ExtUtils::MM_Unix::tools_other ;
-sub ExtUtils::MM_Unix::dist ;
-sub ExtUtils::MM_Unix::macro ;
+sub ExtUtils::MM_Unix::constants ;
 sub ExtUtils::MM_Unix::depend ;
-sub ExtUtils::MM_Unix::post_constants ;
-sub ExtUtils::MM_Unix::pasthru ;
-sub ExtUtils::MM_Unix::c_o ;
-sub ExtUtils::MM_Unix::xs_c ;
-sub ExtUtils::MM_Unix::xs_o ;
-sub ExtUtils::MM_Unix::top_targets ;
-sub ExtUtils::MM_Unix::linkext ;
+sub ExtUtils::MM_Unix::dir_target ;
+sub ExtUtils::MM_Unix::dist ;
+sub ExtUtils::MM_Unix::dist_basics ;
+sub ExtUtils::MM_Unix::dist_ci ;
+sub ExtUtils::MM_Unix::dist_core ;
+sub ExtUtils::MM_Unix::dist_dir ;
+sub ExtUtils::MM_Unix::dist_test ;
 sub ExtUtils::MM_Unix::dlsyms ;
 sub ExtUtils::MM_Unix::dynamic ;
 sub ExtUtils::MM_Unix::dynamic_bs ;
 sub ExtUtils::MM_Unix::dynamic_lib ;
-sub ExtUtils::MM_Unix::static ;
-sub ExtUtils::MM_Unix::static_lib ;
-#sub ExtUtils::MM_Unix::installpm ;
-#sub ExtUtils::MM_Unix::installpm_x ;
-sub ExtUtils::MM_Unix::pm_to_blib ;
+sub ExtUtils::MM_Unix::exescan ;
+sub ExtUtils::MM_Unix::extliblist ;
+sub ExtUtils::MM_Unix::file_name_is_absolute ;
+sub ExtUtils::MM_Unix::find_perl ;
+sub ExtUtils::MM_Unix::force ;
+sub ExtUtils::MM_Unix::guess_name ;
+sub ExtUtils::MM_Unix::has_link_code ;
+sub ExtUtils::MM_Unix::init_dirscan ;
+sub ExtUtils::MM_Unix::init_main ;
+sub ExtUtils::MM_Unix::init_others ;
+sub ExtUtils::MM_Unix::install ;
+sub ExtUtils::MM_Unix::installbin ;
+sub ExtUtils::MM_Unix::libscan ;
+sub ExtUtils::MM_Unix::linkext ;
+sub ExtUtils::MM_Unix::lsdir ;
+sub ExtUtils::MM_Unix::macro ;
+sub ExtUtils::MM_Unix::makeaperl ;
+sub ExtUtils::MM_Unix::makefile ;
 sub ExtUtils::MM_Unix::manifypods ;
+sub ExtUtils::MM_Unix::maybe_command ;
+sub ExtUtils::MM_Unix::maybe_command_in_dirs ;
+sub ExtUtils::MM_Unix::needs_linking ;
+sub ExtUtils::MM_Unix::nicetext ;
+sub ExtUtils::MM_Unix::parse_version ;
+sub ExtUtils::MM_Unix::pasthru ;
+sub ExtUtils::MM_Unix::path ;
+sub ExtUtils::MM_Unix::perl_script ;
+sub ExtUtils::MM_Unix::perldepend ;
+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::prefixify ;
 sub ExtUtils::MM_Unix::processPL ;
-sub ExtUtils::MM_Unix::installbin ;
-sub ExtUtils::MM_Unix::subdirs ;
-sub ExtUtils::MM_Unix::subdir_x ;
-sub ExtUtils::MM_Unix::clean ;
 sub ExtUtils::MM_Unix::realclean ;
-sub ExtUtils::MM_Unix::dist_basics ;
-sub ExtUtils::MM_Unix::dist_core ;
-sub ExtUtils::MM_Unix::dist_dir ;
-sub ExtUtils::MM_Unix::dist_test ;
-sub ExtUtils::MM_Unix::dist_ci ;
-sub ExtUtils::MM_Unix::install ;
-sub ExtUtils::MM_Unix::force ;
-sub ExtUtils::MM_Unix::perldepend ;
-sub ExtUtils::MM_Unix::makefile ;
+sub ExtUtils::MM_Unix::replace_manpage_separator ;
+sub ExtUtils::MM_Unix::static ;
+sub ExtUtils::MM_Unix::static_lib ;
 sub ExtUtils::MM_Unix::staticmake ;
+sub ExtUtils::MM_Unix::subdir_x ;
+sub ExtUtils::MM_Unix::subdirs ;
 sub ExtUtils::MM_Unix::test ;
 sub ExtUtils::MM_Unix::test_via_harness ;
 sub ExtUtils::MM_Unix::test_via_script ;
-sub ExtUtils::MM_Unix::postamble ;
-sub ExtUtils::MM_Unix::makeaperl ;
-sub ExtUtils::MM_Unix::extliblist ;
-sub ExtUtils::MM_Unix::dir_target ;
-sub ExtUtils::MM_Unix::needs_linking ;
-sub ExtUtils::MM_Unix::has_link_code ;
+sub ExtUtils::MM_Unix::tool_autosplit ;
+sub ExtUtils::MM_Unix::tool_xsubpp ;
+sub ExtUtils::MM_Unix::tools_other ;
+sub ExtUtils::MM_Unix::top_targets ;
 sub ExtUtils::MM_Unix::writedoc ;
-sub ExtUtils::MM_Unix::perl_script ;
-sub ExtUtils::MM_Unix::maybe_command ;
-sub ExtUtils::MM_Unix::maybe_command_in_dirs ;
-sub ExtUtils::MM_Unix::prefixify ;
-sub ExtUtils::MM_Unix::file_name_is_absolute ;
-sub ExtUtils::MM_Unix::replace_manpage_separator ;
-sub ExtUtils::MM_Unix::path ;
-sub ExtUtils::MM_Unix::lsdir ;
-sub ExtUtils::MM_Unix::exescan ;
-sub ExtUtils::MM_Unix::libscan ;
-sub ExtUtils::MM_Unix::nicetext ;
+sub ExtUtils::MM_Unix::xs_c ;
+sub ExtUtils::MM_Unix::xs_o ;
+sub ExtUtils::MM_Unix::xsubpp_version ;
 
 package ExtUtils::MM_Unix;
 
-use SelfLoader;
-#sub AUTOLOAD {
-#    my $code;
-#    if (defined fileno(DATA)) {
-#      while (<DATA>) {
-#          last if /^__END__/;
-#          $code .= $_;
-#      }
-#      close DATA;
-#      eval $code;
-#      if ($@) {
-#          $@ =~ s/ at .*\n//;
-#          Carp::croak $@;
-#      }
-#    } else {
-#      warn "AUTOLOAD called unexpectedly for $AUTOLOAD"; 
-#    }
-#    defined(&$AUTOLOAD) or die "Myloader inconsistency error";
-#    goto &$AUTOLOAD;
-#}
-
-
+#use SelfLoader;
 
 1;
-__DATA__
+#__DATA__
 
 =head2 SelfLoaded methods
 
-=item nicetext
-
-misnamed method (will have to be changed). The MM_Unix method just
-returns the argument without further processing.
+=item c_o (o)
 
-On VMS used to insure that colons marking targets are preceded by
-space - most Unix Makes don't need this, but it's necessary under VMS
-to distinguish the target delimiter from a colon appearing as part of
-a filespec.
+Defines the suffix rules to compile different flavors of C files to
+object files.
 
 =cut
 
-sub nicetext {
-    my($self,$text) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    $text;
-}
+sub c_o {
+# --- Translation Sections ---
 
-=item libscan (o)
+    my($self) = shift;
+    return '' unless $self->needs_linking();
+    my(@m);
+    push @m, '
+.c$(OBJ_EXT):
+       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
 
-Takes a path to a file that is found by init_dirscan and returns false
-if we don't want to include this file in the library. Mainly used to
-exclude RCS, CVS, and SCCS directories from installation.
+.C$(OBJ_EXT):
+       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.C
 
-=cut
+.cpp$(OBJ_EXT):
+       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cpp
 
-# ';
+.cxx$(OBJ_EXT):
+       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cxx
 
-sub libscan {
-    my($self,$path) = @_;
-    return '' if $path =~ m:/(RCS|CVS|SCCS)/: ;
-    $path;
+.cc$(OBJ_EXT):
+       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cc
+';
+    join "", @m;
 }
 
-=item exescan
+=item cflags (o)
 
-Deprecated method. Use libscan instead.
+Does very much the same as the cflags script in the perl
+distribution. It doesn't return the whole compiler command line, but
+initializes all of its parts. The const_cccmd method then actually
+returns the definition of the CCCMD macro which uses these parts.
 
 =cut
 
-sub exescan {
-    my($self,$path) = @_;
-    $path;
-}
-
-=item lsdir
+#'
 
-Takes as arguments a directory name and a regular expression. Returns
-all entries in the directory that match the regular expression.
+sub cflags {
+    my($self,$libperl)=@_;
+    return $self->{CFLAGS} if $self->{CFLAGS};
+    return '' unless $self->needs_linking();
 
-=cut
+    my($prog, $uc, $perltype, %cflags);
+    $libperl ||= $self->{LIBPERL_A} || "libperl$self->{LIB_EXT}" ;
+    $libperl =~ s/\.\$\(A\)$/$self->{LIB_EXT}/;
 
-sub lsdir {
-    my($self) = shift;
-    my($dir, $regex) = @_;
-    my(@ls);
-    my $dh = new DirHandle;
-    $dh->open($dir || ".") or return ();
-    @ls = $dh->read;
-    $dh->close;
-    @ls = grep(/$regex/, @ls) if $regex;
-    @ls;
-}
+    @cflags{qw(cc ccflags optimize large split shellflags)}
+       = @Config{qw(cc ccflags optimize large split shellflags)};
+    my($optdebug) = "";
 
-=item path
+    $cflags{shellflags} ||= '';
 
-Takes no argument, returns the environment variable PATH as an array.
+    my(%map) =  (
+               D =>   '-DDEBUGGING',
+               E =>   '-DEMBED',
+               DE =>  '-DDEBUGGING -DEMBED',
+               M =>   '-DEMBED -DMULTIPLICITY',
+               DM =>  '-DDEBUGGING -DEMBED -DMULTIPLICITY',
+               );
 
-=cut
+    if ($libperl =~ /libperl(\w*)\Q$self->{LIB_EXT}/){
+       $uc = uc($1);
+    } else {
+       $uc = ""; # avoid warning
+    }
+    $perltype = $map{$uc} ? $map{$uc} : "";
 
-sub path {
-    my($self) = @_;
-    my $path_sep = $Is_OS2 ? ";" : ":";
-    my $path = $ENV{PATH};
-    $path =~ s:\\:/:g if $Is_OS2;
-    my @path = split $path_sep, $path;
-}
+    if ($uc =~ /^D/) {
+       $optdebug = "-g";
+    }
 
-=item replace_manpage_separator
 
-Takes the name of a package, which may be a nested package, in the
-form Foo/Bar and replaces the slash with C<::>. Returns the replacement.
-
-=cut
-
-sub replace_manpage_separator {
-    my($self,$man) = @_;
-    $man =~ s,/+,::,g;
-    $man;
-}
+    my($name);
+    ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
+    if ($prog = $Config::Config{$name}) {
+       # Expand hints for this extension via the shell
+       print STDOUT "Processing $name hint:\n" if $Verbose;
+       my(@o)=`cc=\"$cflags{cc}\"
+         ccflags=\"$cflags{ccflags}\"
+         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){
+           chomp $line;
+           if ($line =~ /(.*?)=\s*(.*)\s*$/){
+               $cflags{$1} = $2;
+               print STDOUT "  $1 = $2\n" if $Verbose;
+           } else {
+               print STDOUT "Unrecognised result from hint: '$line'\n";
+           }
+       }
+    }
 
-=item file_name_is_absolute
+    if ($optdebug) {
+       $cflags{optimize} = $optdebug;
+    }
 
-Takes as argument a path and returns true, it it is an absolute path.
+    for (qw(ccflags optimize perltype large split)) {
+       $cflags{$_} =~ s/^\s+//;
+       $cflags{$_} =~ s/\s+/ /g;
+       $cflags{$_} =~ s/\s+$//;
+       $self->{uc $_} ||= $cflags{$_}
+    }
 
-=cut
+    return $self->{CFLAGS} = qq{
+CCFLAGS = $self->{CCFLAGS}
+OPTIMIZE = $self->{OPTIMIZE}
+PERLTYPE = $self->{PERLTYPE}
+LARGE = $self->{LARGE}
+SPLIT = $self->{SPLIT}
+};
 
-sub file_name_is_absolute {
-    my($self,$file) = @_;
-    $file =~ m:^/: ;
 }
 
-=item prefixify
-
-Check a path variable in $self from %Config, if it contains a prefix,
-and replace it with another one.
+=item clean (o)
 
-Takes as arguments an attribute name, a search prefix and a
-replacement prefix. Changes the attribute in the object.
+Defines the clean target.
 
 =cut
 
-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/;
-}
-
-=item maybe_command_in_dirs
-
-method under development. Not yet used. Ask Ilya :-)
+sub clean {
+# --- Cleanup and Distribution Sections ---
 
-=cut
+    my($self, %attribs) = @_;
+    my(@m,$dir);
+    push(@m, '
+# Delete temporary files but do not touch installed files. We don\'t delete
+# the Makefile here so a later make realclean still has a makefile to use.
 
-sub maybe_command_in_dirs {    # $ver is optional argument if looking for perl
-# Ilya's suggestion. Not yet used, want to understand it first, but at least the code is here
-    my($self, $names, $dirs, $trace, $ver) = @_;
-    my($name, $dir);
-    foreach $dir (@$dirs){
-       next unless defined $dir; # $self->{PERL_SRC} may be undefined
-       foreach $name (@$names){
-           my($abs,$tryabs);
-           if ($self->file_name_is_absolute($name)) {
-               $abs = $name;
-           } elsif ($name =~ m|/|) {
-               $abs = $self->catfile(".", $name); # not absolute
-           } else {
-               $abs = $self->catfile($dir, $name);
-           }
-           print "Checking $abs for $name\n" if ($trace >= 2);
-           next unless $tryabs = $self->maybe_command($abs);
-           print "Substituting $tryabs instead of $abs\n"
-               if ($trace >= 2 and $tryabs ne $abs);
-           $abs = $tryabs;
-           if (defined $ver) {
-               print "Executing $abs\n" if ($trace >= 2);
-               if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
-                   print "Using PERL=$abs\n" if $trace;
-                   return $abs;
-               }
-           } else { # Do not look for perl
-               return $abs;
-           }
-       }
+clean ::
+');
+    # clean subdirectories first
+    for $dir (@{$self->{DIR}}) {
+       push @m, "\t-cd $dir && test -f $self->{MAKEFILE} && \$(MAKE) clean\n";
     }
+
+    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
+                        $(BOOTSTRAP) $(BASEEXT).bso $(BASEEXT).def
+                        $(BASEEXT).exp
+                       ]);
+    push @m, "\t-$self->{RM_RF} @otherfiles\n";
+    # See realclean and ext/utils/make_ext for usage of Makefile.old
+    push(@m,
+        "\t-$self->{MV} $self->{MAKEFILE} $self->{MAKEFILE}.old 2>/dev/null\n");
+    push(@m,
+        "\t$attribs{POSTOP}\n")   if $attribs{POSTOP};
+    join("", @m);
 }
 
-=item maybe_command
+=item const_cccmd (o)
 
-Returns true, if the argument is likely to be a command.
+Returns the full compiler call for C programs and stores the
+definition in CONST_CCCMD.
 
 =cut
 
-sub maybe_command {
-    my($self,$file) = @_;
-    return $file if -x $file && ! -d $file;
-    return;
+sub const_cccmd {
+    my($self,$libperl)=@_;
+    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) $(DEFINE_VERSION) \\
+       $(XS_DEFINE_VERSION)};
 }
 
-=item perl_script
+=item const_config (o)
 
-Returns true, if the argument is likely to be a perl script. On
-MM_Unix this is true for any ordinary, readable file.
+Defines a couple of constants in the Makefile that are imported from
+%Config.
 
 =cut
 
-sub perl_script {
-    my($self,$file) = @_;
-    return 1 if -r $file && ! -d $file;
-    return;
+sub const_config {
+# --- Constants Sections ---
+
+    my($self) = shift;
+    my(@m,$m);
+    push(@m,"\n# These definitions are from config.sh (via $INC{'Config.pm'})\n");
+    push(@m,"\n# They may have been overridden via Makefile.PL or on the command line\n");
+    my(%once_only);
+    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";
+       $once_only{$m} = 1;
+    }
+    join('', @m);
 }
 
-=item guess_name
+=item const_loadlibs (o)
 
-Guess the name of this package by examining the working directory's
-name. MakeMaker calls this only if the developer has not supplied a
-NAME attribute.
+Defines EXTRALIBS, LDLOADLIBS, BSLOADLIBS, LD_RUN_PATH. See
+L<ExtUtils::Liblist> for details.
 
 =cut
 
-# ';
-
-sub guess_name {
-    my($self) = @_;
-    use Cwd 'cwd';
-    my $name = cwd();
-    $name =~ s:.*/:: unless ($name =~ s:^.*/ext/::);
-    $name =~ s#/#::#g;
-    $name =~  s#[\-_][\d.\-]+$##;  # this is new with MM 5.00
-    $name;
+sub const_loadlibs {
+    my($self) = shift;
+    return "" unless $self->needs_linking;
+    my @m;
+    push @m, qq{
+# $self->{NAME} might depend on some other libraries:
+# See ExtUtils::Liblist for details
+#
+};
+    my($tmp);
+    for $tmp (qw/
+        EXTRALIBS LDLOADLIBS BSLOADLIBS LD_RUN_PATH
+        /) {
+       next unless defined $self->{$tmp};
+       push @m, "$tmp = $self->{$tmp}\n";
+    }
+    return join "", @m;
 }
 
-=item init_main
+=item constants (o)
 
-Initializes NAME, FULLEXT, BASEEXT, ROOTEXT, DLBASE, PERL_SRC,
-PERL_LIB, PERL_ARCHLIB, PERL_INC, INSTALLDIRS, INST_*, INSTALL*,
-PREFIX, CONFIG, AR, AR_STATIC_ARGS, LD, OBJ_EXT, LIB_EXT, MAP_TARGET,
-LIBPERL_A, VERSION_FROM, VERSION, DISTNAME, VERSION_SYM.
+Initializes lots of constants and .SUFFIXES and .PHONY
 
 =cut
 
-sub init_main {
+sub constants {
     my($self) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-
-    # --- Initialize Module Name and Paths
-
-    # NAME    = The perl module name for this extension (eg DBD::Oracle).
-    # FULLEXT = Pathname for extension directory (eg DBD/Oracle).
-    # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
-    # ROOTEXT = Directory part of FULLEXT with leading /.
-    ($self->{FULLEXT} =
-     $self->{NAME}) =~ s!::!/!g ;                           #eg. BSD/Foo/Socket
+    my(@m,$tmp);
 
-    # Copied from DynaLoader:
+    for $tmp (qw/
 
-    my(@modparts) = split(/::/,$self->{NAME});
-    my($modfname) = $modparts[-1];
+             AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION
+             VERSION_SYM XS_VERSION INST_BIN INST_EXE INST_LIB
+             INST_ARCHLIB INST_SCRIPT PREFIX INSTALLDIRS
+             INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB
+             INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
+             PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
+             FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC
+             PERL_INC PERL FULLPERL
 
-    # Some systems have restrictions on files names for DLL's etc.
-    # mod2fname returns appropriate file base name (typically truncated)
-    # It may also edit @modparts if required.
-    if (defined &DynaLoader::mod2fname) {
-        $modfname = &DynaLoader::mod2fname(\@modparts);
-    } elsif ($Is_OS2) {                # Need manual correction if run with miniperl:-(
-        $modfname = substr($modfname, 0, 7) . '_';
+             / ) {
+       next unless defined $self->{$tmp};
+       push @m, "$tmp = $self->{$tmp}\n";
     }
 
+    push @m, qq{
+VERSION_MACRO = VERSION
+DEFINE_VERSION = -D\$(VERSION_MACRO)=\\\"\$(VERSION)\\\"
+XS_VERSION_MACRO = XS_VERSION
+XS_DEFINE_VERSION = -D\$(XS_VERSION_MACRO)=\\\"\$(XS_VERSION)\\\"
+};
 
-    ($self->{BASEEXT} =
-     $self->{NAME}) =~ s!.*::!! ;                           #eg. Socket
-
-    if (defined &DynaLoader::mod2fname or $Is_OS2) {
-       # As of 5.001m, dl_os2 appends '_'
-       $self->{DLBASE} = $modfname;                    #eg. Socket_
-    } else {
-       $self->{DLBASE} = '$(BASEEXT)';
-    }
+    push @m, qq{
+MAKEMAKER = $INC{'ExtUtils/MakeMaker.pm'}
+MM_VERSION = $ExtUtils::MakeMaker::VERSION
+};
 
-    ($self->{ROOTEXT} =
-     $self->{FULLEXT}) =~ s#/?\Q$self->{BASEEXT}\E$## ;      #eg. /BSD/Foo
+    push @m, q{
+# FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
+# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
+# ROOTEXT = Directory part of FULLEXT with leading slash (eg /DBD)  !!! Deprecated from MM 5.32  !!!
+# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
+# DLBASE  = Basename part of dynamic library. May be just equal BASEEXT.
+};
 
-    $self->{ROOTEXT} = ($Is_VMS ? '' : '/') . $self->{ROOTEXT} if $self->{ROOTEXT};
+    for $tmp (qw/
+             FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
+             LDFROM LINKTYPE
+             / ) {
+       next unless defined $self->{$tmp};
+       push @m, "$tmp = $self->{$tmp}\n";
+    }
 
+    push @m, "
+# Handy lists of source code files:
+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}})."
+MAN1PODS = ".join(" \\\n\t", sort keys %{$self->{MAN1PODS}})."
+MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})."
+";
 
-    # --- Initialize PERL_LIB, INST_LIB, PERL_SRC
+    for $tmp (qw/
+             INST_MAN1DIR INSTALLMAN1DIR MAN1EXT INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
+             /) {
+       next unless defined $self->{$tmp};
+       push @m, "$tmp = $self->{$tmp}\n";
+    }
 
-    # *Real* information: where did we get these two from? ...
-    my $inc_config_dir = dirname($INC{'Config.pm'});
-    my $inc_carp_dir   = dirname($INC{'Carp.pm'});
+    push @m, q{
+.NO_CONFIG_REC: Makefile
+} if $ENV{CLEARCASE_ROOT};
 
-    unless ($self->{PERL_SRC}){
-       my($dir);
-       foreach $dir (qw(.. ../.. ../../..)){
-           if ( -f "$dir/config.sh"
-               && -f "$dir/perl.h"
-               && -f "$dir/lib/Exporter.pm") {
-               $self->{PERL_SRC}=$dir ;
-               last;
-           }
-       }
-    }
-    if ($self->{PERL_SRC}){
-       $self->{PERL_LIB}     ||= $self->catdir("$self->{PERL_SRC}","lib");
-       $self->{PERL_ARCHLIB} = $self->{PERL_LIB};
-       $self->{PERL_INC}     = $self->{PERL_SRC};
-       # catch a situation that has occurred a few times in the past:
-       warn <<EOM unless (-s $self->catfile($self->{PERL_SRC},'cflags') or $Is_VMS && -s $self->catfile($self->{PERL_SRC},'perlshr_attr.opt'));
-You cannot build extensions below the perl source tree after executing
-a 'make clean' in the perl source tree.
+    # why not q{} ? -- emacs
+    push @m, qq{
+# work around a famous dec-osf make(1) feature(?):
+makemakerdflt: all
 
-To rebuild extensions distributed with the perl source you should
-simply Configure (to include those extensions) and then build perl as
-normal. After installing perl the source tree can be deleted. It is
-not needed for building extensions by running 'perl Makefile.PL'
-usually without extra arguments.
+.SUFFIXES: .xs .c .C .cpp .cxx .cc \$(OBJ_EXT)
 
-It is recommended that you unpack and build additional extensions away
-from the perl source tree.
-EOM
-    } else {
-       # we should also consider $ENV{PERL5LIB} here
-       $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;
-       die <<EOM unless (-f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h")));
-Error: Unable to locate installed Perl libraries or Perl source code.
+# 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
+# we call false(1) when we rebuild it. So make(1) is not completely wrong when it
+# does so. Our milage may vary.
+# .PRECIOUS: Makefile    # seems to be not necessary anymore
 
-It is recommended that you install perl in a standard location before
-building extensions. You can say:
+.PHONY: all config static dynamic test linkext manifest
 
-    $^X Makefile.PL PERL_SRC=/path/to/perl/source/directory
+# Where is the Config information that we are using/depend on
+CONFIGDEP = \$(PERL_ARCHLIB)/Config.pm \$(PERL_INC)/config.h
+};
 
-if you have not yet installed perl but still want to build this
-extension now.
-(You get this message, because MakeMaker could not find "$perl_h")
-EOM
+    my @parentdir = split(/::/, $self->{PARENT_NAME});
+    push @m, q{
+# Where to put things:
+INST_LIBDIR      = }. $self->catdir('$(INST_LIB)',@parentdir)        .q{
+INST_ARCHLIBDIR  = }. $self->catdir('$(INST_ARCHLIB)',@parentdir)    .q{
 
-#       print STDOUT "Using header files found in $self->{PERL_INC}\n"
-#           if $Verbose && $self->needs_linking();
+INST_AUTODIR     = }. $self->catdir('$(INST_LIB)','auto','$(FULLEXT)')       .q{
+INST_ARCHAUTODIR = }. $self->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)')   .q{
+};
 
+    if ($self->has_link_code()) {
+       push @m, '
+INST_STATIC  = $(INST_ARCHAUTODIR)/$(BASEEXT)$(LIB_EXT)
+INST_DYNAMIC = $(INST_ARCHAUTODIR)/$(DLBASE).$(DLEXT)
+INST_BOOT    = $(INST_ARCHAUTODIR)/$(BASEEXT).bs
+';
+    } else {
+       push @m, '
+INST_STATIC  =
+INST_DYNAMIC =
+INST_BOOT    =
+';
     }
 
-    # We get SITELIBEXP and SITEARCHEXP directly via
-    # Get_from_Config. When we are running standard modules, these
-    # won't matter, we will set INSTALLDIRS to "perl". Otherwise we
-    # set it to "site". I prefer that INSTALLDIRS be set from outside
-    # MakeMaker.
-    $self->{INSTALLDIRS} ||= "site";
-
-    # INST_LIB typically pre-set if building an extension after
-    # perl has been built and installed. Setting INST_LIB allows
-    # you to build directly into, say $Config::Config{privlibexp}.
-    unless ($self->{INST_LIB}){
+    if ($Is_OS2) {
+       $tmp = "$self->{BASEEXT}.def";
+    } else {
+       $tmp = "";
+    }
+    push @m, "
+EXPORT_LIST = $tmp
+";
 
+    if ($Is_OS2) {
+       $tmp = "\$(PERL_INC)/libperl\$(LIB_EXT)";
+    } else {
+       $tmp = "";
+    }
+    push @m, "
+PERL_ARCHIVE = $tmp
+";
 
-       ##### XXXXX We have to change this nonsense
+#    push @m, q{
+#INST_PM = }.join(" \\\n\t", sort values %{$self->{PM}}).q{
+#
+#PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
+#};
 
-       if (defined $self->{PERL_SRC} and $self->{INSTALLDIRS} eq "perl") {
-           $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB};
-       } else {
-           $self->{INST_LIB} = $self->catdir(".","blib","lib");
-       }
-    }
-    $self->{INST_ARCHLIB} ||= $self->catdir(".","blib","arch");
-    $self->{INST_EXE} ||= $self->catdir('.','blib','bin');
+    push @m, q{
+TO_INST_PM = }.join(" \\\n\t", sort keys %{$self->{PM}}).q{
 
-    # The user who requests an installation directory explicitly
-    # should not have to tell us a 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
-    # the found one.
-    # We do the same thing twice: for privlib/archlib and for sitelib/sitearch
-    my($libpair);
-    for $libpair ({l=>"privlib", a=>"archlib"}, {l=>"sitelib", a=>"sitearch"}) {
-       my $lib = "install$libpair->{l}";
-       my $Lib = uc $lib;
-       my $Arch = uc "install$libpair->{a}";
-       if( $self->{$Lib} && ! $self->{$Arch} ){
-           my($ilib) = $Config{$lib};
-           $ilib = VMS::Filespec::unixify($ilib) if $Is_VMS;
+PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
+};
 
-           $self->prefixify($Arch,$ilib,$self->{$Lib});
+    join('',@m);
+}
 
-           unless (-d $self->{$Arch}) {
-               print STDOUT "Directory $self->{$Arch} not found, thusly\n" if $Verbose;
-               $self->{$Arch} = $self->{$Lib};
-           }
-           print STDOUT "Defaulting $Arch to $self->{$Arch}\n" if $Verbose;
-       }
-    }
+=item depend (o)
 
-    # we have to look at the relation between $Config{prefix} and the
-    # requested values. We're going to set the $Config{prefix} part of
-    # all the installation path variables to literally $(PREFIX), so
-    # the user can still say make PREFIX=foo
-    my($prefix) = $Config{'prefix'};
-    $prefix = VMS::Filespec::unixify($prefix) if $Is_VMS;
-    unless ($self->{PREFIX}){
-       $self->{PREFIX} = $prefix;
-    }
-    my($install_variable);
-    for $install_variable (qw/INSTALLPRIVLIB INSTALLARCHLIB INSTALLBIN INSTALLMAN1DIR
-                          INSTALLMAN3DIR INSTALLSITELIB INSTALLSITEARCH/) {
-       $self->prefixify($install_variable,$prefix,q[$(PREFIX)]);
-    }
+Same as macro for the depend attribute.
 
+=cut
 
-    # Now we head at the manpages. Maybe they DO NOT want manpages
-    # installed
-    $self->{INSTALLMAN1DIR} = $Config::Config{installman1dir}
-       unless defined $self->{INSTALLMAN1DIR};
-    unless (defined $self->{INST_MAN1DIR}){
-       if ($self->{INSTALLMAN1DIR} =~ /^(none|\s*)$/){
-           $self->{INST_MAN1DIR} = $self->{INSTALLMAN1DIR};
-       } else {
-           $self->{INST_MAN1DIR} = $self->catdir('.','blib','man1');
-       }
+sub depend {
+    my($self,%attribs) = @_;
+    my(@m,$key,$val);
+    while (($key,$val) = each %attribs){
+       last unless defined $key;
+       push @m, "$key: $val\n";
     }
-    $self->{MAN1EXT} ||= $Config::Config{man1ext};
+    join "", @m;
+}
 
-    $self->{INSTALLMAN3DIR} = $Config::Config{installman3dir}
-       unless defined $self->{INSTALLMAN3DIR};
-    unless (defined $self->{INST_MAN3DIR}){
-       if ($self->{INSTALLMAN3DIR} =~ /^(none|\s*)$/){
-           $self->{INST_MAN3DIR} = $self->{INSTALLMAN3DIR};
-       } else {
-           $self->{INST_MAN3DIR} = $self->catdir('.','blib','man3');
-       }
-    }
-    $self->{MAN3EXT} ||= $Config::Config{man3ext};
+=item dir_target (o)
 
+Takes an array of directories that need to exist and returns a
+Makefile entry for a .exists file in these directories. Returns
+nothing, if the entry has already been processed. We're helpless
+though, if the same directory comes as $(FOO) _and_ as "bar". Both of
+them get an entry, that's why we use "::".
 
-    # Get some stuff out of %Config if we haven't yet done so
-    print STDOUT "CONFIG must be an array ref\n"
-       if ($self->{CONFIG} and ref $self->{CONFIG} ne 'ARRAY');
-    $self->{CONFIG} = [] unless (ref $self->{CONFIG});
-    push(@{$self->{CONFIG}}, @ExtUtils::MakeMaker::Get_from_Config);
-    push(@{$self->{CONFIG}}, 'shellflags') if $Config::Config{shellflags};
-    my(%once_only,$m);
-    foreach $m (@{$self->{CONFIG}}){
-       next if $once_only{$m};
-       print STDOUT "CONFIG key '$m' does not exist in Config.pm\n"
-               unless exists $Config::Config{$m};
-       $self->{uc $m} ||= $Config::Config{$m};
-       $once_only{$m} = 1;
-    }
+=cut
 
-# This is too dangerous:
-#    if ($^O eq "next") {
-#      $self->{AR} = "libtool";
-#      $self->{AR_STATIC_ARGS} = "-o";
-#    }
-# But I leave it as a placeholder
+sub dir_target {
+# --- Make-Directories section (internal method) ---
+# dir_target(@array) returns a Makefile entry for the file .exists in each
+# named directory. Returns nothing, if the entry has already been processed.
+# We're helpless though, if the same directory comes as $(FOO) _and_ as "bar".
+# Both of them get an entry, that's why we use "::". I chose '$(PERL)' as the
+# prerequisite, because there has to be one, something that doesn't change
+# too often :)
 
-    $self->{AR_STATIC_ARGS} ||= "cr";
+    my($self,@dirs) = @_;
+    my(@m,$dir);
+    foreach $dir (@dirs) {
+       my($src) = $self->catfile($self->{PERL_INC},'perl.h');
+       my($targ) = $self->catfile($dir,'.exists');
+       my($targdir) = $targ;       # Necessary because catfile may have
+       $targdir =~ s:/?.exists$::; # adapted syntax of $dir to target OS
+       next if $self->{DIR_TARGET}{$self}{$targdir}++;
+       push @m, qq{
+$targ :: $src
+       $self->{NOECHO}\$(MKPATH) $targdir
+       $self->{NOECHO}\$(EQUALIZE_TIMESTAMP) $src $targ
+};
+       push(@m,qq{
+       -$self->{NOECHO}\$(CHMOD) 755 $targdir
+}) unless $Is_VMS;
+    }
+    join "", @m;
+}
 
-    # These should never be needed
-    $self->{LD} ||= 'ld';
-    $self->{OBJ_EXT} ||= '.o';
-    $self->{LIB_EXT} ||= '.a';
+=item dist (o)
 
-    $self->{MAP_TARGET} ||= "perl";
+Defines a lot of macros for distribution support.
 
-    $self->{LIBPERL_A} ||= "libperl$self->{LIB_EXT}";
+=cut
 
-    # make a simple check if we find Exporter
-    warn "Warning: PERL_LIB ($self->{PERL_LIB}) seems not to be a perl library directory
-        (Exporter.pm not found)"
-       unless -f $self->catfile("$self->{PERL_LIB}","Exporter.pm") ||
-        $self->{NAME} eq "ExtUtils::MakeMaker";
+sub dist {
+    my($self, %attribs) = @_;
 
-    # Determine VERSION and VERSION_FROM
-    ($self->{DISTNAME}=$self->{NAME}) =~ s#(::)#-#g unless $self->{DISTNAME};
-    if ($self->{VERSION_FROM}){
-#      use FileHandle ();
-#      my $fh = new FileHandle;
-       local *FH;
-#      $fh->open($self->{VERSION_FROM}) or die "Could not open '$self->{VERSION_FROM}' (attribute VERSION_FROM): $!";
-       open(FH,$self->{VERSION_FROM}) or
-           die "Could not open '$self->{VERSION_FROM}' (attribute VERSION_FROM): $!";
-#      while (<$fh>) {
-       while (<FH>) {
-           chop;
-           next unless /\$([\w:]*\bVERSION)\b.*=/;
-           local $ExtUtils::MakeMaker::module_version_variable = $1;
-           my($eval) = "$_;";
-           eval $eval;
-           die "Could not eval '$eval': $@" if $@;
-           if ($self->{VERSION} = $ {$ExtUtils::MakeMaker::module_version_variable}){
-               print "$self->{NAME} VERSION is $self->{VERSION} (from $self->{VERSION_FROM})\n" if $Verbose;
-           } else {
-               # XXX this should probably croak
-               print "WARNING: Setting VERSION via file '$self->{VERSION_FROM}' failed\n";
-           }
-           last;
-       }
-#      close $fh;
-       close FH;
-    }
-
-    # if your FOO.pm says
-    #  $VERSION = substr(q$Revision: 1.14 $, 10);
-    # then MM says something like
-    #  -DXS_VERSION=\"n.nn \"
-    if ($self->{VERSION}) {
-       $self->{VERSION} =~ s/^\s+//;
-       $self->{VERSION} =~ s/\s+$//;
-    }
-
-    $self->{VERSION} = "0.10" unless $self->{VERSION};
-    ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
-
-
-    # Graham Barr and Paul Marquess had some ideas how to ensure
-    # version compatibility between the *.pm file and the
-    # corresponding *.xs file. The bottomline was, that we need an
-    # XS_VERSION macro that defaults to VERSION:
-    $self->{XS_VERSION} ||= $self->{VERSION};
+    my(@m);
+    # VERSION should be sanitised before use as a file name
+    my($version)  = $attribs{VERSION}  || '$(VERSION)';
+    my($name)     = $attribs{NAME}     || '$(DISTNAME)';
+    my($tar)      = $attribs{TAR}      || 'tar';        # eg /usr/bin/gnutar
+    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($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
 
-    # --- Initialize Perl Binary Locations
+    my($to_unix)  = $attribs{TO_UNIX} || ($Is_OS2
+                                         ? "$self->{NOECHO}"
+                                         . 'test -f tmp.zip && $(RM) tmp.zip;'
+                                         . ' $(ZIP) -ll -mr tmp.zip $(DISTVNAME) && unzip -o tmp.zip && $(RM) tmp.zip'
+                                         : "$self->{NOECHO}\$(NOOP)");
 
-    # Find Perl 5. The only contract here is that both 'PERL' and 'FULLPERL'
-    # will be working versions of perl 5. miniperl has priority over perl
-    # for PERL to ensure that $(PERL) is usable while building ./ext/*
-    my ($component,@defpath);
-    foreach $component ($self->{PERL_SRC}, $self->path(), $Config::Config{binexp}) {
-       push @defpath, $component if defined $component;
-    }
-    $self->{PERL} =
-        $self->find_perl(5.0, [ $^X, 'miniperl','perl','perl5',"perl$]" ],
-           \@defpath, $Verbose ) unless ($self->{PERL});
-    # don't check if perl is executable, maybe they have decided to
-    # supply switches with perl
+    my($ci)       = $attribs{CI}       || 'ci -u';
+    my($rcs_label)= $attribs{RCS_LABEL}|| 'rcs -Nv$(VERSION_SYM): -q';
+    my($dist_cp)  = $attribs{DIST_CP}  || 'best';
+    my($dist_default) = $attribs{DIST_DEFAULT} || 'tardist';
 
-    # Define 'FULLPERL' to be a non-miniperl (used in test: target)
-    ($self->{FULLPERL} = $self->{PERL}) =~ s/miniperl/perl/i
-       unless ($self->{FULLPERL});
+    push @m, "
+DISTVNAME = ${name}-$version
+TAR  = $tar
+TARFLAGS = $tarflags
+ZIP  = $zip
+ZIPFLAGS = $zipflags
+COMPRESS = $compress
+SUFFIX = $suffix
+SHAR = $shar
+PREOP = $preop
+POSTOP = $postop
+TO_UNIX = $to_unix
+CI = $ci
+RCS_LABEL = $rcs_label
+DIST_CP = $dist_cp
+DIST_DEFAULT = $dist_default
+";
+    join "", @m;
 }
 
-=item init_dirscan
+=item dist_basics (o)
 
-Initializes DIR, XS, PM, C, O_FILES, H, PL_FILES, MAN*PODS, EXE_FILES.
+Defines the targets distclean, distcheck, skipcheck, manifest.
 
 =cut
 
-sub init_dirscan {     # --- File and Directory Lists (.xs .pm .pod etc)
-    my($self) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    my($name, %dir, %xs, %c, %h, %ignore, %pl_files, %manifypods);
-    local(%pm); #the sub in find() has to see this hash
-    $ignore{'test.pl'} = 1;
-    $ignore{'makefile.pl'} = 1 if $Is_VMS;
-    foreach $name ($self->lsdir(".")){
-       next if ($name =~ /^\./ or $ignore{$name});
-       next unless $self->libscan($name);
-       if (-d $name){
-           $dir{$name} = $name if (-f "$name/Makefile.PL");
-       } elsif ($name =~ /\.xs$/){
-           my($c); ($c = $name) =~ s/\.xs$/.c/;
-           $xs{$name} = $c;
-           $c{$c} = 1;
-       } elsif ($name =~ /\.c(pp|xx|c)?$/i){  # .c .C .cpp .cxx .cc
-           $c{$name} = 1
-               unless $name =~ m/perlmain\.c/; # See MAP_TARGET
-       } elsif ($name =~ /\.h$/i){
-           $h{$name} = 1;
-       } elsif ($name =~ /\.(p[ml]|pod)$/){
-           $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name);
-       } elsif ($name =~ /\.PL$/ && $name ne "Makefile.PL") {
-           ($pl_files{$name} = $name) =~ s/\.PL$// ;
-       } elsif ($Is_VMS && $name =~ /\.pl$/ && $name ne 'makefile.pl' &&
-                $name ne 'test.pl') {  # case-insensitive filesystem
-           ($pl_files{$name} = $name) =~ s/\.pl$// ;
-       }
-    }
-
-    # Some larger extensions often wish to install a number of *.pm/pl
-    # files into the library in various locations.
-
-    # The attribute PMLIBDIRS holds an array reference which lists
-    # subdirectories which we should search for library files to
-    # install. PMLIBDIRS defaults to [ 'lib', $self->{BASEEXT} ].  We
-    # recursively search through the named directories (skipping any
-    # which don't exist or contain Makefile.PL files).
-
-    # For each *.pm or *.pl file found $self->libscan() is called with
-    # the default installation path in $_[1]. The return value of
-    # libscan defines the actual installation location.  The default
-    # libscan function simply returns the path.  The file is skipped
-    # if libscan returns false.
-
-    # The default installation location passed to libscan in $_[1] is:
-    #
-    #  ./*.pm          => $(INST_LIBDIR)/*.pm
-    #  ./xyz/...       => $(INST_LIBDIR)/xyz/...
-    #  ./lib/...       => $(INST_LIB)/...
-    #
-    # In this way the 'lib' directory is seen as the root of the actual
-    # perl library whereas the others are relative to INST_LIBDIR
-    # (which includes ROOTEXT). This is a subtle distinction but one
-    # that's important for nested modules.
-
-    $self->{PMLIBDIRS} = ['lib', $self->{BASEEXT}]
-       unless $self->{PMLIBDIRS};
-
-    #only existing directories that aren't in $dir are allowed
-
-    # Avoid $_ wherever possible:
-    # @{$self->{PMLIBDIRS}} = grep -d && !$dir{$_}, @{$self->{PMLIBDIRS}};
-    my (@pmlibdirs) = @{$self->{PMLIBDIRS}};
-    my ($pmlibdir);
-    @{$self->{PMLIBDIRS}} = ();
-    foreach $pmlibdir (@pmlibdirs) {
-       -d $pmlibdir && !$dir{$pmlibdir} && push @{$self->{PMLIBDIRS}}, $pmlibdir;
-    }
-
-    if (@{$self->{PMLIBDIRS}}){
-       print "Searching PMLIBDIRS: @{$self->{PMLIBDIRS}}\n"
-           if ($Verbose >= 2);
-       require File::Find;
-       File::Find::find(sub {
-           if (-d $_){
-               if ($_ eq "CVS" || $_ eq "RCS"){
-                   $File::Find::prune = 1;
-               }
-               return;
-           }
-           my($path, $prefix) = ($File::Find::name, '$(INST_LIBDIR)');
-           my($striplibpath,$striplibname);
-           $prefix =  '$(INST_LIB)' if (($striplibpath = $path) =~ s:^(\W*)lib\W:$1:);
-           ($striplibname,$striplibpath) = fileparse($striplibpath);
-           my($inst) = $self->catfile($prefix,$striplibpath,$striplibname);
-           local($_) = $inst; # for backwards compatibility
-           $inst = $self->libscan($inst);
-           print "libscan($path) => '$inst'\n" if ($Verbose >= 2);
-           return unless $inst;
-           $pm{$path} = $inst;
-       }, @{$self->{PMLIBDIRS}});
-    }
-
-    $self->{DIR} = [sort keys %dir] unless $self->{DIR};
-    $self->{XS}  = \%xs             unless $self->{XS};
-    $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->{H}   = [sort keys %h]   unless $self->{H};
-    $self->{PL_FILES} = \%pl_files unless $self->{PL_FILES};
+sub dist_basics {
+    my($self) = shift;
+    my @m;
+    push @m, q{
+distclean :: realclean distcheck
+};
 
-    # Set up names of manual pages to generate from pods
-    if ($self->{MAN1PODS}) {
-    } elsif ( $self->{INST_MAN1DIR} =~ /^(none|\s*)$/ ) {
-       $self->{MAN1PODS} = {};
-    } else {
-       my %manifypods = ();
-       if ( exists $self->{EXE_FILES} ) {
-           foreach $name (@{$self->{EXE_FILES}}) {
-#              use FileHandle ();
-#              my $fh = new FileHandle;
-               local *FH;
-               my($ispod)=0;
-               # one day test, if $/ can be set to '' safely (is the bug fixed that was in 5.001m?)
-#              if ($fh->open("<$name")) {
-               if (open(FH,"<$name")) {
-                   my $testpodline;
-#                  while ($testpodline = <$fh>) {
-                   while ($testpodline = <FH>) {
-                       if($testpodline =~ /^=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)');
-               }
-           }
-       }
-       $self->{MAN1PODS} = \%manifypods;
-    }
-    if ($self->{MAN3PODS}) {
-    } elsif ( $self->{INST_MAN3DIR} =~ /^(none|\s*)$/ ) {
-       $self->{MAN3PODS} = {};
-    } else {
-       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$/ ) {
-               $manifypods{$name} = $self->{PM}{$name};
-           } elsif ($name =~ /\.p[ml]$/ ) {
-#              use FileHandle ();
-#              my $fh = new FileHandle;
-               local *FH;
-               my($ispod)=0;
-#              $fh->open("<$name");
-               open(FH,"<$name");
-               my $testpodline;
-#              while ($testpodline = <$fh>) {
-               while ($testpodline = <FH>) {
-                   if($testpodline =~ /^=head1\s+\w+/) {
-                       $ispod=1;
-                       last;
-                   }
-                   #Speculation on the future (K.A., not A.K. :)
-                   #if(/^=don't\S+install/) { $ispod=0; last}
-               }
-#              $fh->close;
-               close FH;
+    push @m, q{
+distcheck :
+       $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use ExtUtils::Manifest "&fullcheck";' \\
+               -e 'fullcheck();'
+};
 
-               if( $ispod ) {
-                   $manifypods{$name} = $self->{PM}{$name};
-               }
-           }
-       }
+    push @m, q{
+skipcheck :
+       $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use ExtUtils::Manifest "&skipcheck";' \\
+               -e 'skipcheck();'
+};
 
-       # 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) {
-               delete $manifypods{$name};
-               next;
-           }
-           my($manpagename) = $name;
-           unless ($manpagename =~ s!^(\W*)lib\W!$1!) {
-               $manpagename = $self->catfile($self->{ROOTEXT},$manpagename);
-           }
-           $manpagename =~ s/\.p(od|m|l)$//;
-           # Strip leading slashes
-           $manpagename =~ s!^/+!!;
-           # Turn other slashes into colons
-#          $manpagename =~ s,/+,::,g;
-           $manpagename = $self->replace_manpage_separator($manpagename);
-           $manifypods{$name} = $self->catfile("\$(INST_MAN3DIR)","$manpagename.\$(MAN3EXT)");
-       }
-       $self->{MAN3PODS} = \%manifypods;
-    }
+    push @m, q{
+manifest :
+       $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use ExtUtils::Manifest "&mkmanifest";' \\
+               -e 'mkmanifest();'
+};
+    join "", @m;
 }
 
-=item init_others
+=item dist_ci (o)
 
-Initializes EXTRALIBS, BSLOADLIBS, LDLOADLIBS, LIBS, LD_RUN_PATH,
-OBJECT, BOOTDEP, PERLMAINCC, LDFROM, LINKTYPE, NOOP, FIRST_MAKEFILE,
-MAKEFILE, NOECHO, RM_F, RM_RF, TOUCH, CP, MV, CHMOD, UMASK_NULL
+Defines a check in target for RCS.
 
 =cut
 
-sub init_others {      # --- Initialize Other Attributes
+sub dist_ci {
     my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
+    my @m;
+    push @m, q{
+ci :
+       $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use ExtUtils::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");'
+};
+    join "", @m;
+}
 
-    # Compute EXTRALIBS, BSLOADLIBS and LDLOADLIBS from $self->{LIBS}
-    # Lets look at $self->{LIBS} carefully: It may be an anon array, a string or
-    # undefined. In any case we turn it into an anon array:
+=item dist_core (o)
 
-    # May check $Config{libs} too, thus not empty.
-    $self->{LIBS}=[''] unless $self->{LIBS};
+Defeines the targets dist, tardist, zipdist, uutardist, shdist
 
-    $self->{LIBS}=[$self->{LIBS}] if ref \$self->{LIBS} eq SCALAR;
-    $self->{LD_RUN_PATH} = "";
-    my($libs);
-    foreach $libs ( @{$self->{LIBS}} ){
-       $libs =~ s/^\s*(.*\S)\s*$/$1/; # remove leading and trailing whitespace
-       my(@libs) = $self->extliblist($libs);
-       if ($libs[0] or $libs[1] or $libs[2]){
-           # LD_RUN_PATH now computed by ExtUtils::Liblist
-           ($self->{EXTRALIBS}, $self->{BSLOADLIBS}, $self->{LDLOADLIBS}, $self->{LD_RUN_PATH}) = @libs;
-           last;
-       }
-    }
+=cut
 
-    if ( $self->{OBJECT} ) {
-       $self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g;
-    }
-    else {
-       # init_dirscan should have found out, if we have C files
-       $self->{OBJECT} = "";
-       $self->{OBJECT} = '$(BASEEXT)$(OBJ_EXT)' if @{$self->{C}||[]};
-    }
-    $self->{OBJECT} =~ s/\n+/ \\\n\t/g;
-    $self->{BOOTDEP}  = (-f "$self->{BASEEXT}_BS") ? "$self->{BASEEXT}_BS" : "";
-    $self->{PERLMAINCC} ||= '$(CC)';
-    $self->{LDFROM} = '$(OBJECT)' unless $self->{LDFROM};
+sub dist_core {
+    my($self) = shift;
+    my @m;
+    push @m, q{
+dist : $(DIST_DEFAULT)
+       }.$self->{NOECHO}.q{$(PERL) -le 'print "Warning: Makefile possibly out of date with $$vf" if ' \
+           -e '-e ($$vf="$(VERSION_FROM)") and -M $$vf < -M "}.$self->{MAKEFILE}.q{";'
 
-    # Sanity check: don't define LINKTYPE = dynamic if we're skipping
-    # the 'dynamic' section of MM.  We don't have this problem with
-    # 'static', since we either must use it (%Config says we can't
-    # use dynamic loading) or the caller asked for it explicitly.
-    if (!$self->{LINKTYPE}) {
-       $self->{LINKTYPE} = $self->{SKIPHASH}{'dynamic'}
-                        ? 'static'
-                        : ($Config::Config{usedl} ? 'dynamic' : 'static');
-    };
+tardist : $(DISTVNAME).tar$(SUFFIX)
 
-    # These get overridden for VMS and maybe some other systems
-    $self->{NOOP}  ||= "sh -c true";
-    $self->{FIRST_MAKEFILE} ||= "Makefile";
-    $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE};
-    $self->{MAKE_APERL_FILE} ||= "Makefile.aperl";
-    $self->{NOECHO} = '@' unless defined $self->{NOECHO};
-    $self->{RM_F}  ||= "rm -f";
-    $self->{RM_RF} ||= "rm -rf";
-    $self->{TOUCH} ||= "touch";
-    $self->{CP} ||= "cp";
-    $self->{MV} ||= "mv";
-    $self->{CHMOD} ||= "chmod";
-    $self->{UMASK_NULL} ||= "umask 0";
-}
+zipdist : $(DISTVNAME).zip
 
-=item extliblist
+$(DISTVNAME).tar$(SUFFIX) : distdir
+       $(PREOP)
+       $(TO_UNIX)
+       $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME)
+       $(RM_RF) $(DISTVNAME)
+       $(COMPRESS) $(DISTVNAME).tar
+       $(POSTOP)
 
-Called by init_others, and calls ext ExtUtils::Liblist. See
-L<ExtUtils::Liblist> for details.
+$(DISTVNAME).zip : distdir
+       $(PREOP)
+       $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME)
+       $(RM_RF) $(DISTVNAME)
+       $(POSTOP)
 
-=cut
+uutardist : $(DISTVNAME).tar$(SUFFIX)
+       uuencode $(DISTVNAME).tar$(SUFFIX) \\
+               $(DISTVNAME).tar$(SUFFIX) > \\
+               $(DISTVNAME).tar$(SUFFIX)_uu
 
-sub extliblist {
-    my($self,$libs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    require ExtUtils::Liblist;
-    $self->ext($libs, $Verbose);
+shdist : distdir
+       $(PREOP)
+       $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar
+       $(RM_RF) $(DISTVNAME)
+       $(POSTOP)
+};
+    join "", @m;
 }
 
-=item find_perl
+=item dist_dir (o)
 
-Finds the executables PERL and FULLPERL
+Defines the scratch directory target that will hold the distribution
+before tar-ing (or shar-ing).
 
 =cut
 
-sub find_perl {
-    my($self, $ver, $names, $dirs, $trace) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    my($name, $dir);
-    if ($trace >= 2){
-       print "Looking for perl $ver by these names:
-@$names
-in these dirs:
-@$dirs
-";
-    }
-    foreach $dir (@$dirs){
-       next unless defined $dir; # $self->{PERL_SRC} may be undefined
-       foreach $name (@$names){
-           my $abs;
-           if ($self->file_name_is_absolute($name)) {
-               $abs = $name;
-           } elsif (($name =~ m|/|) && ($name !~ m|^\.{1,2}/|)) {
-               # name is a path that does not begin with dot or dotdot
-               $abs = $self->catfile(".", $name);
-           } else {
-               $abs = $self->catfile($dir, $name);
-           }
-           print "Checking $abs\n" if ($trace >= 2);
-           next unless $self->maybe_command($abs);
-           print "Executing $abs\n" if ($trace >= 2);
-           if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
-               print "Using PERL=$abs\n" if $trace;
-               return $abs;
-           }
-       }
-    }
-    print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
-    0; # false and not empty
+sub dist_dir {
+    my($self) = shift;
+    my @m;
+    push @m, q{
+distdir :
+       $(RM_RF) $(DISTVNAME)
+       $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=manicopy,maniread \\
+               -e 'manicopy(maniread(),"$(DISTVNAME)", "$(DIST_CP)");'
+};
+    join "", @m;
 }
 
-=head2 Methods to actually produce chunks of text for the Makefile
-
-The methods here are called in the order specified by
-@ExtUtils::MakeMaker::MM_Sections. This manpage reflects the order as
-well as possible. Some methods call each other, so in doubt refer to
-the code.
-
-=item post_initialize (o)
+=item dist_test (o)
 
-Returns an ampty string per default. Used in Makefile.PLs to add some
-chunk of text to the Makefile after the object is initialized.
+Defines a target that produces the distribution in the
+scratchdirectory, and runs 'perl Makefile.PL; make ;make test' in that
+subdirectory.
 
 =cut
 
-sub post_initialize {
+sub dist_test {
     my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    "";
+    my @m;
+    push @m, q{
+disttest : distdir
+       cd $(DISTVNAME) && $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) Makefile.PL
+       cd $(DISTVNAME) && $(MAKE)
+       cd $(DISTVNAME) && $(MAKE) test
+};
+    join "", @m;
 }
 
-=item const_config (o)
+=item dlsyms (o)
 
-Defines a couple of constants in the Makefile that are inported from
-%Config.
+Used by AIX and VMS to define DL_FUNCS and DL_VARS and write the *.exp
+files.
 
 =cut
 
-sub const_config {
-# --- Constants Sections ---
+sub dlsyms {
+    my($self,%attribs) = @_;
 
-    my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    my(@m,$m);
-    push(@m,"\n# These definitions are from config.sh (via $INC{'Config.pm'})\n");
-    push(@m,"\n# They may have been overridden via Makefile.PL or on the command line\n");
-    my(%once_only);
-    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";
-       $once_only{$m} = 1;
-    }
-    join('', @m);
-}
+    return '' unless ($^O eq 'aix' && $self->needs_linking() );
 
-=item constants (o)
+    my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
+    my($vars)  = $attribs{DL_VARS} || $self->{DL_VARS} || [];
+    my(@m);
 
-Initializes lots of constants and .SUFFIXES and .PHONY
+    push(@m,"
+dynamic :: $self->{BASEEXT}.exp
 
-=cut
+") unless $self->{SKIPHASH}{'dynamic'}; # dynamic and static are subs, so...
 
-sub constants {
-    my($self) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    my(@m,$tmp);
+    push(@m,"
+static :: $self->{BASEEXT}.exp
 
-    for $tmp (qw/
-             AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION VERSION_SYM XS_VERSION
-             INST_LIB INST_ARCHLIB INST_EXE PREFIX INSTALLDIRS INSTALLPRIVLIB
-             INSTALLARCHLIB INSTALLSITELIB INSTALLSITEARCH INSTALLBIN PERL_LIB
-             PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
-             FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC PERL_INC PERL FULLPERL
-             / ) {
-       next unless defined $self->{$tmp};
-       push @m, "$tmp = $self->{$tmp}\n";
-    }
+") unless $self->{SKIPHASH}{'static'};  # we avoid a warning if we tick them
 
-    push @m, qq{
-VERSION_MACRO = VERSION
-DEFINE_VERSION = -D\$(VERSION_MACRO)=\\\"\$(VERSION)\\\"
-XS_VERSION_MACRO = XS_VERSION
-XS_DEFINE_VERSION = -D\$(XS_VERSION_MACRO)=\\\"\$(XS_VERSION)\\\"
-};
+    push(@m,"
+$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), ');\'
+');
 
-    push @m, qq{
-MAKEMAKER = \$(PERL_LIB)/ExtUtils/MakeMaker.pm
-MM_VERSION = $ExtUtils::MakeMaker::VERSION
-};
+    join('',@m);
+}
 
-    push @m, q{
-# FULLEXT = Pathname for extension directory (eg DBD/Oracle).
-# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
-# ROOTEXT = Directory part of FULLEXT with leading slash (eg /DBD)
-# DLBASE  = Basename part of dynamic library. May be just equal BASEEXT.
-};
+=item dynamic (o)
 
-    for $tmp (qw/
-             FULLEXT BASEEXT ROOTEXT DLBASE VERSION_FROM INC DEFINE OBJECT
-             LDFROM LINKTYPE
-             / ) {
-       next unless defined $self->{$tmp};
-       push @m, "$tmp = $self->{$tmp}\n";
-    }
+Defines the dynamic target.
 
-    push @m, "
-# Handy lists of source code files:
-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}})."
-MAN1PODS = ".join(" \\\n\t", sort keys %{$self->{MAN1PODS}})."
-MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})."
-";
+=cut
 
-    for $tmp (qw/
-             INST_MAN1DIR INSTALLMAN1DIR MAN1EXT INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
-             /) {
-       next unless defined $self->{$tmp};
-       push @m, "$tmp = $self->{$tmp}\n";
-    }
+sub dynamic {
+# --- Dynamic Loading Sections ---
 
-    push @m, "
-# work around a famous dec-osf make(1) feature(?):
-makemakerdflt: all
+    my($self) = shift;
+    '
+## $(INST_PM) has been moved to the all: target.
+## It remains here for awhile to allow for old usage: "make dynamic"
+#dynamic :: '.$self->{MAKEFILE}.' $(INST_DYNAMIC) $(INST_BOOT) $(INST_PM)
+dynamic :: '.$self->{MAKEFILE}.' $(INST_DYNAMIC) $(INST_BOOT)
+       '.$self->{NOECHO}.'$(NOOP)
+';
+}
 
-.SUFFIXES: .xs .c .C .cpp .cxx .cc \$(OBJ_EXT)
+=item dynamic_bs (o)
 
-# 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
-# we call false(1) when we rebuild it. So make(1) is not completely wrong when it
-# does so. Our milage may vary.
-# .PRECIOUS: Makefile    # seems to be not necessary anymore
+Defines targets for bootstrap files.
 
-.PHONY: all config static dynamic test linkext manifest
+=cut
 
-# Where is the Config information that we are using/depend on
-CONFIGDEP = \$(PERL_ARCHLIB)/Config.pm \$(PERL_INC)/config.h
-";
+sub dynamic_bs {
+    my($self, %attribs) = @_;
+    return '
+BOOTSTRAP =
+' unless $self->has_link_code();
 
-    push @m, '
-# Where to put things:
-INST_LIBDIR     = $(INST_LIB)$(ROOTEXT)
-INST_ARCHLIBDIR = $(INST_ARCHLIB)$(ROOTEXT)
+    return '
+BOOTSTRAP = '."$self->{BASEEXT}.bs".'
 
-INST_AUTODIR      = $(INST_LIB)/auto/$(FULLEXT)
-INST_ARCHAUTODIR  = $(INST_ARCHLIB)/auto/$(FULLEXT)
-';
+# As Mkbootstrap might not write a file (if none is required)
+# we use touch to prevent make continually trying to remake it.
+# 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)" \
+               -e \'use ExtUtils::Mkbootstrap;\' \
+               -e \'Mkbootstrap("$(BASEEXT)","$(BSLOADLIBS)");\'
+       '.$self->{NOECHO}.'$(TOUCH) $(BOOTSTRAP)
+       $(CHMOD) 644 $@
 
-    if ($self->has_link_code()) {
-       push @m, '
-INST_STATIC  = $(INST_ARCHAUTODIR)/$(BASEEXT)$(LIB_EXT)
-INST_DYNAMIC = $(INST_ARCHAUTODIR)/$(DLBASE).$(DLEXT)
-INST_BOOT    = $(INST_ARCHAUTODIR)/$(BASEEXT).bs
-';
-    } else {
-       push @m, '
-INST_STATIC  =
-INST_DYNAMIC =
-INST_BOOT    =
+$(INST_BOOT): $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists
+       '."$self->{NOECHO}$self->{RM_RF}".' $(INST_BOOT)
+       -'.$self->{CP}.' $(BOOTSTRAP) $(INST_BOOT)
+       $(CHMOD) 644 $@
 ';
-    }
+}
 
-    if ($Is_OS2) {
-       $tmp = "$self->{BASEEXT}.def";
-    } else {
-       $tmp = "";
-    }
-    push @m, "
-EXPORT_LIST = $tmp
-";
+=item dynamic_lib (o)
 
-    if ($Is_OS2) {
-       $tmp = "\$(PERL_INC)/libperl.lib";
-    } else {
-       $tmp = "";
-    }
-    push @m, "
-PERL_ARCHIVE = $tmp
-";
+Defines how to produce the *.so (or equivalent) files.
+
+=cut
+
+sub dynamic_lib {
+    my($self, %attribs) = @_;
+    return '' unless $self->needs_linking(); #might be because of a subdir
 
-#    push @m, q{
-#INST_PM = }.join(" \\\n\t", sort values %{$self->{PM}}).q{
-#
-#PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
-#};
+    return '' unless $self->has_link_code;
 
-    push @m, q{
-TO_INST_PM = }.join(" \\\n\t", sort keys %{$self->{PM}}).q{
+    my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
+    my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
+    my($armaybe) = $attribs{ARMAYBE} || $self->{ARMAYBE} || ":";
+    my($ldfrom) = '$(LDFROM)';
+    $armaybe = 'ar' if ($^O eq 'dec_osf' and $armaybe eq ':');
+    my(@m);
+    push(@m,'
+# This section creates the dynamically loadable $(INST_DYNAMIC)
+# from $(OBJECT) and possibly $(MYEXTLIB).
+ARMAYBE = '.$armaybe.'
+OTHERLDFLAGS = '.$otherldflags.'
+INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
 
-PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
-};
+$(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
+');
+    if ($armaybe ne ':'){
+       $ldfrom = 'tmp$(LIB_EXT)';
+       push(@m,'       $(ARMAYBE) cr '.$ldfrom.' $(OBJECT)'."\n");
+       push(@m,'       $(RANLIB) '."$ldfrom\n");
+    }
+    $ldfrom = "-all $ldfrom -none" if ($^O eq 'dec_osf');
+    push(@m,'  LD_RUN_PATH="$(LD_RUN_PATH)" $(LD) -o $@ $(LDDLFLAGS) '.$ldfrom.
+               ' $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) $(EXPORT_LIST)');
+    push @m, '
+       $(CHMOD) 755 $@
+';
 
+    push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
     join('',@m);
 }
 
-=item const_loadlibs
+=item exescan
 
-Defines EXTRALIBS, LDLOADLIBS, BSLOADLIBS, LD_RUN_PATH. See
-L<ExtUtils::Liblist> for details.
+Deprecated method. Use libscan instead.
 
 =cut
 
-sub const_loadlibs {
-    my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    return "" unless $self->needs_linking;
-    my @m;
-    push @m, qq{
-# $self->{NAME} might depend on some other libraries:
-# See ExtUtils::Liblist for details
-#
-};
-    my($tmp);
-    for $tmp (qw/
-        EXTRALIBS LDLOADLIBS BSLOADLIBS LD_RUN_PATH
-        /) {
-       next unless defined $self->{$tmp};
-       push @m, "$tmp = $self->{$tmp}\n";
-    }
-    return join "", @m;
+sub exescan {
+    my($self,$path) = @_;
+    $path;
 }
 
-=item cflags
+=item extliblist
 
-Does very much the same as the cflags script in the perl
-distribution. It doesn't return the whole compiler command line, but
-initializes all of its parts. The const_cccmd method then actually
-returns the definition of the CCCMD macro which uses these parts.
+Called by init_others, and calls ext ExtUtils::Liblist. See
+L<ExtUtils::Liblist> for details.
 
 =cut
 
-#'
-
-sub cflags {
-    my($self,$libperl)=@_;
-    return $self->{CFLAGS} if $self->{CFLAGS};
-    return '' unless $self->needs_linking();
+sub extliblist {
+    my($self,$libs) = @_;
+    require ExtUtils::Liblist;
+    $self->ext($libs, $Verbose);
+}
 
-    my($prog, $uc, $perltype, %cflags);
-    $libperl ||= $self->{LIBPERL_A} || "libperl$self->{LIB_EXT}" ;
-    $libperl =~ s/\.\$\(A\)$/$self->{LIB_EXT}/;
+=item file_name_is_absolute
 
-    @cflags{qw(cc ccflags optimize large split shellflags)}
-       = @Config{qw(cc ccflags optimize large split shellflags)};
-    my($optdebug) = "";
+Takes as argument a path and returns true, it it is an absolute path.
 
-    $cflags{shellflags} ||= '';
+=cut
 
-    my(%map) =  (
-               D =>   '-DDEBUGGING',
-               E =>   '-DEMBED',
-               DE =>  '-DDEBUGGING -DEMBED',
-               M =>   '-DEMBED -DMULTIPLICITY',
-               DM =>  '-DDEBUGGING -DEMBED -DMULTIPLICITY',
-               );
+sub file_name_is_absolute {
+    my($self,$file) = @_;
+    $file =~ m:^/: ;
+}
 
-    if ($libperl =~ /libperl(\w*)\Q$self->{LIB_EXT}/){
-       $uc = uc($1);
-    } else {
-       $uc = ""; # avoid warning
-    }
-    $perltype = $map{$uc} ? $map{$uc} : "";
+=item find_perl
 
-    if ($uc =~ /^D/) {
-       $optdebug = "-g";
-    }
+Finds the executables PERL and FULLPERL
 
+=cut
 
-    my($name);
-    ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
-    if ($prog = $Config::Config{$name}) {
-       # Expand hints for this extension via the shell
-       print STDOUT "Processing $name hint:\n" if $Verbose;
-       my(@o)=`cc=\"$cflags{cc}\"
-         ccflags=\"$cflags{ccflags}\"
-         optimize=\"$cflags{optimize}\"
-         perltype=\"$cflags{perltype}\"
-         optdebug=\"$cflags{optdebug}\"
-         large=\"$cflags{large}\"
-         split=\"$cflags{'split'}\"
-         eval '$cflags{prog}'
-         echo cc=\$cflags{cc}
-         echo ccflags=\$cflags{ccflags}
-         echo optimize=\$cflags{optimize}
-         echo perltype=\$cflags{perltype}
-         echo optdebug=\$cflags{optdebug}
-         echo large=\$cflags{large}
-         echo split=\$cflags{'split'}
-         `;
-       my($line);
-       foreach $line (@o){
-           chomp $line;
-           if ($line =~ /(.*?)=\s*(.*)\s*$/){
-               $cflags{$1} = $2;
-               print STDOUT "  $1 = $2\n" if $Verbose;
-           } else {
-               print STDOUT "Unrecognised result from hint: '$line'\n";
+sub find_perl {
+    my($self, $ver, $names, $dirs, $trace) = @_;
+    my($name, $dir);
+    if ($trace >= 2){
+       print "Looking for perl $ver by these names:
+@$names
+in these dirs:
+@$dirs
+";
+    }
+    foreach $dir (@$dirs){
+       next unless defined $dir; # $self->{PERL_SRC} may be undefined
+       foreach $name (@$names){
+           my $abs;
+           if ($self->file_name_is_absolute($name)) { # /foo/bar
+               $abs = $name;
+           } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # foo
+               $abs = $self->catfile($dir, $name);
+           } else { # foo/bar
+               $abs = $self->canonpath($self->catfile($self->curdir, $name));
+           }
+           print "Checking $abs\n" if ($trace >= 2);
+           next unless $self->maybe_command($abs);
+           print "Executing $abs\n" if ($trace >= 2);
+           if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
+               print "Using PERL=$abs\n" if $trace;
+               return $abs;
            }
        }
     }
+    print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
+    0; # false and not empty
+}
 
-    if ($optdebug) {
-       $cflags{optimize} = $optdebug;
-    }
+=head2 Methods to actually produce chunks of text for the Makefile
 
-    for (qw(ccflags optimize perltype large split)) {
-       $cflags{$_} =~ s/^\s+//;
-       $cflags{$_} =~ s/\s+/ /g;
-       $cflags{$_} =~ s/\s+$//;
-       $self->{uc $_} ||= $cflags{$_}
-    }
+The methods here are called in the order specified by
+@ExtUtils::MakeMaker::MM_Sections. This manpage reflects the order as
+well as possible. Some methods call each other, so in doubt refer to
+the code.
 
-    return $self->{CFLAGS} = qq{
-CCFLAGS = $self->{CCFLAGS}
-OPTIMIZE = $self->{OPTIMIZE}
-PERLTYPE = $self->{PERLTYPE}
-LARGE = $self->{LARGE}
-SPLIT = $self->{SPLIT}
-};
+=item force (o)
+
+Just writes FORCE:
+
+=cut
 
+sub force {
+    my($self) = shift;
+    '# Phony target to force checking subdirectories.
+FORCE:
+';
 }
 
+=item guess_name
 
+Guess the name of this package by examining the working directory's
+name. MakeMaker calls this only if the developer has not supplied a
+NAME attribute.
 
-=item const_cccmd
+=cut
 
-Returns the full compiler call for C programs and stores the
-definition in CONST_CCCMD.
+# ';
+
+sub guess_name {
+    my($self) = @_;
+    use Cwd 'cwd';
+    my $name = basename(cwd());
+    $name =~ s|[\-_][\d\.\-]+$||;   # 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";
+    $name;
+}
+
+=item has_link_code
+
+Returns true if C, XS, MYEXTLIB or similar objects exist within this
+object that need a compiler. Does not descend into subdirectories as
+needs_linking() does.
 
 =cut
 
-sub const_cccmd {
-    my($self,$libperl)=@_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
+sub has_link_code {
+    my($self) = shift;
+    return $self->{HAS_LINK_CODE} if defined $self->{HAS_LINK_CODE};
+    if ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB}){
+       $self->{HAS_LINK_CODE} = 1;
+       return 1;
     }
-    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) $(DEFINE_VERSION) \\
-       $(XS_DEFINE_VERSION)};
+    return $self->{HAS_LINK_CODE} = 0;
 }
 
-=item pm_to_blib
+=item init_dirscan
 
-Defines target that copies all files in the hash PM to their
-destination and autosplits them. See L<ExtUtils::Install/pm_to_blib>
+Initializes DIR, XS, PM, C, O_FILES, H, PL_FILES, MAN*PODS, EXE_FILES.
+
+=cut
+
+sub init_dirscan {     # --- File and Directory Lists (.xs .pm .pod etc)
+    my($self) = @_;
+    my($name, %dir, %xs, %c, %h, %ignore, %pl_files, %manifypods);
+    local(%pm); #the sub in find() has to see this hash
+    $ignore{'test.pl'} = 1;
+    $ignore{'makefile.pl'} = 1 if $Is_VMS;
+    foreach $name ($self->lsdir($self->curdir)){
+       next if $name eq $self->curdir or $name eq $self->updir or $ignore{$name};
+       next unless $self->libscan($name);
+       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/;
+           $xs{$name} = $c;
+           $c{$c} = 1;
+       } elsif ($name =~ /\.c(pp|xx|c)?$/i){  # .c .C .cpp .cxx .cc
+           $c{$name} = 1
+               unless $name =~ m/perlmain\.c/; # See MAP_TARGET
+       } elsif ($name =~ /\.h$/i){
+           $h{$name} = 1;
+       } elsif ($name =~ /\.(p[ml]|pod)$/){
+           $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name);
+       } elsif ($name =~ /\.PL$/ && $name ne "Makefile.PL") {
+           ($pl_files{$name} = $name) =~ s/\.PL$// ;
+       } elsif ($Is_VMS && $name =~ /\.pl$/ && $name ne 'makefile.pl' &&
+                $name ne 'test.pl') {  # case-insensitive filesystem
+           ($pl_files{$name} = $name) =~ s/\.pl$// ;
+       }
+    }
 
-=cut
+    # Some larger extensions often wish to install a number of *.pm/pl
+    # files into the library in various locations.
 
-sub pm_to_blib {
-    my $self = shift;
-    my($autodir) = $self->catdir('$(INST_LIB)','auto');
-    return 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({@ARGV},"}.$autodir.q{")' $(PM_TO_BLIB)
-       }.$self->{NOECHO}.q{$(TOUCH) $@
-};
-}
+    # The attribute PMLIBDIRS holds an array reference which lists
+    # subdirectories which we should search for library files to
+    # install. PMLIBDIRS defaults to [ 'lib', $self->{BASEEXT} ].  We
+    # recursively search through the named directories (skipping any
+    # which don't exist or contain Makefile.PL files).
 
-=item tool_autosplit (o)
+    # For each *.pm or *.pl file found $self->libscan() is called with
+    # the default installation path in $_[1]. The return value of
+    # libscan defines the actual installation location.  The default
+    # libscan function simply returns the path.  The file is skipped
+    # if libscan returns false.
 
-Defines a simple perl call that runs autosplit. May be deprecated by
-pm_to_blib soon.
+    # The default installation location passed to libscan in $_[1] is:
+    #
+    #  ./*.pm          => $(INST_LIBDIR)/*.pm
+    #  ./xyz/...       => $(INST_LIBDIR)/xyz/...
+    #  ./lib/...       => $(INST_LIB)/...
+    #
+    # In this way the 'lib' directory is seen as the root of the actual
+    # perl library whereas the others are relative to INST_LIBDIR
+    # (which includes PARENT_NAME). This is a subtle distinction but one
+    # that's important for nested modules.
 
-=cut
+    $self->{PMLIBDIRS} = ['lib', $self->{BASEEXT}]
+       unless $self->{PMLIBDIRS};
 
-sub tool_autosplit {
-# --- Tool Sections ---
+    #only existing directories that aren't in $dir are allowed
 
-    my($self, %attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
+    # Avoid $_ wherever possible:
+    # @{$self->{PMLIBDIRS}} = grep -d && !$dir{$_}, @{$self->{PMLIBDIRS}};
+    my (@pmlibdirs) = @{$self->{PMLIBDIRS}};
+    my ($pmlibdir);
+    @{$self->{PMLIBDIRS}} = ();
+    foreach $pmlibdir (@pmlibdirs) {
+       -d $pmlibdir && !$dir{$pmlibdir} && push @{$self->{PMLIBDIRS}}, $pmlibdir;
     }
-    my($asl) = "";
-    $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) ;'
-};
-}
-
-=item tool_xsubpp (o)
 
-Determines typemaps, xsubpp version, prototype behaviour.
+    if (@{$self->{PMLIBDIRS}}){
+       print "Searching PMLIBDIRS: @{$self->{PMLIBDIRS}}\n"
+           if ($Verbose >= 2);
+       require File::Find;
+       File::Find::find(sub {
+           if (-d $_){
+               if ($_ eq "CVS" || $_ eq "RCS"){
+                   $File::Find::prune = 1;
+               }
+               return;
+           }
+           my($path, $prefix) = ($File::Find::name, '$(INST_LIBDIR)');
+           my($striplibpath,$striplibname);
+           $prefix =  '$(INST_LIB)' if (($striplibpath = $path) =~ s:^(\W*)lib\W:$1:);
+           ($striplibname,$striplibpath) = fileparse($striplibpath);
+           my($inst) = $self->catfile($prefix,$striplibpath,$striplibname);
+           local($_) = $inst; # for backwards compatibility
+           $inst = $self->libscan($inst);
+           print "libscan($path) => '$inst'\n" if ($Verbose >= 2);
+           return unless $inst;
+           $pm{$path} = $inst;
+       }, @{$self->{PMLIBDIRS}});
+    }
 
-=cut
+    $self->{DIR} = [sort keys %dir] unless $self->{DIR};
+    $self->{XS}  = \%xs             unless $self->{XS};
+    $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->{H}   = [sort keys %h]   unless $self->{H};
+    $self->{PL_FILES} = \%pl_files unless $self->{PL_FILES};
 
-sub tool_xsubpp {
-    my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    my($xsdir)  = $self->catdir($self->{PERL_LIB},"ExtUtils");
-    my(@tmdeps) = $self->catdir('$(XSUBPPDIR)','typemap');
-    if( $self->{TYPEMAPS} ){
-       my $typemap;
-       foreach $typemap (@{$self->{TYPEMAPS}}){
-               if( ! -f  $typemap ){
-                       warn "Typemap $typemap not found.\n";
+    # Set up names of manual pages to generate from pods
+    if ($self->{MAN1PODS}) {
+    } elsif ( $self->{INST_MAN1DIR} =~ /^(none|\s*)$/ ) {
+       $self->{MAN1PODS} = {};
+    } else {
+       my %manifypods = ();
+       if ( exists $self->{EXE_FILES} ) {
+           foreach $name (@{$self->{EXE_FILES}}) {
+#              use FileHandle ();
+#              my $fh = new FileHandle;
+               local *FH;
+               my($ispod)=0;
+               # one day test, if $/ can be set to '' safely (is the bug fixed that was in 5.001m?)
+#              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;
                }
-               else{
-                       push(@tmdeps,  $typemap);
+               if( $ispod ) {
+                   $manifypods{$name} = $self->catfile('$(INST_MAN1DIR)',basename($name).'.$(MAN1EXT)');
                }
+           }
        }
+       $self->{MAN1PODS} = \%manifypods;
     }
-    push(@tmdeps, "typemap") if -f "typemap";
-    my(@tmargs) = map("-typemap $_", @tmdeps);
-    if( exists $self->{XSOPT} ){
-       unshift( @tmargs, $self->{XSOPT} );
-    }
-
-
-    my $xsubpp_version = $self->xsubpp_version("$xsdir/xsubpp");
-
-    # What are the correct thresholds for version 1 && 2 Paul?
-    if ( $xsubpp_version > 1.923 ){
-       $self->{XSPROTOARG} = "" unless defined $self->{XSPROTOARG};
+    if ($self->{MAN3PODS}) {
+    } elsif ( $self->{INST_MAN3DIR} =~ /^(none|\s*)$/ ) {
+       $self->{MAN3PODS} = {};
     } else {
-       if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
-           print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
-       Your version of xsubpp is $xsubpp_version and cannot handle this.
-       Please upgrade to a more recent version of xsubpp.
-};
-       } else {
-           $self->{XSPROTOARG} = "";
+       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$/ ) {
+               $manifypods{$name} = $self->{PM}{$name};
+           } elsif ($name =~ /\.p[ml]$/ ) {
+#              use FileHandle ();
+#              my $fh = new FileHandle;
+               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;
+               }
+               if( $ispod ) {
+                   $manifypods{$name} = $self->{PM}{$name};
+               }
+           }
+       }
+
+       # 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) {
+               delete $manifypods{$name};
+               next;
+           }
+           my($manpagename) = $name;
+           unless ($manpagename =~ s!^\W*lib\W+!!) { # 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)");
        }
+       $self->{MAN3PODS} = \%manifypods;
     }
+}
 
-    return qq{
-XSUBPPDIR = $xsdir
-XSUBPP = \$(XSUBPPDIR)/xsubpp
-XSPROTOARG = $self->{XSPROTOARG}
-XSUBPPDEPS = @tmdeps
-XSUBPPARGS = @tmargs
-};
-};
+=item init_main
 
-sub xsubpp_version
-{
-    my($self,$xsubpp) = @_;
-    return $Xsubpp_Version if defined $Xsubpp_Version; # global variable
+Initializes NAME, FULLEXT, BASEEXT, PARENT_NAME, DLBASE, PERL_SRC,
+PERL_LIB, PERL_ARCHLIB, PERL_INC, INSTALLDIRS, INST_*, INSTALL*,
+PREFIX, CONFIG, AR, AR_STATIC_ARGS, LD, OBJ_EXT, LIB_EXT, MAP_TARGET,
+LIBPERL_A, VERSION_FROM, VERSION, DISTNAME, VERSION_SYM.
 
-    my ($version) ;
+=cut
 
-    # try to figure out the version number of the xsubpp on the system
+sub init_main {
+    my($self) = @_;
 
-    # first try the -v flag, introduced in 1.921 & 2.000a2
+    # --- Initialize Module Name and Paths
 
-    my $command = "$self->{PERL} -I$self->{PERL_LIB} $xsubpp -v 2>&1";
-    print "Running $command\n" if $Verbose >= 2;
-    $version = `$command` ;
-    warn "Running '$command' exits with status " . ($?>>8) if $?;
-    chop $version ;
+    # NAME    = Foo::Bar::Oracle
+    # FULLEXT = Foo/Bar/Oracle
+    # BASEEXT = Oracle
+    # ROOTEXT = Directory part of FULLEXT with leading /. !!! Deprecated from MM 5.32 !!!
+    # PARENT_NAME = Foo::Bar
+### Only UNIX:
+###    ($self->{FULLEXT} =
+###     $self->{NAME}) =~ s!::!/!g ; #eg. BSD/Foo/Socket
+    $self->{FULLEXT} = $self->catdir(split /::/, $self->{NAME});
 
-    return $Xsubpp_Version = $1 if $version =~ /^xsubpp version (.*)/ ;
 
-    # nope, then try something else
+    # Copied from DynaLoader:
 
-    my $counter = '000';
-    my ($file) = 'temp' ;
-    $counter++ while -e "$file$counter"; # don't overwrite anything
-    $file .= $counter;
+    my(@modparts) = split(/::/,$self->{NAME});
+    my($modfname) = $modparts[-1];
 
-    open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
-    print F <<EOM ;
-MODULE = fred PACKAGE = fred
+    # Some systems have restrictions on files names for DLL's etc.
+    # mod2fname returns appropriate file base name (typically truncated)
+    # It may also edit @modparts if required.
+    if (defined &DynaLoader::mod2fname) {
+        $modfname = &DynaLoader::mod2fname(\@modparts);
+    } elsif ($Is_OS2) {                # Need manual correction if run with miniperl:-(
+        $modfname = substr($modfname, 0, 7) . '_';
+    }
 
-int
-fred(a)
-        int     a;
-EOM
 
-    close F ;
+    ($self->{PARENT_NAME}, $self->{BASEEXT}) = $self->{NAME} =~ m!([\w:]+::)?(\w+)$! ;
+
+    if (defined &DynaLoader::mod2fname or $Is_OS2) {
+       # As of 5.001m, dl_os2 appends '_'
+       $self->{DLBASE} = $modfname;
+    } else {
+       $self->{DLBASE} = '$(BASEEXT)';
+    }
+
 
-    $command = "$self->{PERL} $xsubpp $file 2>&1";
-    print "Running $command\n" if $Verbose >= 2;
-    my $text = `$command` ;
-    warn "Running '$command' exits with status " . ($?>>8) if $?;
-    unlink $file ;
+    ### ROOTEXT deprecated from MM 5.32
+###    ($self->{ROOTEXT} =
+###     $self->{FULLEXT}) =~ s#/?\Q$self->{BASEEXT}\E$## ;      #eg. /BSD/Foo
+###    $self->{ROOTEXT} = ($Is_VMS ? '' : '/') . $self->{ROOTEXT} if $self->{ROOTEXT};
 
-    # gets 1.2 -> 1.92 and 2.000a1
-    return $Xsubpp_Version = $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/  ;
 
-    # it is either 1.0 or 1.1
-    return $Xsubpp_Version = 1.1 if $text =~ /^Warning: ignored semicolon/ ;
+    # --- Initialize PERL_LIB, INST_LIB, PERL_SRC
 
-    # none of the above, so 1.0
-    return $Xsubpp_Version = "1.0" ;
-}
+    # *Real* information: where did we get these two from? ...
+    my $inc_config_dir = dirname($INC{'Config.pm'});
+    my $inc_carp_dir   = dirname($INC{'Carp.pm'});
 
-=item tools_other (o)
+    unless ($self->{PERL_SRC}){
+       my($dir);
+       foreach $dir ($self->updir(),$self->catdir($self->updir(),$self->updir()),$self->catdir($self->updir(),$self->updir(),$self->updir())){
+           if (
+               -f $self->catfile($dir,"config.sh")
+               &&
+               -f $self->catfile($dir,"perl.h")
+               &&
+               -f $self->catfile($dir,"lib","Exporter.pm")
+              ) {
+               $self->{PERL_SRC}=$dir ;
+               last;
+           }
+       }
+    }
+    if ($self->{PERL_SRC}){
+       $self->{PERL_LIB}     ||= $self->catdir("$self->{PERL_SRC}","lib");
+       $self->{PERL_ARCHLIB} = $self->{PERL_LIB};
+       $self->{PERL_INC}     = $self->{PERL_SRC};
+       # catch a situation that has occurred a few times in the past:
 
-Defines SHELL, LD, TOUCH, CP, MV, RM_F, RM_RF, CHMOD, UMASK_NULL in
-the Makefile. Also defines the perl programs MKPATH,
-WARN_IF_OLD_PACKLIST, MOD_INSTALL. DOC_INSTALL, and UNINSTALL.
+       warn <<EOM unless (-s $self->catfile($self->{PERL_SRC},'cflags') or $Is_VMS && -s $self->catfile($self->{PERL_SRC},'perlshr_attr.opt') or $Is_Mac);
+You cannot build extensions below the perl source tree after executing
+a 'make clean' in the perl source tree.
 
-=cut
+To rebuild extensions distributed with the perl source you should
+simply Configure (to include those extensions) and then build perl as
+normal. After installing perl the source tree can be deleted. It is
+not needed for building extensions by running 'perl Makefile.PL'
+usually without extra arguments.
 
-sub tools_other {
-    my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    my @m;
-    push @m, qq{
-SHELL = /bin/sh
-LD = $self->{LD}
-TOUCH = $self->{TOUCH}
-CP = $self->{CP}
-MV = $self->{MV}
-RM_F  = $self->{RM_F}
-RM_RF = $self->{RM_RF}
-CHMOD = $self->{CHMOD}
-UMASK_NULL = $self->{UMASK_NULL}
-};
+It is recommended that you unpack and build additional extensions away
+from the perl source tree.
+EOM
+    } else {
+       # we should also consider $ENV{PERL5LIB} here
+       $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;
+       die <<EOM unless (-f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h")));
+Error: Unable to locate installed Perl libraries or Perl source code.
 
-    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) -wle '$$"="/"; foreach $$p (@ARGV){' \\
--e 'next if -d $$p; my(@p); foreach(split(/\//,$$p)){' \\
--e 'push(@p,$$_); next if -d "@p/"; print "mkdir @p" if 0;' \\
--e 'mkdir("@p",0777)||die $$! } } exit 0;'
+It is recommended that you install perl in a standard location before
+building extensions. You can say:
 
-# 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) -we 'open F, ">$$ARGV[1]"; close F;' \\
--e 'utime ((stat("$$ARGV[0]"))[8,9], $$ARGV[1])'
-};
+    $^X Makefile.PL PERL_SRC=/path/to/perl/source/directory
 
-    return join "", @m if $self->{PARENT};
+if you have not yet installed perl but still want to build this
+extension now.
+(You get this message, because MakeMaker could not find "$perl_h")
+EOM
 
-    push @m, q{
-# Here we warn users that an old packlist file was found somewhere,
-# and that they should call some uninstall routine
-WARN_IF_OLD_PACKLIST = $(PERL) -we 'exit unless -f $$ARGV[0];' \\
--e 'print "WARNING: I have found an old package in\n";' \\
--e 'print "\t$$ARGV[0].\n";' \\
--e 'print "Please make sure the two installations are not conflicting\n";'
+#       print STDOUT "Using header files found in $self->{PERL_INC}\n"
+#           if $Verbose && $self->needs_linking();
 
-MOD_INSTALL = $(PERL) -I$(INST_LIB) -I$(PERL_LIB) -MExtUtils::Install \
--e 'install({@ARGV},1);'
+    }
 
-DOC_INSTALL = $(PERL) -e '$$\="\n\n";print "=head3 ", scalar(localtime), ": C<", shift, ">";' \
--e 'print "=over 4";' \
--e 'while ($$key = shift and $$val = shift){print "=item *";print "C<$$key: $$val>";}' \
--e 'print "=back";'
+    # We get SITELIBEXP and SITEARCHEXP directly via
+    # Get_from_Config. When we are running standard modules, these
+    # won't matter, we will set INSTALLDIRS to "perl". Otherwise we
+    # set it to "site". I prefer that INSTALLDIRS be set from outside
+    # MakeMaker.
+    $self->{INSTALLDIRS} ||= "site";
 
-UNINSTALL =   $(PERL) -MExtUtils::Install \
--e 'uninstall($$ARGV[0],1);'
+    # INST_LIB typically pre-set if building an extension after
+    # perl has been built and installed. Setting INST_LIB allows
+    # you to build directly into, say $Config::Config{privlibexp}.
+    unless ($self->{INST_LIB}){
 
-};
 
-    return join "", @m;
-}
+       ##### XXXXX We have to change this nonsense
 
-=item dist (o)
+       if (defined $self->{PERL_SRC} and $self->{INSTALLDIRS} eq "perl") {
+           $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB};
+       } else {
+           $self->{INST_LIB} = $self->catdir($self->curdir,"blib","lib");
+       }
+    }
+    $self->{INST_ARCHLIB} ||= $self->catdir($self->curdir,"blib","arch");
+    $self->{INST_BIN} ||= $self->catdir($self->curdir,'blib','bin');
 
-Defines a lot of macros for distribution support.
+    # INST_EXE is deprecated, should go away March '97
+    $self->{INST_EXE} ||= $self->catdir($self->curdir,'blib','script');
+    $self->{INST_SCRIPT} ||= $self->catdir($self->curdir,'blib','script');
 
-=cut
+    # The user who requests an installation directory explicitly
+    # should not have to tell us a 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
+    # the found one.
+    # We do the same thing twice: for privlib/archlib and for sitelib/sitearch
+    my($libpair);
+    for $libpair ({l=>"privlib", a=>"archlib"}, {l=>"sitelib", a=>"sitearch"}) {
+       my $lib = "install$libpair->{l}";
+       my $Lib = uc $lib;
+       my $Arch = uc "install$libpair->{a}";
+       if( $self->{$Lib} && ! $self->{$Arch} ){
+           my($ilib) = $Config{$lib};
+           $ilib = VMS::Filespec::unixify($ilib) if $Is_VMS;
 
-sub dist {
-    my($self, %attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
+           $self->prefixify($Arch,$ilib,$self->{$Lib});
+
+           unless (-d $self->{$Arch}) {
+               print STDOUT "Directory $self->{$Arch} not found, thusly\n" if $Verbose;
+               $self->{$Arch} = $self->{$Lib};
+           }
+           print STDOUT "Defaulting $Arch to $self->{$Arch}\n" if $Verbose;
+       }
     }
 
-    my(@m);
-    # VERSION should be sanitised before use as a file name
-    my($name)     = $attribs{NAME}     || '$(DISTVNAME)';
-    my($tar)      = $attribs{TAR}      || 'tar';        # eg /usr/bin/gnutar
-    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($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
-    my($ci)       = $attribs{CI}       || 'ci -u';
-    my($rcs_label)= $attribs{RCS_LABEL}|| 'rcs -Nv$(VERSION_SYM): -q';
-    my($dist_cp)  = $attribs{DIST_CP}  || 'best';
-    my($dist_default) = $attribs{DIST_DEFAULT} || 'tardist';
+    # we have to look at the relation between $Config{prefix} and the
+    # requested values. We're going to set the $Config{prefix} part of
+    # all the installation path variables to literally $(PREFIX), so
+    # the user can still say make PREFIX=foo
+    my($prefix) = $Config{'prefix'};
+    $prefix = VMS::Filespec::unixify($prefix) if $Is_VMS;
+    unless ($self->{PREFIX}){
+       $self->{PREFIX} = $prefix;
+    }
+    my($install_variable);
+    for $install_variable (qw/
 
-    push @m, "
-DISTVNAME = \$(DISTNAME)-\$(VERSION_SYM)
-TAR  = $tar
-TARFLAGS = $tarflags
-ZIP  = $zip
-ZIPFLAGS = $zipflags
-COMPRESS = $compress
-SUFFIX = $suffix
-SHAR = $shar
-PREOP = $preop
-POSTOP = $postop
-CI = $ci
-RCS_LABEL = $rcs_label
-DIST_CP = $dist_cp
-DIST_DEFAULT = $dist_default
-";
-    join "", @m;
-}
+                          INSTALLPRIVLIB INSTALLARCHLIB INSTALLBIN
+                          INSTALLMAN1DIR INSTALLMAN3DIR INSTALLSCRIPT
+                          INSTALLSITELIB INSTALLSITEARCH
 
-=item macro (o)
+                          /) {
+       $self->prefixify($install_variable,$prefix,q[$(PREFIX)]);
+    }
 
-Simple subroutine to insert the macros defined by the macro attribute
-into the Makefile.
 
-=cut
+    # Now we head at the manpages. Maybe they DO NOT want manpages
+    # installed
+    $self->{INSTALLMAN1DIR} = $Config::Config{installman1dir}
+       unless defined $self->{INSTALLMAN1DIR};
+    unless (defined $self->{INST_MAN1DIR}){
+       if ($self->{INSTALLMAN1DIR} =~ /^(none|\s*)$/){
+           $self->{INST_MAN1DIR} = $self->{INSTALLMAN1DIR};
+       } else {
+           $self->{INST_MAN1DIR} = $self->catdir($self->curdir,'blib','man1');
+       }
+    }
+    $self->{MAN1EXT} ||= $Config::Config{man1ext};
 
-sub macro {
-    my($self,%attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
+    $self->{INSTALLMAN3DIR} = $Config::Config{installman3dir}
+       unless defined $self->{INSTALLMAN3DIR};
+    unless (defined $self->{INST_MAN3DIR}){
+       if ($self->{INSTALLMAN3DIR} =~ /^(none|\s*)$/){
+           $self->{INST_MAN3DIR} = $self->{INSTALLMAN3DIR};
+       } else {
+           $self->{INST_MAN3DIR} = $self->catdir($self->curdir,'blib','man3');
+       }
     }
-    my(@m,$key,$val);
-    while (($key,$val) = each %attribs){
-       last unless defined $key;
-       push @m, "$key = $val\n";
+    $self->{MAN3EXT} ||= $Config::Config{man3ext};
+
+
+    # Get some stuff out of %Config if we haven't yet done so
+    print STDOUT "CONFIG must be an array ref\n"
+       if ($self->{CONFIG} and ref $self->{CONFIG} ne 'ARRAY');
+    $self->{CONFIG} = [] unless (ref $self->{CONFIG});
+    push(@{$self->{CONFIG}}, @ExtUtils::MakeMaker::Get_from_Config);
+    push(@{$self->{CONFIG}}, 'shellflags') if $Config::Config{shellflags};
+    my(%once_only,$m);
+    foreach $m (@{$self->{CONFIG}}){
+       next if $once_only{$m};
+       print STDOUT "CONFIG key '$m' does not exist in Config.pm\n"
+               unless exists $Config::Config{$m};
+       $self->{uc $m} ||= $Config::Config{$m};
+       $once_only{$m} = 1;
     }
-    join "", @m;
-}
 
-=item depend (o)
+# This is too dangerous:
+#    if ($^O eq "next") {
+#      $self->{AR} = "libtool";
+#      $self->{AR_STATIC_ARGS} = "-o";
+#    }
+# But I leave it as a placeholder
 
-Same as macro for the depend attribute.
+    $self->{AR_STATIC_ARGS} ||= "cr";
 
-=cut
+    # These should never be needed
+    $self->{LD} ||= 'ld';
+    $self->{OBJ_EXT} ||= '.o';
+    $self->{LIB_EXT} ||= '.a';
+
+    $self->{MAP_TARGET} ||= "perl";
+
+    $self->{LIBPERL_A} ||= "libperl$self->{LIB_EXT}";
+
+    # make a simple check if we find Exporter
+    warn "Warning: PERL_LIB ($self->{PERL_LIB}) seems not to be a perl library directory
+        (Exporter.pm not found)"
+       unless -f $self->catfile("$self->{PERL_LIB}","Exporter.pm") ||
+        $self->{NAME} eq "ExtUtils::MakeMaker";
 
-sub depend {
-    my($self,%attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
+    # Determine VERSION and VERSION_FROM
+    ($self->{DISTNAME}=$self->{NAME}) =~ s#(::)#-#g unless $self->{DISTNAME};
+    if ($self->{VERSION_FROM}){
+       $self->{VERSION} = $self->parse_version($self->{VERSION_FROM}) or
+           Carp::carp "WARNING: Setting VERSION via file '$self->{VERSION_FROM}' failed\n"
     }
-    my(@m,$key,$val);
-    while (($key,$val) = each %attribs){
-       last unless defined $key;
-       push @m, "$key : $val\n\t$self->{NOECHO}\$(NOOP)\n\n";
+
+    # strip blanks
+    if ($self->{VERSION}) {
+       $self->{VERSION} =~ s/^\s+//;
+       $self->{VERSION} =~ s/\s+$//;
     }
-    join "", @m;
-}
 
-=item post_constants (o)
+    $self->{VERSION} ||= "0.10";
+    ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
 
-Returns an empty string per default. Dedicated to overrides from
-within Makefile.PL after all constants have been defined.
 
-=cut
+    # Graham Barr and Paul Marquess had some ideas how to ensure
+    # version compatibility between the *.pm file and the
+    # corresponding *.xs file. The bottomline was, that we need an
+    # XS_VERSION macro that defaults to VERSION:
+    $self->{XS_VERSION} ||= $self->{VERSION};
 
-sub post_constants{
-    my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
+    # --- Initialize Perl Binary Locations
+
+    # Find Perl 5. The only contract here is that both 'PERL' and 'FULLPERL'
+    # will be working versions of perl 5. miniperl has priority over perl
+    # for PERL to ensure that $(PERL) is usable while building ./ext/*
+    my ($component,@defpath);
+    foreach $component ($self->{PERL_SRC}, $self->path(), $Config::Config{binexp}) {
+       push @defpath, $component if defined $component;
     }
-    "";
+    $self->{PERL} =
+        $self->find_perl(5.0, [ $^X, 'miniperl','perl','perl5',"perl$]" ],
+           \@defpath, $Verbose ) unless ($self->{PERL});
+    # don't check if perl is executable, maybe they have decided to
+    # supply switches with perl
+
+    # Define 'FULLPERL' to be a non-miniperl (used in test: target)
+    ($self->{FULLPERL} = $self->{PERL}) =~ s/miniperl/perl/i
+       unless ($self->{FULLPERL});
 }
 
-=item pasthru (o)
+=item init_others
 
-Defines the string that is passed to recursive make calls in
-subdirectories.
+Initializes EXTRALIBS, BSLOADLIBS, LDLOADLIBS, LIBS, LD_RUN_PATH,
+OBJECT, BOOTDEP, PERLMAINCC, LDFROM, LINKTYPE, NOOP, FIRST_MAKEFILE,
+MAKEFILE, NOECHO, RM_F, RM_RF, TOUCH, CP, MV, CHMOD, UMASK_NULL
 
 =cut
 
-sub pasthru {
+sub init_others {      # --- Initialize Other Attributes
     my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    my(@m,$key);
 
-    my(@pasthru);
+    # Compute EXTRALIBS, BSLOADLIBS and LDLOADLIBS from $self->{LIBS}
+    # Lets look at $self->{LIBS} carefully: It may be an anon array, a string or
+    # undefined. In any case we turn it into an anon array:
 
-# We don't have to pass thru the install thingies anymore: make
-# install is run in base directory only:
+    # May check $Config{libs} too, thus not empty.
+    $self->{LIBS}=[''] unless $self->{LIBS};
 
-#    foreach $key (qw(INSTALLPRIVLIB INSTALLARCHLIB INSTALLBIN
-#                   INSTALLMAN1DIR INSTALLMAN3DIR LIBPERL_A
-#                   LINKTYPE PREFIX INSTALLSITELIB
-#                   INSTALLSITEARCH INSTALLDIRS)){
+    $self->{LIBS}=[$self->{LIBS}] if ref \$self->{LIBS} eq SCALAR;
+    $self->{LD_RUN_PATH} = "";
+    my($libs);
+    foreach $libs ( @{$self->{LIBS}} ){
+       $libs =~ s/^\s*(.*\S)\s*$/$1/; # remove leading and trailing whitespace
+       my(@libs) = $self->extliblist($libs);
+       if ($libs[0] or $libs[1] or $libs[2]){
+           # LD_RUN_PATH now computed by ExtUtils::Liblist
+           ($self->{EXTRALIBS}, $self->{BSLOADLIBS}, $self->{LDLOADLIBS}, $self->{LD_RUN_PATH}) = @libs;
+           last;
+       }
+    }
 
-    foreach $key (qw(LIBPERL_A LINKTYPE PREFIX OPTIMIZE)){
-       push @pasthru, "$key=\"\$($key)\"";
+    if ( $self->{OBJECT} ) {
+       $self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g;
+    } else {
+       # init_dirscan should have found out, if we have C files
+       $self->{OBJECT} = "";
+       $self->{OBJECT} = '$(BASEEXT)$(OBJ_EXT)' if @{$self->{C}||[]};
     }
+    $self->{OBJECT} =~ s/\n+/ \\\n\t/g;
+    $self->{BOOTDEP}  = (-f "$self->{BASEEXT}_BS") ? "$self->{BASEEXT}_BS" : "";
+    $self->{PERLMAINCC} ||= '$(CC)';
+    $self->{LDFROM} = '$(OBJECT)' unless $self->{LDFROM};
 
-    push @m, "\nPASTHRU = ", join ("\\\n\t", @pasthru), "\n";
-    join "", @m;
+    # Sanity check: don't define LINKTYPE = dynamic if we're skipping
+    # the 'dynamic' section of MM.  We don't have this problem with
+    # 'static', since we either must use it (%Config says we can't
+    # use dynamic loading) or the caller asked for it explicitly.
+    if (!$self->{LINKTYPE}) {
+       $self->{LINKTYPE} = $self->{SKIPHASH}{'dynamic'}
+                        ? 'static'
+                        : ($Config::Config{usedl} ? 'dynamic' : 'static');
+    };
+
+    # These get overridden for VMS and maybe some other systems
+    $self->{NOOP}  ||= "sh -c true";
+    $self->{FIRST_MAKEFILE} ||= "Makefile";
+    $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE};
+    $self->{MAKE_APERL_FILE} ||= "Makefile.aperl";
+    $self->{NOECHO} = '@' unless defined $self->{NOECHO};
+    $self->{RM_F}  ||= "rm -f";
+    $self->{RM_RF} ||= "rm -rf";
+    $self->{TOUCH} ||= "touch";
+    $self->{CP} ||= "cp";
+    $self->{MV} ||= "mv";
+    $self->{CHMOD} ||= "chmod";
+    $self->{UMASK_NULL} ||= "umask 0";
 }
 
-=item c_o (o)
+=item install (o)
 
-Defines the suffix rules to compile different flavors of C files to
-object files.
+Defines the install target.
 
 =cut
 
-sub c_o {
-# --- Translation Sections ---
-
-    my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    return '' unless $self->needs_linking();
+sub install {
+    my($self, %attribs) = @_;
     my(@m);
-    push @m, '
-.c$(OBJ_EXT):
-       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
-
-.C$(OBJ_EXT):
-       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.C
-
-.cpp$(OBJ_EXT):
-       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cpp
-
-.cxx$(OBJ_EXT):
-       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cxx
 
-.cc$(OBJ_EXT):
-       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cc
-';
-    join "", @m;
-}
+    push @m, q{
+install :: all pure_install doc_install
 
-=item xs_c (o)
+install_perl :: all pure_perl_install doc_perl_install
 
-Defines the suffix rules to compile XS files to C.
+install_site :: all pure_site_install doc_site_install
 
-=cut
+install_ :: install_site
+       @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
 
-sub xs_c {
-    my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    return '' unless $self->needs_linking();
-    '
-.xs.c:
-       $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >$*.tc && mv $*.tc $@
-';
-}
+pure_install :: pure_$(INSTALLDIRS)_install
 
-=item xs_o (o)
+doc_install :: doc_$(INSTALLDIRS)_install
+       }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
 
-Defines suffix rules to go from XS to object files directly. This is
-only intended for broken make implementations.
+pure__install : pure_site_install
+       @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
 
-=cut
+doc__install : doc_site_install
+       @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
 
-sub xs_o {     # many makes are too dumb to use xs_c then c_o
-    my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    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
-       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
-';
-}
+pure_perl_install ::
+       }.$self->{NOECHO}.q{$(MOD_INSTALL) \
+               read }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
+               write }.$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
+               $(INST_LIB) $(INSTALLPRIVLIB) \
+               $(INST_ARCHLIB) $(INSTALLARCHLIB) \
+               $(INST_BIN) $(INSTALLBIN) \
+               $(INST_SCRIPT) $(INSTALLSCRIPT) \
+               $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
+               $(INST_MAN3DIR) $(INSTALLMAN3DIR)
+       }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
+               }.$self->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{
 
-=item top_targets (o)
 
-Defines the targets all, subdirs, config, and O_FILES
+pure_site_install ::
+       }.$self->{NOECHO}.q{$(MOD_INSTALL) \
+               read }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \
+               write }.$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{ \
+               $(INST_LIB) $(INSTALLSITELIB) \
+               $(INST_ARCHLIB) $(INSTALLSITEARCH) \
+               $(INST_BIN) $(INSTALLBIN) \
+               $(INST_SCRIPT) $(INSTALLSCRIPT) \
+               $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
+               $(INST_MAN3DIR) $(INSTALLMAN3DIR)
+       }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
+               }.$self->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{
 
-=cut
+doc_perl_install ::
+       }.$self->{NOECHO}.q{$(DOC_INSTALL) \
+               "$(NAME)" \
+               "installed into" "$(INSTALLPRIVLIB)" \
+               LINKTYPE "$(LINKTYPE)" \
+               VERSION "$(VERSION)" \
+               EXE_FILES "$(EXE_FILES)" \
+               >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
 
-sub top_targets {
-# --- Target Sections ---
+doc_site_install ::
+       }.$self->{NOECHO}.q{$(DOC_INSTALL) \
+               "Module $(NAME)" \
+               "installed into" "$(INSTALLSITELIB)" \
+               LINKTYPE "$(LINKTYPE)" \
+               VERSION "$(VERSION)" \
+               EXE_FILES "$(EXE_FILES)" \
+               >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
 
-    my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    my(@m);
-    push @m, '
-#all ::        config $(INST_PM) subdirs linkext manifypods
+};
 
-all :: pure_all manifypods
-       '.$self->{NOECHO}.'$(NOOP)
+    push @m, q{
+uninstall :: uninstall_from_$(INSTALLDIRS)dirs
 
-pure_all :: config pm_to_blib subdirs linkext
-       '.$self->{NOECHO}.'$(NOOP)
+uninstall_from_perldirs ::
+       }.$self->{NOECHO}.
+       q{$(UNINSTALL) }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{
 
-subdirs :: $(MYEXTLIB)
-       '.$self->{NOECHO}.'$(NOOP)
+uninstall_from_sitedirs ::
+       }.$self->{NOECHO}.
+       q{$(UNINSTALL) }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{
+};
 
-config :: '.$self->{MAKEFILE}.' $(INST_LIBDIR)/.exists
-       '.$self->{NOECHO}.'$(NOOP)
+    join("",@m);
+}
 
-config :: $(INST_ARCHAUTODIR)/.exists
-       '.$self->{NOECHO}.'$(NOOP)
+=item installbin (o)
 
-config :: $(INST_AUTODIR)/.exists
-       '.$self->{NOECHO}.'$(NOOP)
-';
+Defines targets to install EXE_FILES.
 
-    push @m, qq{
-config :: Version_check
-       $self->{NOECHO}\$(NOOP)
+=cut
 
-} unless $self->{PARENT} or ($self->{PERL_SRC} && $self->{INSTALLDIRS} eq "perl") or $self->{NO_VC};
+sub installbin {
+    my($self) = shift;
+    return "" unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
+    return "" unless @{$self->{EXE_FILES}};
+    my(@m, $from, $to, %fromto, @to);
+    push @m, $self->dir_target(qw[$(INST_SCRIPT)]);
+    for $from (@{$self->{EXE_FILES}}) {
+       my($path)= $self->catfile('$(INST_SCRIPT)', basename($from));
+       local($_) = $path; # for backwards compatibility
+       $to = $self->libscan($path);
+       print "libscan($from) => '$to'\n" if ($Verbose >=2);
+       $fromto{$from}=$to;
+    }
+    @to   = values %fromto;
+    push(@m, "
+EXE_FILES = @{$self->{EXE_FILES}}
 
-    push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
+all :: @to
 
-    if (%{$self->{MAN1PODS}}) {
-       push @m, qq[
-config :: \$(INST_MAN1DIR)/.exists
-       $self->{NOECHO}\$(NOOP)
+realclean ::
+       $self->{RM_F} @to
+");
 
-];
-       push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
+    while (($from,$to) = each %fromto) {
+       last unless defined $from;
+       my $todir = dirname($to);
+       push @m, "
+$to: $from $self->{MAKEFILE} $todir/.exists
+       $self->{NOECHO}$self->{RM_F} $to
+       $self->{CP} $from $to
+";
     }
-    if (%{$self->{MAN3PODS}}) {
-       push @m, qq[
-config :: \$(INST_MAN3DIR)/.exists
-       $self->{NOECHO}\$(NOOP)
+    join "", @m;
+}
 
-];
-       push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
-    }
+=item libscan (o)
 
-    push @m, '
-$(O_FILES): $(H_FILES)
-' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
+Takes a path to a file that is found by init_dirscan and returns false
+if we don't want to include this file in the library. Mainly used to
+exclude RCS, CVS, and SCCS directories from installation.
 
-    push @m, q{
-help:
-       perldoc ExtUtils::MakeMaker
-};
+=cut
 
-    push @m, q{
-Version_check:
-       }.$self->{NOECHO}.q{$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
-               -MExtUtils::MakeMaker=Version_check \
-               -e 'Version_check("$(MM_VERSION)")'
-};
+# ';
 
-    join('',@m);
+sub libscan {
+    my($self,$path) = @_;
+    return '' if $path =~ m:\b(RCS|CVS|SCCS)\b: ;
+    $path;
 }
 
 =item linkext (o)
@@ -1941,10 +1860,6 @@ Defines the linkext target which in turn defines the LINKTYPE.
 
 sub linkext {
     my($self, %attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     # LINKTYPE => static or dynamic or ''
     my($linktype) = defined $attribs{LINKTYPE} ?
       $attribs{LINKTYPE} : '$(LINKTYPE)';
@@ -1954,278 +1869,297 @@ linkext :: $linktype
 ";
 }
 
-=item dlsyms (o)
+=item lsdir
 
-Used by AIX and VMS to define DL_FUNCS and DL_VARS and write the *.exp
-files.
+Takes as arguments a directory name and a regular expression. Returns
+all entries in the directory that match the regular expression.
 
 =cut
 
-sub dlsyms {
+sub lsdir {
+    my($self) = shift;
+    my($dir, $regex) = @_;
+    my(@ls);
+    my $dh = new DirHandle;
+    $dh->open($dir || ".") or return ();
+    @ls = $dh->read;
+    $dh->close;
+    @ls = grep(/$regex/, @ls) if $regex;
+    @ls;
+}
+
+=item macro (o)
+
+Simple subroutine to insert the macros defined by the macro attribute
+into the Makefile.
+
+=cut
+
+sub macro {
     my($self,%attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
+    my(@m,$key,$val);
+    while (($key,$val) = each %attribs){
+       last unless defined $key;
+       push @m, "$key = $val\n";
     }
+    join "", @m;
+}
 
-    return '' unless ($^O eq 'aix' && $self->needs_linking() );
+=item makeaperl (o)
 
-    my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
-    my($vars)  = $attribs{DL_VARS} || $self->{DL_VARS} || [];
+Called by staticmake. Defines how to write the Makefile to produce a
+static new perl.
+
+=cut
+
+sub makeaperl {
+    my($self, %attribs) = @_;
+    my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
+       @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
     my(@m);
+    push @m, "
+# --- MakeMaker makeaperl section ---
+MAP_TARGET    = $target
+FULLPERL      = $self->{FULLPERL}
+";
+    return join '', @m if $self->{PARENT};
 
-    push(@m,"
-dynamic :: $self->{BASEEXT}.exp
+    my($dir) = join ":", @{$self->{DIR}};
 
-") unless $self->{SKIPHASH}{'dynamic'}; # dynamic and static are subs, so...
+    unless ($self->{MAKEAPERL}) {
+       push @m, q{
+$(MAP_TARGET) :: static $(MAKE_APERL_FILE)
+       $(MAKE) -f $(MAKE_APERL_FILE) $@
 
-    push(@m,"
-static :: $self->{BASEEXT}.exp
+$(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) \
+               Makefile.PL DIR=}, $dir, q{ \
+               MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
+               MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=};
 
-") unless $self->{SKIPHASH}{'static'};  # we avoid a warning if we tick them
+       foreach (@ARGV){
+               if( /\s/ ){
+                       s/=(.*)/='$1'/;
+               }
+               push @m, " \\\n\t\t$_";
+       }
+#      push @m, map( " \\\n\t\t$_", @ARGV );
+       push @m, "\n";
 
-    push(@m,"
-$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), ');\'
-');
+       return join '', @m;
+    }
 
-    join('',@m);
-}
 
-=item dynamic (o)
 
-Defines the dynamic target.
+    my($cccmd, $linkcmd, $lperl);
 
-=cut
 
-sub dynamic {
-# --- Dynamic Loading Sections ---
+    $cccmd = $self->const_cccmd($libperl);
+    $cccmd =~ s/^CCCMD\s*=\s*//;
+    $cccmd =~ s/\$\(INC\)/ -I$self->{PERL_INC} /;
+    $cccmd .= " $Config::Config{cccdlflags}" if ($Config::Config{d_shrplib});
+    $cccmd =~ s/\(CC\)/\(PERLMAINCC\)/;
 
-    my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    '
-## $(INST_PM) has been moved to the all: target.
-## It remains here for awhile to allow for old usage: "make dynamic"
-#dynamic :: '.$self->{MAKEFILE}.' $(INST_DYNAMIC) $(INST_BOOT) $(INST_PM)
-dynamic :: '.$self->{MAKEFILE}.' $(INST_DYNAMIC) $(INST_BOOT)
-       '.$self->{NOECHO}.'$(NOOP)
-';
-}
+    # The front matter of the linkcommand...
+    $linkcmd = join ' ', "\$(CC)",
+           grep($_, @Config{qw(large split ldflags ccdlflags)});
+    $linkcmd =~ s/\s+/ /g;
 
-=item dynamic_bs (o)
+    # Which *.a files could we make use of...
+    local(%static);
+    require File::Find;
+    File::Find::find(sub {
+       return unless m/\Q$self->{LIB_EXT}\E$/;
+       return if m/^libperl/;
 
-Defines targets for bootstrap files.
+       if( exists $self->{INCLUDE_EXT} ){
+               my $found = 0;
+               my $incl;
+               my $xx;
+
+               ($xx = $File::Find::name) =~ s,.*?/auto/,,;
+               $xx =~ s,/?$_,,;
+               $xx =~ s,/,::,g;
+
+               # Throw away anything not explicitly marked for inclusion.
+               # DynaLoader is implied.
+               foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
+                       if( $xx eq $incl ){
+                               $found++;
+                               last;
+                       }
+               }
+               return unless $found;
+       }
+       elsif( exists $self->{EXCLUDE_EXT} ){
+               my $excl;
+               my $xx;
 
-=cut
+               ($xx = $File::Find::name) =~ s,.*?/auto/,,;
+               $xx =~ s,/?$_,,;
+               $xx =~ s,/,::,g;
 
-sub dynamic_bs {
-    my($self, %attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
+               # Throw away anything explicitly marked for exclusion
+               foreach $excl (@{$self->{EXCLUDE_EXT}}){
+                       return if( $xx eq $excl );
+               }
+       }
+
+       # don't include the installed version of this extension. I
+       # leave this line here, although it is not necessary anymore:
+       # I patched minimod.PL instead, so that Miniperl.pm won't
+       # enclude duplicates
+
+       # 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}$:;
+       use Cwd 'cwd';
+       $static{cwd() . "/" . $_}++;
+    }, grep( -d $_, @{$searchdirs || []}) );
+
+    # We trust that what has been handed in as argument, will be buildable
+    $static = [] unless $static;
+    @static{@{$static}} = (1) x @{$static};
+
+    $extra = [] unless $extra && ref $extra eq 'ARRAY';
+    for (sort keys %static) {
+       next unless /\Q$self->{LIB_EXT}\E$/;
+       $_ = dirname($_) . "/extralibs.ld";
+       push @$extra, $_;
     }
-    return '
-BOOTSTRAP =
-' unless $self->has_link_code();
 
-    return '
-BOOTSTRAP = '."$self->{BASEEXT}.bs".'
+    grep(s/^/-I/, @{$perlinc || []});
 
-# As Mkbootstrap might not write a file (if none is required)
-# we use touch to prevent make continually trying to remake it.
-# 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)" \
-               -e \'use ExtUtils::Mkbootstrap;\' \
-               -e \'Mkbootstrap("$(BASEEXT)","$(BSLOADLIBS)");\'
-       '.$self->{NOECHO}.'$(TOUCH) $(BOOTSTRAP)
-       $(CHMOD) 644 $@
+    $target = "perl" unless $target;
+    $tmp = "." unless $tmp;
 
-$(INST_BOOT): $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists
-       '."$self->{NOECHO}$self->{RM_RF}".' $(INST_BOOT)
-       -'.$self->{CP}.' $(BOOTSTRAP) $(INST_BOOT)
-       $(CHMOD) 644 $@
-';
-}
+# MAP_STATIC doesn't look into subdirs yet. Once "all" is made and we
+# regenerate the Makefiles, MAP_STATIC and the dependencies for
+# extralibs.all are computed correctly
+    push @m, "
+MAP_LINKCMD   = $linkcmd
+MAP_PERLINC   = @{$perlinc || []}
+MAP_STATIC    = ",
+join(" \\\n\t", reverse sort keys %static), "
 
-=item dynamic_lib (o)
+MAP_PRELIBS   = $Config::Config{libs} $Config::Config{cryptlib}
+";
+
+    if (defined $libperl) {
+       ($lperl = $libperl) =~ s/\$\(A\)/$self->{LIB_EXT}/;
+    }
+    unless ($libperl && -f $lperl) { # Ilya's code...
+       my $dir = $self->{PERL_SRC} || "$self->{PERL_ARCHLIB}/CORE";
+       $libperl ||= "libperl$self->{LIB_EXT}";
+       $libperl   = "$dir/$libperl";
+       $lperl   ||= "libperl$self->{LIB_EXT}";
+       $lperl     = "$dir/$lperl";
+       print STDOUT "Warning: $libperl not found
+    If you're going to build a static perl binary, make sure perl is installed
+    otherwise ignore this warning\n"
+               unless (-f $lperl || defined($self->{PERL_SRC}));
+    }
 
-Defines how to produce the *.so (or equivalent) files.
+    push @m, "
+MAP_LIBPERL = $libperl
+";
 
-=cut
+    push @m, "
+\$(INST_ARCHAUTODIR)/extralibs.all: \$(INST_ARCHAUTODIR)/.exists ".join(" \\\n\t", @$extra)."
+       $self->{NOECHO}$self->{RM_F} \$\@
+       $self->{NOECHO}\$(TOUCH) \$\@
+";
 
-sub dynamic_lib {
-    my($self, %attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
+    my $catfile;
+    foreach $catfile (@$extra){
+       push @m, "\tcat $catfile >> \$\@\n";
     }
-    return '' unless $self->needs_linking(); #might be because of a subdir
 
-    return '' unless $self->has_link_code;
+    push @m, "
+\$(MAP_TARGET) :: $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) \$(INST_ARCHAUTODIR)/extralibs.all
+       \$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE) $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) `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'
+       $self->{NOECHO}echo '    make -f $makefilename map_clean'
 
-    my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
-    my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
-    my($armaybe) = $attribs{ARMAYBE} || $self->{ARMAYBE} || ":";
-    my($ldfrom) = '$(LDFROM)';
-    $armaybe = 'ar' if ($^O eq 'dec_osf' and $armaybe eq ':');
-    my(@m);
-    push(@m,'
-# This section creates the dynamically loadable $(INST_DYNAMIC)
-# from $(OBJECT) and possibly $(MYEXTLIB).
-ARMAYBE = '.$armaybe.'
-OTHERLDFLAGS = '.$otherldflags.'
-INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
+$tmp/perlmain\$(OBJ_EXT): $tmp/perlmain.c
+";
+    push @m, "\tcd $tmp && $cccmd -I\$(PERL_INC) perlmain.c\n";
 
-$(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
-');
-    if ($armaybe ne ':'){
-       $ldfrom = 'tmp$(LIB_EXT)';
-       push(@m,'       $(ARMAYBE) cr '.$ldfrom.' $(OBJECT)'."\n");
-       push(@m,'       $(RANLIB) '."$ldfrom\n");
-    }
-    $ldfrom = "-all $ldfrom -none" if ($^O eq 'dec_osf');
-    push(@m,'  LD_RUN_PATH="$(LD_RUN_PATH)" $(LD) -o $@ $(LDDLFLAGS) '.$ldfrom.
-               ' $(OTHERLDFLAGS) $(MYEXTLIB) $(LDLOADLIBS) $(EXPORT_LIST) $(PERL_ARCHIVE)');
-    push @m, '
-       $(CHMOD) 755 $@
-';
+    push @m, qq{
+$tmp/perlmain.c: $makefilename}, q{
+       }.$self->{NOECHO}.q{echo Writing $@
+       }.$self->{NOECHO}.q{$(PERL) $(MAP_PERLINC) -e 'use ExtUtils::Miniperl; \\
+               writemain(grep s#.*/auto/##, qw|$(MAP_STATIC)|)' > $@.tmp && mv $@.tmp $@
 
-    push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
-    join('',@m);
-}
+};
 
-=item static (o)
+    push @m, q{
+doc_inst_perl:
+       }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
+       }.$self->{NOECHO}.q{$(DOC_INSTALL) \
+               "Perl binary $(MAP_TARGET)" \
+               MAP_STATIC "$(MAP_STATIC)" \
+               MAP_EXTRA "`cat $(INST_ARCHAUTODIR)/extralibs.all`" \
+               MAP_LIBPERL "$(MAP_LIBPERL)" \
+               >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
 
-Defines the static target.
+};
 
-=cut
+    push @m, q{
+inst_perl: pure_inst_perl doc_inst_perl
 
-sub static {
-# --- Static Loading Sections ---
+pure_inst_perl: $(MAP_TARGET)
+       }.$self->{CP}.q{ $(MAP_TARGET) }.$self->catfile('$(INSTALLBIN)','$(MAP_TARGET)').q{
 
-    my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    '
-## $(INST_PM) has been moved to the all: target.
-## It remains here for awhile to allow for old usage: "make static"
-#static :: '.$self->{MAKEFILE}.' $(INST_STATIC) $(INST_PM)
-static :: '.$self->{MAKEFILE}.' $(INST_STATIC)
-       '.$self->{NOECHO}.'$(NOOP)
-';
+clean :: map_clean
+
+map_clean :
+       }.$self->{RM_F}.qq{ $tmp/perlmain\$(OBJ_EXT) $tmp/perlmain.c \$(MAP_TARGET) $makefilename \$(INST_ARCHAUTODIR)/extralibs.all
+};
+
+    join '', @m;
 }
 
-=item static_lib (o)
+=item makefile (o)
 
-Defines how to produce the *.a (or equivalent) files.
+Defines how to rewrite the Makefile.
 
 =cut
 
-sub static_lib {
-    my($self) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-# Come to think of it, if there are subdirs with linkcode, we still have no INST_STATIC
-#    return '' unless $self->needs_linking(); #might be because of a subdir
-
-    return '' unless $self->has_link_code;
+sub makefile {
+    my($self) = shift;
+    my @m;
+    # We do not know what target was originally specified so we
+    # must force a manual rerun to be sure. But as it should only
+    # happen very rarely it is not a significant problem.
+    push @m, '
+$(OBJECT) : $(FIRST_MAKEFILE)
+' if $self->{OBJECT};
 
-    my(@m);
-    push(@m, <<'END');
-$(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)/.exists
-END
-    # If this extension has it's 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};
+    push @m, q{
+# We take a very conservative approach here, but it\'s worth it.
+# We move Makefile to Makefile.old here to avoid gnu make looping.
+}.$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{mv }."$self->{MAKEFILE} $self->{MAKEFILE}.old".q{
+       -$(MAKE) -f }.$self->{MAKEFILE}.q{.old clean >/dev/null 2>&1 || true
+       $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" 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
 
-    push @m,
-q{     $(AR) $(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@
-       }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)/extralibs.ld
-       $(CHMOD) 755 $@
+# To change behavior to :: would be nice, but would break Tk b9.02
+# so you find such a warning below the dist target.
+#}.$self->{MAKEFILE}.q{ :: $(VERSION_FROM)
+#      }.$self->{NOECHO}.q{echo "Warning: Makefile possibly out of date with $(VERSION_FROM)"
 };
 
-# Old mechanism - still available:
-
-    push @m, "\t$self->{NOECHO}".q{echo "$(EXTRALIBS)" >> $(PERL_SRC)/ext.libs}."\n\n"
-       if $self->{PERL_SRC};
-
-    push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
-    join('', "\n",@m);
+    join "", @m;
 }
 
-# =item installpm
-#
-# Cares for copying and autosplitting the files in PM (which may be more
-# than just *.pm files) into the INST_* directories.
-#
-# =cut
-#
-# sub installpm {
-#     my($self, %attribs) = @_;
-#     unless (ref $self){
-#        ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-#        $self = $ExtUtils::MakeMaker::Parent[-1];
-#     }
-#     # By default .pm files are split into the architecture independent
-#     # library. This is a good thing. If a specific module requires that
-#     # its .pm files are split into the architecture specific library
-#     # then it should use: installpm => {SPLITLIB=>'$(INST_ARCHLIB)'}
-#     # Note that installperl currently interferes with this (Config.pm)
-#     # User can disable split by saying: installpm => {SPLITLIB=>''}
-#     my($splitlib) = '$(INST_LIB)'; # NOT arch specific by default
-#     $splitlib = $attribs{SPLITLIB} if exists $attribs{SPLITLIB};
-#     my(@m, $dist);
-#     push @m, "inst_pm :: \$(INST_PM)\n\n";
-#     foreach $dist (sort keys %{$self->{PM}}){
-#        my($inst) = $self->{PM}->{$dist};
-#        push(@m, "\n# installpm: $dist => $inst, splitlib=$splitlib\n");
-#        push(@m, $self->installpm_x($dist, $inst, $splitlib));
-#        push(@m, "\n");
-#     }
-#     join('', @m);
-# }
-#
-# =item installpm_x
-#
-# Helper subroutine to installpm.
-#
-# =cut
-#
-# sub installpm_x { # called by installpm per file
-#     my($self, $dist, $inst, $splitlib) = @_;
-#     unless (ref $self){
-#        ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-#        $self = $ExtUtils::MakeMaker::Parent[-1];
-#     }
-#     if ($inst =~ m,[:\#],){
-#        warn "Warning: 'make' would have problems processing this file: '$inst', SKIPPED\n";
-#        return '';
-#     }
-#     my($instdir) = $inst =~ m|(.*)/|;
-#     my(@m);
-#     push(@m,"
-# $inst: $dist $self->{FIRST_MAKEFILE} $instdir/.exists \$(INST_ARCHAUTODIR)/.exists
-#        $self->{NOECHO}$self->{RM_F}".' $@
-#        $(UMASK_NULL) && '."$self->{CP} $dist".' $@
-# ');
-#     push(@m, "\t$self->{NOECHO}\$(AUTOSPLITFILE) \$@ $splitlib/auto\n")
-#        if ($splitlib and $inst =~ m/\.pm$/);
-#
-#     push @m, $self->dir_target($instdir);
-#     join('', @m);
-# }
-
 =item manifypods (o)
 
 Defines targets and routines to translate the pods into manpages and
@@ -2235,17 +2169,13 @@ put them into the INST_* directories.
 
 sub manifypods {
     my($self, %attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    return "\nmanifypods :\n" unless %{$self->{MAN3PODS}};
+    return "\nmanifypods :\n\t$self->{NOECHO}\$(NOOP)\n" unless %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
     my($dist);
     my($pod2man_exe);
     if (defined $self->{PERL_SRC}) {
        $pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
     } else {
-       $pod2man_exe = $self->catfile($Config{bin},'pod2man');
+       $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
     }
     unless ($self->perl_script($pod2man_exe)) {
        # No pod2man but some MAN3PODS to be installed
@@ -2263,573 +2193,433 @@ 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[";' \\
 -e 'print "Manifying $$m{$$_}\n";' \\
--e 'system("$$^X \\"-I$(PERL_ARCHLIB)\\" \\"-I$(PERL_LIB)\\" $(POD2MAN_EXE) $$_>$$m{$$_}")==0 or warn "Couldn\\047t install $$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";}'
 ];
     push @m, "\nmanifypods : ";
     push @m, join " \\\n\t", keys %{$self->{MAN1PODS}}, keys %{$self->{MAN3PODS}};
-
-    push(@m,"\n");
-    if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
-       push @m, "\t$self->{NOECHO}\$(POD2MAN) \\\n\t";
-       push @m, join " \\\n\t", %{$self->{MAN1PODS}}, %{$self->{MAN3PODS}};
-    }
-    join('', @m);
-}
-
-=item processPL (o)
-
-Defines targets to run *.PL files.
-
-=cut
-
-sub processPL {
-    my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    return "" unless $self->{PL_FILES};
-    my(@m, $plfile);
-    foreach $plfile (sort keys %{$self->{PL_FILES}}) {
-       push @m, "
-all :: $self->{PL_FILES}->{$plfile}
-
-$self->{PL_FILES}->{$plfile} :: $plfile
-       \$(PERL) -I\$(INST_ARCHLIB) -I\$(INST_LIB) -I\$(PERL_ARCHLIB) -I\$(PERL_LIB) $plfile
-";
-    }
-    join "", @m;
-}
-
-=item installbin (o)
-
-Defines targets to install EXE_FILES.
-
-=cut
-
-sub installbin {
-    my($self) = shift;
-    return "" unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
-    return "" unless @{$self->{EXE_FILES}};
-    my(@m, $from, $to, %fromto, @to);
-    push @m, $self->dir_target(qw[$(INST_EXE)]);
-    for $from (@{$self->{EXE_FILES}}) {
-       my($path)= '$(INST_EXE)/' . basename($from);
-       local($_) = $path; # for backwards compatibility
-       $to = $self->libscan($path);
-       print "libscan($from) => '$to'\n" if ($Verbose >=2);
-       $fromto{$from}=$to;
-    }
-    @to   = values %fromto;
-    push(@m, "
-EXE_FILES = @{$self->{EXE_FILES}}
-
-all :: @to
-
-realclean ::
-       $self->{RM_F} @to
-");
-
-    while (($from,$to) = each %fromto) {
-       last unless defined $from;
-       my $todir = dirname($to);
-       push @m, "
-$to: $from $self->{MAKEFILE} $todir/.exists
-       $self->{NOECHO}$self->{RM_F} $to
-       $self->{CP} $from $to
-";
-    }
-    join "", @m;
-}
-
-=item subdirs (o)
-
-Defines targets to process subdirectories.
-
-=cut
-
-sub subdirs {
-# --- Sub-directory Sections ---
-    my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    my(@m,$dir);
-    # This method provides a mechanism to automatically deal with
-    # subdirectories containing further Makefile.PL scripts.
-    # It calls the subdir_x() method for each subdirectory.
-    foreach $dir (@{$self->{DIR}}){
-       push(@m, $self->subdir_x($dir));
-####   print "Including $dir subdirectory\n";
-    }
-    if (@m){
-       unshift(@m, "
-# The default clean, realclean and test targets in this Makefile
-# have automatically been given entries for each subdir.
-
-");
-    } else {
-       push(@m, "\n# none")
+
+    push(@m,"\n");
+    if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
+       push @m, "\t$self->{NOECHO}\$(POD2MAN) \\\n\t";
+       push @m, join " \\\n\t", %{$self->{MAN1PODS}}, %{$self->{MAN3PODS}};
     }
-    join('',@m);
+    join('', @m);
 }
 
-=item subdir_x (o)
+=item maybe_command
 
-Helper subroutine for subdirs
+Returns true, if the argument is likely to be a command.
 
 =cut
 
-sub subdir_x {
-    my($self, $subdir) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    my(@m);
-    qq{
-
-subdirs ::
-       $self->{NOECHO}-cd $subdir && \$(MAKE) all \$(PASTHRU)
-
-};
+sub maybe_command {
+    my($self,$file) = @_;
+    return $file if -x $file && ! -d $file;
+    return;
 }
 
-=item clean (o)
+=item maybe_command_in_dirs
 
-Defines the clean target.
+method under development. Not yet used. Ask Ilya :-)
 
 =cut
 
-sub clean {
-# --- Cleanup and Distribution Sections ---
-
-    my($self, %attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    my(@m,$dir);
-    push(@m, '
-# Delete temporary files but do not touch installed files. We don\'t delete
-# the Makefile here so a later make realclean still has a makefile to use.
-
-clean ::
-');
-    # clean subdirectories first
-    for $dir (@{$self->{DIR}}) {
-       push @m, "\t-cd $dir && test -f $self->{MAKEFILE} && \$(MAKE) clean\n";
+sub maybe_command_in_dirs {    # $ver is optional argument if looking for perl
+# Ilya's suggestion. Not yet used, want to understand it first, but at least the code is here
+    my($self, $names, $dirs, $trace, $ver) = @_;
+    my($name, $dir);
+    foreach $dir (@$dirs){
+       next unless defined $dir; # $self->{PERL_SRC} may be undefined
+       foreach $name (@$names){
+           my($abs,$tryabs);
+           if ($self->file_name_is_absolute($name)) { # /foo/bar
+               $abs = $name;
+           } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # bar
+               $abs = $self->catfile($dir, $name);
+           } else { # foo/bar
+               $abs = $self->catfile($self->curdir, $name);
+           }
+           print "Checking $abs for $name\n" if ($trace >= 2);
+           next unless $tryabs = $self->maybe_command($abs);
+           print "Substituting $tryabs instead of $abs\n"
+               if ($trace >= 2 and $tryabs ne $abs);
+           $abs = $tryabs;
+           if (defined $ver) {
+               print "Executing $abs\n" if ($trace >= 2);
+               if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
+                   print "Using PERL=$abs\n" if $trace;
+                   return $abs;
+               }
+           } else { # Do not look for perl
+               return $abs;
+           }
+       }
     }
-
-    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
-                        $(BOOTSTRAP) $(BASEEXT).bso $(BASEEXT).def
-                        $(BASEEXT).exp
-                       ]);
-    push @m, "\t-$self->{RM_RF} @otherfiles\n";
-    # See realclean and ext/utils/make_ext for usage of Makefile.old
-    push(@m,
-        "\t-$self->{MV} $self->{MAKEFILE} $self->{MAKEFILE}.old 2>/dev/null\n");
-    push(@m,
-        "\t$attribs{POSTOP}\n")   if $attribs{POSTOP};
-    join("", @m);
 }
 
-=item realclean (o)
+=item needs_linking (o)
 
-Defines the realclean target.
+Does this module need linking? Looks into subdirectory objects (see
+also has_link_code())
 
 =cut
 
-sub realclean {
-    my($self, %attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
+sub needs_linking {
+    my($self) = shift;
+    my($child,$caller);
+    $caller = (caller(0))[3];
+    Carp::confess("Needs_linking called too early") if $caller =~ /^ExtUtils::MakeMaker::/;
+    return $self->{NEEDS_LINKING} if defined $self->{NEEDS_LINKING};
+    if ($self->has_link_code or $self->{MAKEAPERL}){
+       $self->{NEEDS_LINKING} = 1;
+       return 1;
     }
-    my(@m);
-    push(@m,'
-# Delete temporary files (via clean) and also delete installed files
-realclean purge ::  clean
-');
-    # realclean subdirectories first (already cleaned)
-    my $sub = "\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}",''));
+    foreach $child (keys %{$self->{CHILDREN}}) {
+       if ($self->{CHILDREN}->{$child}->needs_linking) {
+           $self->{NEEDS_LINKING} = 1;
+           return 1;
+       }
     }
-    push(@m, " $self->{RM_RF} \$(INST_AUTODIR) \$(INST_ARCHAUTODIR)\n");
-    push(@m, " $self->{RM_F} \$(INST_DYNAMIC) \$(INST_BOOT)\n");
-#    push(@m, "        $self->{RM_F} \$(INST_STATIC) \$(INST_PM)\n");
-    push(@m, " $self->{RM_F} \$(INST_STATIC)\n");
-    my(@otherfiles) = ($self->{MAKEFILE},
-                      "$self->{MAKEFILE}.old"); # Makefiles last
-    push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
-    push(@m, " $self->{RM_RF} @otherfiles\n") if @otherfiles;
-    push(@m, " $attribs{POSTOP}\n")       if $attribs{POSTOP};
-    join("", @m);
+    return $self->{NEEDS_LINKING} = 0;
 }
 
-=item dist_basics (o)
+=item nicetext
 
-Defines the targets distclean, distcheck, skipcheck, manifest.
+misnamed method (will have to be changed). The MM_Unix method just
+returns the argument without further processing.
+
+On VMS used to insure that colons marking targets are preceded by
+space - most Unix Makes don't need this, but it's necessary under VMS
+to distinguish the target delimiter from a colon appearing as part of
+a filespec.
 
 =cut
 
-sub dist_basics {
-    my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    my @m;
-    push @m, q{
-distclean :: realclean distcheck
-};
+sub nicetext {
+    my($self,$text) = @_;
+    $text;
+}
 
-    push @m, q{
-distcheck :
-       $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use ExtUtils::Manifest "&fullcheck";' \\
-               -e 'fullcheck();'
-};
+=item parse_version
 
-    push @m, q{
-skipcheck :
-       $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use ExtUtils::Manifest "&skipcheck";' \\
-               -e 'skipcheck();'
-};
+parse a file and return what you think is $VERSION in this file set to
 
-    push @m, q{
-manifest :
-       $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use ExtUtils::Manifest "&mkmanifest";' \\
-               -e 'mkmanifest();'
-};
-    join "", @m;
+=cut
+
+sub parse_version {
+    my($self,$parsefile) = @_;
+    my $result;
+    local *FH;
+    local $/ = "\n";
+    open(FH,$parsefile) or die "Could not open '$parsefile': $!";
+    my $inpod = 0;
+    while (<FH>) {
+       $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
+       next if $inpod;
+       chop;
+       next unless /\$(([\w\:\']*)\bVERSION)\b.*\=/;
+       local $ExtUtils::MakeMaker::module_version_variable = $1;
+       my($thispackage) = $2 || $current_package;
+       $thispackage =~ s/:+$//;
+       my($eval) = "$_;";
+       eval $eval;
+       die "Could not eval '$eval' in $parsefile: $@" if $@;
+       $result = $ {$ExtUtils::MakeMaker::module_version_variable} || 0;
+       last;
+    }
+    close FH;
+    return $result;
 }
 
-=item dist_core (o)
 
-Defeines the targets dist, tardist, zipdist, uutardist, shdist
+=item pasthru (o)
+
+Defines the string that is passed to recursive make calls in
+subdirectories.
 
 =cut
 
-sub dist_core {
+sub pasthru {
     my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    my @m;
-    push @m, q{
-dist : $(DIST_DEFAULT)
-       }.$self->{NOECHO}.q{$(PERL) -le 'print "Warning: Makefile possibly out of date with $$vf" if ' \
-       -e '-e ($$vf="$(VERSION_FROM)") and -M $$vf < -M "}.$self->{MAKEFILE}.q{";'
+    my(@m,$key);
 
-tardist : $(DISTVNAME).tar$(SUFFIX)
+    my(@pasthru);
 
-zipdist : $(DISTVNAME).zip
+    foreach $key (qw(LIBPERL_A LINKTYPE PREFIX OPTIMIZE)){
+       push @pasthru, "$key=\"\$($key)\"";
+    }
 
-$(DISTVNAME).tar$(SUFFIX) : distdir
-       $(PREOP)
-       $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME)
-       $(RM_RF) $(DISTVNAME)
-       $(COMPRESS) $(DISTVNAME).tar
-       $(POSTOP)
+    push @m, "\nPASTHRU = ", join ("\\\n\t", @pasthru), "\n";
+    join "", @m;
+}
 
-$(DISTVNAME).zip : distdir
-       $(PREOP)
-       $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME)
-       $(POSTOP)
+=item path
 
-uutardist : $(DISTVNAME).tar$(SUFFIX)
-       uuencode $(DISTVNAME).tar$(SUFFIX) \\
-               $(DISTVNAME).tar$(SUFFIX) > \\
-               $(DISTVNAME).tar$(SUFFIX)_uu
+Takes no argument, returns the environment variable PATH as an array.
 
-shdist : distdir
-       $(PREOP)
-       $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar
-       $(RM_RF) $(DISTVNAME)
-       $(POSTOP)
-};
-    join "", @m;
+=cut
+
+sub path {
+    my($self) = @_;
+    my $path_sep = $Is_OS2 ? ";" : ":";
+    my $path = $ENV{PATH};
+    $path =~ s:\\:/:g if $Is_OS2;
+    my @path = split $path_sep, $path;
 }
 
-=item dist_dir (o)
+=item perl_script
 
-Defines the scratch directory target that will hold the distribution
-before tar-ing (or shar-ing).
+Takes one argument, a file name, and returns the file name, if the
+argument is likely to be a perl script. On MM_Unix this is true for
+any ordinary, readable file.
 
 =cut
 
-sub dist_dir {
-    my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    my @m;
-    push @m, q{
-distdir :
-       $(RM_RF) $(DISTVNAME)
-       $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use ExtUtils::Manifest "/mani/";' \\
-               -e 'manicopy(maniread(),"$(DISTVNAME)", "$(DIST_CP)");'
-};
-    join "", @m;
+sub perl_script {
+    my($self,$file) = @_;
+    return $file if -r $file && -f _;
+    return;
 }
 
-=item dist_test (o)
+=item perldepend (o)
 
-Defines a target that produces the distribution in the
-scratchdirectory, and runs 'perl Makefile.PL; make ;make test' in that
-subdirectory.
+Defines the dependency from all *.h files that come with the perl
+distribution.
 
 =cut
 
-sub dist_test {
+sub perldepend {
     my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    my @m;
+    my(@m);
+    push @m, q{
+# Check for unpropogated config.sh changes. Should never happen.
+# We do NOT just update config.h because that is not sufficient.
+# An out of date config.h is not fatal but complains loudly!
+$(PERL_INC)/config.h: $(PERL_SRC)/config.sh
+       -}.$self->{NOECHO}.q{echo "Warning: $(PERL_INC)/config.h out of date with $(PERL_SRC)/config.sh"; false
+
+$(PERL_ARCHLIB)/Config.pm: $(PERL_SRC)/config.sh
+       }.$self->{NOECHO}.q{echo "Warning: $(PERL_ARCHLIB)/Config.pm may be out of date with $(PERL_SRC)/config.sh"
+       cd $(PERL_SRC) && $(MAKE) lib/Config.pm
+} if $self->{PERL_SRC};
+
+    return join "", @m unless $self->needs_linking;
+
     push @m, q{
-disttest : distdir
-       cd $(DISTVNAME) && $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) Makefile.PL
-       cd $(DISTVNAME) && $(MAKE)
-       cd $(DISTVNAME) && $(MAKE) test
-};
-    join "", @m;
+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
+
+$(OBJECT) : $(PERL_HDRS)
+} if $self->{OBJECT};
+
+    push @m, join(" ", values %{$self->{XS}})." : \$(XSUBPPDEPS)\n"  if %{$self->{XS}};
+
+    join "\n", @m;
 }
 
-=item dist_ci (o)
+=item pm_to_blib
 
-Defines a check in target for RCS.
+Defines target that copies all files in the hash PM to their
+destination and autosplits them. See L<ExtUtils::Install/pm_to_blib>
 
 =cut
 
-sub dist_ci {
-    my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    my @m;
-    push @m, q{
-ci :
-       $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use ExtUtils::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");'
+sub pm_to_blib {
+    my $self = shift;
+    my($autodir) = $self->catdir('$(INST_LIB)','auto');
+    return 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) $@
 };
-    join "", @m;
 }
 
-=item install (o)
+=item post_constants (o)
 
-Defines the install target.
+Returns an empty string per default. Dedicated to overrides from
+within Makefile.PL after all constants have been defined.
 
 =cut
 
-sub install {
-    my($self, %attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    my(@m);
+sub post_constants{
+    my($self) = shift;
+    "";
+}
 
-    push @m, q{
-install :: all pure_install doc_install
+=item post_initialize (o)
 
-install_perl :: all pure_perl_install doc_perl_install
+Returns an ampty string per default. Used in Makefile.PLs to add some
+chunk of text to the Makefile after the object is initialized.
 
-install_site :: all pure_site_install doc_site_install
+=cut
 
-install_ :: install_site
-       @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
+sub post_initialize {
+    my($self) = shift;
+    "";
+}
 
-pure_install :: pure_$(INSTALLDIRS)_install
+=item postamble (o)
 
-doc_install :: doc_$(INSTALLDIRS)_install
-       }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
+Returns an empty string. Can be used in Makefile.PLs to write some
+text to the Makefile at the end.
 
-pure__install : pure_site_install
-       @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
+=cut
 
-doc__install : doc_site_install
-       @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
+sub postamble {
+    my($self) = shift;
+    "";
+}
 
-pure_perl_install ::
-       }.$self->{NOECHO}.q{$(MOD_INSTALL) \
-               read }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
-               write }.$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
-               $(INST_LIB) $(INSTALLPRIVLIB) \
-               $(INST_ARCHLIB) $(INSTALLARCHLIB) \
-               $(INST_EXE) $(INSTALLBIN) \
-               $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
-               $(INST_MAN3DIR) $(INSTALLMAN3DIR)
-       }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
-               }.$self->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{
+=item prefixify
 
+Check a path variable in $self from %Config, if it contains a prefix,
+and replace it with another one.
 
-pure_site_install ::
-       }.$self->{NOECHO}.q{$(MOD_INSTALL) \
-               read }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \
-               write }.$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{ \
-               $(INST_LIB) $(INSTALLSITELIB) \
-               $(INST_ARCHLIB) $(INSTALLSITEARCH) \
-               $(INST_EXE) $(INSTALLBIN) \
-               $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
-               $(INST_MAN3DIR) $(INSTALLMAN3DIR)
-       }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
-               }.$self->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{
+Takes as arguments an attribute name, a search prefix and a
+replacement prefix. Changes the attribute in the object.
 
-doc_perl_install ::
-       }.$self->{NOECHO}.q{$(DOC_INSTALL) \
-               "$(NAME)" \
-               "installed into" "$(INSTALLPRIVLIB)" \
-               LINKTYPE "$(LINKTYPE)" \
-               VERSION "$(VERSION)" \
-               EXE_FILES "$(EXE_FILES)" \
-               >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
+=cut
 
-doc_site_install ::
-       }.$self->{NOECHO}.q{$(DOC_INSTALL) \
-               "Module $(NAME)" \
-               "installed into" "$(INSTALLSITELIB)" \
-               LINKTYPE "$(LINKTYPE)" \
-               VERSION "$(VERSION)" \
-               EXE_FILES "$(EXE_FILES)" \
-               >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
+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/;
+}
 
-};
+=item processPL (o)
 
-    push @m, q{
-uninstall :: uninstall_from_$(INSTALLDIRS)dirs
+Defines targets to run *.PL files.
 
-uninstall_from_perldirs ::
-       }.$self->{NOECHO}.
-       q{$(UNINSTALL) }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{
+=cut
 
-uninstall_from_sitedirs ::
-       }.$self->{NOECHO}.
-       q{$(UNINSTALL) }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{
-};
+sub processPL {
+    my($self) = shift;
+    return "" unless $self->{PL_FILES};
+    my(@m, $plfile);
+    foreach $plfile (sort keys %{$self->{PL_FILES}}) {
+       push @m, "
+all :: $self->{PL_FILES}->{$plfile}
 
-    join("",@m);
+$self->{PL_FILES}->{$plfile} :: $plfile
+       \$(PERL) -I\$(INST_ARCHLIB) -I\$(INST_LIB) -I\$(PERL_ARCHLIB) -I\$(PERL_LIB) $plfile
+";
+    }
+    join "", @m;
 }
 
-=item force (o)
+=item realclean (o)
 
-Just writes FORCE:
+Defines the realclean target.
 
 =cut
 
-sub force {
-    my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
+sub realclean {
+    my($self, %attribs) = @_;
+    my(@m);
+    push(@m,'
+# Delete temporary files (via clean) and also delete installed files
+realclean purge ::  clean
+');
+    # realclean subdirectories first (already cleaned)
+    my $sub = "\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}",''));
     }
-    '# Phony target to force checking subdirectories.
-FORCE:
-';
+    push(@m, " $self->{RM_RF} \$(INST_AUTODIR) \$(INST_ARCHAUTODIR)\n");
+    if( $self->has_link_code ){
+        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");
+    my(@otherfiles) = ($self->{MAKEFILE},
+                      "$self->{MAKEFILE}.old"); # Makefiles last
+    push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
+    push(@m, " $self->{RM_RF} @otherfiles\n") if @otherfiles;
+    push(@m, " $attribs{POSTOP}\n")       if $attribs{POSTOP};
+    join("", @m);
 }
 
-=item perldepend (o)
+=item replace_manpage_separator
 
-Defines the dependency from all *.h files that come with the perl
-distribution.
+Takes the name of a package, which may be a nested package, in the
+form Foo/Bar and replaces the slash with C<::>. Returns the replacement.
 
 =cut
 
-sub perldepend {
-    my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    my(@m);
-    push(@m,'
-PERL_HDRS = $(PERL_INC)/EXTERN.h $(PERL_INC)/INTERN.h \
-    $(PERL_INC)/XSUB.h $(PERL_INC)/av.h        $(PERL_INC)/cop.h \
-    $(PERL_INC)/cv.h   $(PERL_INC)/dosish.h    $(PERL_INC)/embed.h \
-    $(PERL_INC)/form.h $(PERL_INC)/gv.h        $(PERL_INC)/handy.h \
-    $(PERL_INC)/hv.h   $(PERL_INC)/keywords.h  $(PERL_INC)/mg.h \
-    $(PERL_INC)/op.h   $(PERL_INC)/opcode.h    $(PERL_INC)/patchlevel.h \
-    $(PERL_INC)/perl.h $(PERL_INC)/perly.h     $(PERL_INC)/pp.h \
-    $(PERL_INC)/proto.h        $(PERL_INC)/regcomp.h   $(PERL_INC)/regexp.h \
-    $(PERL_INC)/scope.h        $(PERL_INC)/sv.h        $(PERL_INC)/unixish.h \
-    $(PERL_INC)/util.h $(PERL_INC)/config.h
+sub replace_manpage_separator {
+    my($self,$man) = @_;
+    $man =~ s,/+,::,g;
+    $man;
+}
 
-');
+=item static (o)
 
-    push @m, '
-$(OBJECT) : $(PERL_HDRS)
-' if $self->{OBJECT};
+Defines the static target.
 
-    push(@m,'
-# Check for unpropogated config.sh changes. Should never happen.
-# We do NOT just update config.h because that is not sufficient.
-# An out of date config.h is not fatal but complains loudly!
-$(PERL_INC)/config.h: $(PERL_SRC)/config.sh
-       -'.$self->{NOECHO}.'echo "Warning: $(PERL_INC)/config.h out of date with $(PERL_SRC)/config.sh"; false
+=cut
 
-$(PERL_ARCHLIB)/Config.pm: $(PERL_SRC)/config.sh
-       '.$self->{NOECHO}.'echo "Warning: $(PERL_ARCHLIB)/Config.pm may be out of date with $(PERL_SRC)/config.sh"
-       cd $(PERL_SRC) && $(MAKE) lib/Config.pm
-') if $self->{PERL_SRC};
+sub static {
+# --- Static Loading Sections ---
 
-    push(@m, join(" ", values %{$self->{XS}})." : \$(XSUBPPDEPS)\n")
-       if %{$self->{XS}};
-    join("\n",@m);
+    my($self) = shift;
+    '
+## $(INST_PM) has been moved to the all: target.
+## It remains here for awhile to allow for old usage: "make static"
+#static :: '.$self->{MAKEFILE}.' $(INST_STATIC) $(INST_PM)
+static :: '.$self->{MAKEFILE}.' $(INST_STATIC)
+       '.$self->{NOECHO}.'$(NOOP)
+';
 }
 
-=item makefile (o)
+=item static_lib (o)
 
-Defines how to rewrite the Makefile.
+Defines how to produce the *.a (or equivalent) files.
 
 =cut
 
-sub makefile {
-    my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    my @m;
-    # We do not know what target was originally specified so we
-    # must force a manual rerun to be sure. But as it should only
-    # happen very rarely it is not a significant problem.
-    push @m, '
-$(OBJECT) : $(FIRST_MAKEFILE)
-' if $self->{OBJECT};
+sub static_lib {
+    my($self) = @_;
+# Come to think of it, if there are subdirs with linkcode, we still have no INST_STATIC
+#    return '' unless $self->needs_linking(); #might be because of a subdir
 
-    push @m, q{
-# We take a very conservative approach here, but it\'s worth it.
-# We move Makefile to Makefile.old here to avoid gnu make looping.
-}.$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{mv }."$self->{MAKEFILE} $self->{MAKEFILE}.old".q{
-       -$(MAKE) -f }.$self->{MAKEFILE}.q{.old clean >/dev/null 2>&1 || true
-       $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" 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
+    return '' unless $self->has_link_code;
+
+    my(@m);
+    push(@m, <<'END');
+$(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)/.exists
+       $(RM_RF) $@
+END
+    # If this extension has it's 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};
 
-# To change behavior to :: would be nice, but would break Tk b9.02
-# so you find such a warning below the dist target.
-#}.$self->{MAKEFILE}.q{ :: $(VERSION_FROM)
-#      }.$self->{NOECHO}.q{echo "Warning: Makefile possibly out of date with $(VERSION_FROM)"
+    push @m,
+q{     $(AR) $(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@
+       }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)/extralibs.ld
+       $(CHMOD) 755 $@
 };
 
-    join "", @m;
+# Old mechanism - still available:
+
+    push @m, "\t$self->{NOECHO}".q{echo "$(EXTRALIBS)" >> $(PERL_SRC)/ext.libs}."\n\n"
+       if $self->{PERL_SRC};
+
+    push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
+    join('', "\n",@m);
 }
 
 =item staticmake (o)
@@ -2840,10 +2630,6 @@ Calls makeaperl.
 
 sub staticmake {
     my($self, %attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     my(@static);
 
     my(@searchdirs)=($self->{PERL_ARCHLIB}, $self->{SITEARCHEXP},  $self->{INST_ARCHLIB});
@@ -2878,6 +2664,52 @@ sub staticmake {
                    );
 }
 
+=item subdir_x (o)
+
+Helper subroutine for subdirs
+
+=cut
+
+sub subdir_x {
+    my($self, $subdir) = @_;
+    my(@m);
+    qq{
+
+subdirs ::
+       $self->{NOECHO}cd $subdir && \$(MAKE) all \$(PASTHRU)
+
+};
+}
+
+=item subdirs (o)
+
+Defines targets to process subdirectories.
+
+=cut
+
+sub subdirs {
+# --- Sub-directory Sections ---
+    my($self) = shift;
+    my(@m,$dir);
+    # This method provides a mechanism to automatically deal with
+    # subdirectories containing further Makefile.PL scripts.
+    # It calls the subdir_x() method for each subdirectory.
+    foreach $dir (@{$self->{DIR}}){
+       push(@m, $self->subdir_x($dir));
+####   print "Including $dir subdirectory\n";
+    }
+    if (@m){
+       unshift(@m, "
+# The default clean, realclean and test targets in this Makefile
+# have automatically been given entries for each subdir.
+
+");
+    } else {
+       push(@m, "\n# none")
+    }
+    join('',@m);
+}
+
 =item test (o)
 
 Defines the test targets.
@@ -2888,18 +2720,17 @@ sub test {
 # --- Test and Installation Sections ---
 
     my($self, %attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     my($tests) = $attribs{TESTS} || (-d "t" ? "t/*.t" : "");
     my(@m);
     push(@m,"
 TEST_VERBOSE=0
 TEST_TYPE=test_\$(LINKTYPE)
+TEST_FILE = test.pl
+TESTDB_SW = -d
 
-test :: \$(TEST_TYPE)
 testdb :: testdb_\$(LINKTYPE)
+
+test :: \$(TEST_TYPE)
 ");
     push(@m, map("\t$self->{NOECHO}cd $_ && test -f $self->{MAKEFILE} && \$(MAKE) test \$(PASTHRU)\n",
                 @{$self->{DIR}}));
@@ -2912,11 +2743,9 @@ testdb :: testdb_\$(LINKTYPE)
     push(@m, $self->test_via_script('$(FULLPERL)', 'test.pl')) if -f "test.pl";
     push(@m, "\n");
 
-    if (-f "test.pl") {
-       push(@m, "testdb_dynamic :: pure_all\n");
-       push(@m, $self->test_via_script('$(FULLPERL) -d', 'test.pl'));
-       push(@m, "\n");
-    }
+    push(@m, "testdb_dynamic :: pure_all\n");
+    push(@m, $self->test_via_script('$(FULLPERL) $(TESTDB_SW)', '$(TEST_FILE)'));
+    push(@m, "\n");
 
     # Occasionally we may face this degenerate target:
     push @m, "test_ : test_dynamic\n\n";
@@ -2926,11 +2755,9 @@ testdb :: testdb_\$(LINKTYPE)
        push(@m, $self->test_via_harness('./$(MAP_TARGET)', $tests)) if $tests;
        push(@m, $self->test_via_script('./$(MAP_TARGET)', 'test.pl')) if -f "test.pl";
        push(@m, "\n");
-       if (-f "test.pl") {
-           push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
-           push(@m, $self->test_via_script('./$(MAP_TARGET) -d', 'test.pl'));
-           push(@m, "\n");
-       }
+       push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
+       push(@m, $self->test_via_script('./$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
+       push(@m, "\n");
     } else {
        push @m, "test_static :: test_dynamic\n";
        push @m, "testdb_static :: testdb_dynamic\n";
@@ -2946,10 +2773,6 @@ Helper method to write the test targets
 
 sub test_via_harness {
     my($self, $perl, $tests) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     "\tPERL_DL_NONLAZY=1 $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";
 }
 
@@ -2961,301 +2784,279 @@ Other helper method for test.
 
 sub test_via_script {
     my($self, $perl, $script) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     qq{\tPERL_DL_NONLAZY=1 $perl}.q{ -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) }.qq{$script
 };
 }
 
-=item postamble (o)
+=item tool_autosplit (o)
 
-Returns an empty string. Can be used in Makefile.PLs to write some
-text to the Makefile at the end.
+Defines a simple perl call that runs autosplit. May be deprecated by
+pm_to_blib soon.
 
 =cut
 
-sub postamble {
-    my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    "";
+sub tool_autosplit {
+# --- Tool Sections ---
+
+    my($self, %attribs) = @_;
+    my($asl) = "";
+    $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) ;'
+};
 }
 
-=item makeaperl (o)
+=item tools_other (o)
 
-Called by staticmake. Defines how to write the Makefile to produce a
-static new perl.
+Defines SHELL, LD, TOUCH, CP, MV, RM_F, RM_RF, CHMOD, UMASK_NULL in
+the Makefile. Also defines the perl programs MKPATH,
+WARN_IF_OLD_PACKLIST, MOD_INSTALL. DOC_INSTALL, and UNINSTALL.
 
 =cut
 
-sub makeaperl {
-    my($self, %attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
+sub tools_other {
+    my($self) = shift;
+    my @m;
+    my $bin_sh = $Config{sh} || '/bin/sh';
+    push @m, qq{
+SHELL = $bin_sh
+};
+
+    for (qw/ CHMOD CP LD MV NOOP RM_F RM_RF TOUCH UMASK_NULL / ) {
+       push @m, "$_ = $self->{$_}\n";
     }
-    my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
-       @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
-    my(@m);
-    push @m, "
-# --- MakeMaker makeaperl section ---
-MAP_TARGET    = $target
-FULLPERL      = $self->{FULLPERL}
-";
-    return join '', @m if $self->{PARENT};
 
-    my($dir) = join ":", @{$self->{DIR}};
 
-    unless ($self->{MAKEAPERL}) {
-       push @m, q{
-$(MAP_TARGET) :: $(MAKE_APERL_FILE)
-       $(MAKE) -f $(MAKE_APERL_FILE) static $@
+    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) -wle '$$"="/"; foreach $$p (@ARGV){' \\
+-e 'next if -d $$p; my(@p); foreach(split(/\//,$$p)){' \\
+-e 'push(@p,$$_); next if -d "@p/"; print "mkdir @p" if 0;' \\
+-e 'mkdir("@p",0777)||die $$! } } exit 0;'
 
-$(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) \
-               Makefile.PL DIR=}, $dir, q{ \
-               MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
-               MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=};
+# 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) -we 'open F, ">$$ARGV[1]"; close F;' \\
+-e 'utime ((stat("$$ARGV[0]"))[8,9], $$ARGV[1])'
+};
 
-       push @m, map( " \\\n\t\t$_", @ARGV );
-       push @m, "\n";
+    return join "", @m if $self->{PARENT};
 
-       return join '', @m;
-    }
+    push @m, q{
+# Here we warn users that an old packlist file was found somewhere,
+# and that they should call some uninstall routine
+WARN_IF_OLD_PACKLIST = $(PERL) -we 'exit unless -f $$ARGV[0];' \\
+-e 'print "WARNING: I have found an old package in\n";' \\
+-e 'print "\t$$ARGV[0].\n";' \\
+-e 'print "Please make sure the two installations are not conflicting\n";'
 
+UNINST=0
+VERBINST=1
 
+MOD_INSTALL = $(PERL) -I$(INST_LIB) -I$(PERL_LIB) -MExtUtils::Install \
+-e 'install({@ARGV},"$(VERBINST)",0,"$(UNINST)");'
 
-    my($cccmd, $linkcmd, $lperl);
+DOC_INSTALL = $(PERL) -e '$$\="\n\n";print "=head3 ", scalar(localtime), ": C<", shift, ">";' \
+-e 'print "=over 4";' \
+-e 'while (defined($$key = shift) and defined($$val = shift)){print "=item *";print "C<$$key: $$val>";}' \
+-e 'print "=back";'
 
+UNINSTALL =   $(PERL) -MExtUtils::Install \
+-e 'uninstall($$ARGV[0],1);'
 
-    $cccmd = $self->const_cccmd($libperl);
-    $cccmd =~ s/^CCCMD\s*=\s*//;
-    $cccmd =~ s/\$\(INC\)/ -I$self->{PERL_INC} /;
-    $cccmd .= " $Config::Config{cccdlflags}" if ($Config::Config{d_shrplib});
-    $cccmd =~ s/\(CC\)/\(PERLMAINCC\)/;
+};
 
-    # The front matter of the linkcommand...
-    $linkcmd = join ' ', "\$(CC)",
-           grep($_, @Config{qw(large split ldflags ccdlflags)});
-    $linkcmd =~ s/\s+/ /g;
+    return join "", @m;
+}
 
-    # Which *.a files could we make use of...
-    local(%static);
-    require File::Find;
-    File::Find::find(sub {
-       return unless m/\Q$self->{LIB_EXT}\E$/;
-       return if m/^libperl/;
-       # don't include the installed version of this extension. I
-       # leave this line here, although it is not necessary anymore:
-       # I patched minimod.PL instead, so that Miniperl.pm won't
-       # enclude duplicates
+=item tool_xsubpp (o)
 
-       # 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}$:;
-       use Cwd 'cwd';
-       $static{cwd() . "/" . $_}++;
-    }, grep( -d $_, @{$searchdirs || []}) );
+Determines typemaps, xsubpp version, prototype behaviour.
 
-    # We trust that what has been handed in as argument, will be buildable
-    $static = [] unless $static;
-    @static{@{$static}} = (1) x @{$static};
+=cut
 
-    $extra = [] unless $extra && ref $extra eq 'ARRAY';
-    for (sort keys %static) {
-       next unless /\Q$self->{LIB_EXT}\E$/;
-       $_ = dirname($_) . "/extralibs.ld";
-       push @$extra, $_;
+sub tool_xsubpp {
+    my($self) = shift;
+    return "" unless $self->needs_linking;
+    my($xsdir)  = $self->catdir($self->{PERL_LIB},"ExtUtils");
+    my(@tmdeps) = $self->catdir('$(XSUBPPDIR)','typemap');
+    if( $self->{TYPEMAPS} ){
+       my $typemap;
+       foreach $typemap (@{$self->{TYPEMAPS}}){
+               if( ! -f  $typemap ){
+                       warn "Typemap $typemap not found.\n";
+               }
+               else{
+                       push(@tmdeps,  $typemap);
+               }
+       }
+    }
+    push(@tmdeps, "typemap") if -f "typemap";
+    my(@tmargs) = map("-typemap $_", @tmdeps);
+    if( exists $self->{XSOPT} ){
+       unshift( @tmargs, $self->{XSOPT} );
     }
 
-    grep(s/^/-I/, @{$perlinc || []});
-
-    $target = "perl" unless $target;
-    $tmp = "." unless $tmp;
-
-# MAP_STATIC doesn't look into subdirs yet. Once "all" is made and we
-# regenerate the Makefiles, MAP_STATIC and the dependencies for
-# extralibs.all are computed correctly
-    push @m, "
-MAP_LINKCMD   = $linkcmd
-MAP_PERLINC   = @{$perlinc || []}
-MAP_STATIC    = ",
-join(" \\\n\t", reverse sort keys %static), "
 
-MAP_PRELIBS   = $Config::Config{libs} $Config::Config{cryptlib}
-";
+    my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,"xsubpp"));
 
-    if (defined $libperl) {
-       ($lperl = $libperl) =~ s/\$\(A\)/$self->{LIB_EXT}/;
-    }
-    unless ($libperl && -f $lperl) { # Ilya's code...
-       my $dir = $self->{PERL_SRC} || "$self->{PERL_ARCHLIB}/CORE";
-       $libperl ||= "libperl$self->{LIB_EXT}";
-       $libperl   = "$dir/$libperl";
-       $lperl   ||= "libperl$self->{LIB_EXT}";
-       $lperl     = "$dir/$lperl";
-       print STDOUT "Warning: $libperl not found
-    If you're going to build a static perl binary, make sure perl is installed
-    otherwise ignore this warning\n"
-               unless (-f $lperl || defined($self->{PERL_SRC}));
+    # What are the correct thresholds for version 1 && 2 Paul?
+    if ( $xsubpp_version > 1.923 ){
+       $self->{XSPROTOARG} = "" unless defined $self->{XSPROTOARG};
+    } else {
+       if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
+           print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
+       Your version of xsubpp is $xsubpp_version and cannot handle this.
+       Please upgrade to a more recent version of xsubpp.
+};
+       } else {
+           $self->{XSPROTOARG} = "";
+       }
     }
 
-    push @m, "
-MAP_LIBPERL = $libperl
-";
+    return qq{
+XSUBPPDIR = $xsdir
+XSUBPP = \$(XSUBPPDIR)/xsubpp
+XSPROTOARG = $self->{XSPROTOARG}
+XSUBPPDEPS = @tmdeps
+XSUBPPARGS = @tmargs
+};
+};
 
-    push @m, "
-\$(INST_ARCHAUTODIR)/extralibs.all: \$(INST_ARCHAUTODIR)/.exists ".join(" \\\n\t", @$extra)."
-       $self->{NOECHO}$self->{RM_F} \$\@
-       $self->{NOECHO}\$(TOUCH) \$\@
-";
+sub xsubpp_version
+{
+    my($self,$xsubpp) = @_;
+    return $Xsubpp_Version if defined $Xsubpp_Version; # global variable
 
-    my $catfile;
-    foreach $catfile (@$extra){
-       push @m, "\tcat $catfile >> \$\@\n";
-    }
+    my ($version) ;
 
-    push @m, "
-\$(MAP_TARGET) :: $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) \$(INST_ARCHAUTODIR)/extralibs.all
-       \$(MAP_LINKCMD) -o \$\@ $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) `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'
-       $self->{NOECHO}echo '    make -f $makefilename map_clean'
+    # try to figure out the version number of the xsubpp on the system
 
-$tmp/perlmain\$(OBJ_EXT): $tmp/perlmain.c
-";
-    push @m, "\tcd $tmp && $cccmd -I\$(PERL_INC) perlmain.c\n";
+    # first try the -v flag, introduced in 1.921 & 2.000a2
 
-    push @m, qq{
-$tmp/perlmain.c: $makefilename}, q{
-       }.$self->{NOECHO}.q{echo Writing $@
-       }.$self->{NOECHO}.q{$(PERL) $(MAP_PERLINC) -e 'use ExtUtils::Miniperl; \\
-               writemain(grep s#.*/auto/##, qw|$(MAP_STATIC)|)' > $@.tmp && mv $@.tmp $@
+    return "" unless $self->needs_linking;
 
-};
+    my $command = "$self->{PERL} -I$self->{PERL_LIB} $xsubpp -v 2>&1";
+    print "Running $command\n" if $Verbose >= 2;
+    $version = `$command` ;
+    warn "Running '$command' exits with status " . ($?>>8) if $?;
+    chop $version ;
 
-    push @m, q{
-doc_inst_perl:
-       }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
-       }.$self->{NOECHO}.q{$(DOC_INSTALL) \
-               "Perl binary $(MAP_TARGET)" \
-               MAP_STATIC "$(MAP_STATIC)" \
-               MAP_EXTRA "`cat $(INST_ARCHAUTODIR)/extralibs.all`" \
-               MAP_LIBPERL "$(MAP_LIBPERL)" \
-               >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
+    return $Xsubpp_Version = $1 if $version =~ /^xsubpp version (.*)/ ;
 
-};
+    # nope, then try something else
 
-    push @m, qq{
-inst_perl: pure_inst_perl doc_inst_perl
+    my $counter = '000';
+    my ($file) = 'temp' ;
+    $counter++ while -e "$file$counter"; # don't overwrite anything
+    $file .= $counter;
 
-pure_inst_perl: \$(MAP_TARGET)
-       $self->{CP} \$(MAP_TARGET) \$(INSTALLBIN)/\$(MAP_TARGET)
+    open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
+    print F <<EOM ;
+MODULE = fred PACKAGE = fred
 
-clean :: map_clean
+int
+fred(a)
+        int     a;
+EOM
 
-map_clean :
-       $self->{RM_F} $tmp/perlmain\$(OBJ_EXT) $tmp/perlmain.c \$(MAP_TARGET) $makefilename \$(INST_ARCHAUTODIR)/extralibs.all
-};
+    close F ;
 
-    join '', @m;
+    $command = "$self->{PERL} $xsubpp $file 2>&1";
+    print "Running $command\n" if $Verbose >= 2;
+    my $text = `$command` ;
+    warn "Running '$command' exits with status " . ($?>>8) if $?;
+    unlink $file ;
+
+    # gets 1.2 -> 1.92 and 2.000a1
+    return $Xsubpp_Version = $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/  ;
+
+    # it is either 1.0 or 1.1
+    return $Xsubpp_Version = 1.1 if $text =~ /^Warning: ignored semicolon/ ;
+
+    # none of the above, so 1.0
+    return $Xsubpp_Version = "1.0" ;
 }
 
-=item dir_target (o)
+=item top_targets (o)
 
-Takes an array of directories that need to exist and returns a
-Makefile entry for a .exists file in these directories. Returns
-nothing, if the entry has already been processed. We're helpless
-though, if the same directory comes as $(FOO) _and_ as "bar". Both of
-them get an entry, that's why we use "::".
+Defines the targets all, subdirs, config, and O_FILES
 
 =cut
 
-sub dir_target {
-# --- Make-Directories section (internal method) ---
-# dir_target(@array) returns a Makefile entry for the file .exists in each
-# named directory. Returns nothing, if the entry has already been processed.
-# We're helpless though, if the same directory comes as $(FOO) _and_ as "bar".
-# Both of them get an entry, that's why we use "::". I chose '$(PERL)' as the
-# prerequisite, because there has to be one, something that doesn't change
-# too often :)
+sub top_targets {
+# --- Target Sections ---
 
-    my($self,@dirs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    my(@m,$dir);
-    foreach $dir (@dirs) {
-       my($src) = $self->catfile($self->{PERL_INC},'perl.h');
-       my($targ) = $self->catfile($dir,'.exists');
-       my($targdir) = $targ;       # Necessary because catfile may have
-       $targdir =~ s:/?.exists$::; # adapted syntax of $dir to target OS
-       next if $self->{DIR_TARGET}{$self}{$targdir}++;
-       push @m, qq{
-$targ :: $src
-       $self->{NOECHO}\$(MKPATH) $targdir
-       $self->{NOECHO}\$(EQUALIZE_TIMESTAMP) $src $targ
-};
-       push(@m,qq{
-       -$self->{NOECHO}\$(CHMOD) 755 $targdir
-}) unless $Is_VMS;
-    }
-    join "", @m;
-}
+    my($self) = shift;
+    my(@m);
+    push @m, '
+#all ::        config $(INST_PM) subdirs linkext manifypods
 
-=item needs_linking (o)
+all :: pure_all manifypods
+       '.$self->{NOECHO}.'$(NOOP)
 
-Does this module need linking? Looks into subdirectory objects (see
-also has_link_code())
+pure_all :: config pm_to_blib subdirs linkext
+       '.$self->{NOECHO}.'$(NOOP)
 
-=cut
+subdirs :: $(MYEXTLIB)
+       '.$self->{NOECHO}.'$(NOOP)
 
-sub needs_linking {
-    my($self) = shift;
-    my($child,$caller);
-    $caller = (caller(0))[3];
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse($caller);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    Carp::confess("Needs_linking called too early") if $caller =~ /^ExtUtils::MakeMaker::/;
-    return $self->{NEEDS_LINKING} if defined $self->{NEEDS_LINKING};
-    if ($self->has_link_code or $self->{MAKEAPERL}){
-       $self->{NEEDS_LINKING} = 1;
-       return 1;
+config :: '.$self->{MAKEFILE}.' $(INST_LIBDIR)/.exists
+       '.$self->{NOECHO}.'$(NOOP)
+
+config :: $(INST_ARCHAUTODIR)/.exists
+       '.$self->{NOECHO}.'$(NOOP)
+
+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->{MAN1PODS}}) {
+       push @m, qq[
+config :: \$(INST_MAN1DIR)/.exists
+       $self->{NOECHO}\$(NOOP)
+
+];
+       push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
     }
-    foreach $child (keys %{$self->{CHILDREN}}) {
-       if ($self->{CHILDREN}->{$child}->needs_linking) {
-           $self->{NEEDS_LINKING} = 1;
-           return 1;
-       }
+    if (%{$self->{MAN3PODS}}) {
+       push @m, qq[
+config :: \$(INST_MAN3DIR)/.exists
+       $self->{NOECHO}\$(NOOP)
+
+];
+       push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
     }
-    return $self->{NEEDS_LINKING} = 0;
-}
 
-=item has_link_code
+    push @m, '
+$(O_FILES): $(H_FILES)
+' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
 
-Returns true if C, XS, MYEXTLIB or similar objects exist within this
-object that need a compiler. Does not descend into subdirectories as
-needs_linking() does.
+    push @m, q{
+help:
+       perldoc ExtUtils::MakeMaker
+};
 
-=cut
+    push @m, q{
+Version_check:
+       }.$self->{NOECHO}.q{$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
+               -MExtUtils::MakeMaker=Version_check \
+               -e 'Version_check("$(MM_VERSION)")'
+};
 
-sub has_link_code {
-    my($self) = shift;
-    return $self->{HAS_LINK_CODE} if defined $self->{HAS_LINK_CODE};
-    if ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB}){
-       $self->{HAS_LINK_CODE} = 1;
-       return 1;
-    }
-    return $self->{HAS_LINK_CODE} = 0;
+    join('',@m);
 }
 
 =item writedoc
@@ -3267,16 +3068,44 @@ Obsolete, depecated method. Not used since Version 5.21.
 sub writedoc {
 # --- perllocal.pod section ---
     my($self,$what,$name,@attribs)=@_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     my $time = localtime;
     print "=head2 $time: $what C<$name>\n\n=over 4\n\n=item *\n\n";
     print join "\n\n=item *\n\n", map("C<$_>",@attribs);
     print "\n\n=back\n\n";
 }
 
+=item xs_c (o)
+
+Defines the suffix rules to compile XS files to C.
+
+=cut
+
+sub xs_c {
+    my($self) = shift;
+    return '' unless $self->needs_linking();
+    '
+.xs.c:
+       $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >$*.tc && mv $*.tc $@
+';
+}
+
+=item xs_o (o)
+
+Defines suffix rules to go from XS to object files directly. This is
+only intended for broken make implementations.
+
+=cut
+
+sub xs_o {     # many makes are too dumb to use xs_c then c_o
+    my($self) = shift;
+    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
+       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
+';
+}
+
 1;
 
 
index 9b9889a..9a38228 100644 (file)
@@ -6,7 +6,7 @@
 #   Author:  Charles Bailey  bailey@genetics.upenn.edu
 
 package ExtUtils::MM_VMS;
-$ExtUtils::MM_VMS::Revision=$ExtUtils::MM_VMS::Revision = '5.26 (17-Mar-1996)';
+$ExtUtils::MM_VMS::Revision=$ExtUtils::MM_VMS::Revision = '5.35 (23-Jun-1996)';
 unshift @MM::ISA, 'ExtUtils::MM_VMS';
 
 use Config;
@@ -42,10 +42,6 @@ as a file specification in Unix syntax.
 
 sub eliminate_macros {
     my($self,$path) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     unless ($path) {
        print "eliminate_macros('') = ||\n" if $Verbose >= 3;
        return '';
@@ -81,10 +77,6 @@ specification.
 
 sub fixpath {
     my($self,$path,$force_path) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     unless ($path) {
        print "eliminate_macros('') = ||\n" if $Verbose >= 3;
        return '';
@@ -123,10 +115,6 @@ VMS-syntax directory specification.
 
 sub catdir {
     my($self,@dirs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     my($dir) = pop @dirs;
     @dirs = grep($_,@dirs);
     my($rslt);
@@ -151,10 +139,6 @@ VMS-syntax directory specification.
 
 sub catfile {
     my($self,@files) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     my($file) = pop @files;
     @files = grep($_,@files);
     my($rslt);
@@ -173,6 +157,36 @@ sub catfile {
     $rslt;
 }
 
+=item curdir (override)
+
+Returns a string representing of the current directory.
+
+=cut
+
+sub curdir {
+    return '[]';
+}
+
+=item rootdir (override)
+
+Returns a string representing of the root directory.
+
+=cut
+
+sub rootdir {
+    return '';
+}
+
+=item updir (override)
+
+Returns a string representing of the parent directory.
+
+=cut
+
+sub updir {
+    return '[-]';
+}
+
 package ExtUtils::MM_VMS;
 
 sub ExtUtils::MM_VMS::guess_name;
@@ -226,10 +240,12 @@ sub ExtUtils::MM_VMS::nicetext;
 sub AUTOLOAD {
     my $code;
     if (defined fileno(DATA)) {
-       while (<DATA>) {
-           last if /^__END__/;
-           $code .= $_;
-       }
+       my $fh = select DATA;
+       my $o = $/;                     # For future reads from the file.
+       $/ = "\n__END__\n";
+       $code = <DATA>;
+       $/ = $o;
+       select $fh;
        close DATA;
        eval $code;
        if ($@) {
@@ -245,7 +261,7 @@ sub AUTOLOAD {
 
 1;
 
-__DATA__
+#__DATA__
 
 =head2 SelfLoaded methods
 
@@ -268,18 +284,12 @@ package name.
 
 sub guess_name {
     my($self) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     my($defname,$defpm);
     local *PM;
 
-    $defname = $ENV{'DEFAULT'};
-    $defname =~ s:.*?([^.\]]+)\]:$1:
-        unless ($defname =~ s:.*[.\[]ext\.(.*)\]:$1:i);
-    $defname =~ s#[.\]]#::#g;
-    ($defpm = $defname) =~ s/.*:://;
+    $defname = basename(fileify($ENV{'DEFAULT'}));
+    $defname =~ s![\d\-_]*\.dir.*$!!;  # Clip off .dir;1 suffix, and package version
+    $defpm = $defname;
     if (open(PM,"${defpm}.pm")){
         while (<PM>) {
             if (/^\s*package\s+([^;]+)/i) {
@@ -296,7 +306,7 @@ sub guess_name {
         print STDOUT "Warning (non-fatal): Couldn't find ${defpm}.pm;\n\t",
                      "defaulting package name to $defname\n";
     }
-    $defname =~ s#[\-_][\d.\-]+$##;
+    $defname =~ s#[\d.\-_]+$##;
     $defname;
 }
 
@@ -309,10 +319,6 @@ invoke Perl images.
 
 sub find_perl{
     my($self, $ver, $names, $dirs, $trace) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     my($name,$dir,$vmsfile,@sdirs,@snames,@cand);
     # Check in relative directories first, so we pick up the current
     # version of Perl if we're running MakeMaker as part of the main build.
@@ -344,6 +350,7 @@ sub find_perl{
     foreach $name (@cand) {
        print "Checking $name\n" if ($trace >= 2);
        next unless $vmsfile = $self->maybe_command($name);
+       $vmsfile =~ s/;[\d\-]*$//;  # Clip off version number; we can use a newer version as well
        print "Executing $vmsfile\n" if ($trace >= 2);
        if (`MCR $vmsfile -e "require $ver; print ""VER_OK\n"""` =~ /VER_OK/) {
            print "Using PERL=MCR $vmsfile\n" if $trace;
@@ -475,10 +482,6 @@ off to the default MM_Unix method.
 
 sub init_others {
     my($self) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
 
     $self->{NOOP} = "\t@ Continue";
     $self->{FIRST_MAKEFILE} ||= 'Descrip.MMS';
@@ -505,10 +508,6 @@ and makes lists of files comma-separated.
 
 sub constants {
     my($self) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     my(@m,$def,$macro);
 
     if ($self->{DEFINE} ne '') {
@@ -543,10 +542,11 @@ sub constants {
     $self->{ROOTEXT} = $self->{ROOTEXT} ? $self->fixpath($self->{ROOTEXT},1)
                                         : '[]';
     foreach $macro ( qw [
-            INST_LIB INST_ARCHLIB INST_EXE INSTALLPRIVLIB INSTALLARCHLIB
-            INSTALLBIN PERL_LIB PERL_ARCHLIB PERL_INC PERL_SRC FULLEXT
-            INST_MAN1DIR INSTALLMAN1DIR INST_MAN3DIR INSTALLMAN3DIR
-            INSTALLSITELIB INSTALLSITEARCH SITELIBEXP SITEARCHEXP ] ) {
+            INST_BIN INST_SCRIPT INST_LIB INST_ARCHLIB INST_EXE INSTALLPRIVLIB
+            INSTALLARCHLIB INSTALLSCRIPT INSTALLBIN PERL_LIB PERL_ARCHLIB
+            PERL_INC PERL_SRC FULLEXT INST_MAN1DIR INSTALLMAN1DIR
+            INST_MAN3DIR INSTALLMAN3DIR INSTALLSITELIB INSTALLSITEARCH
+            SITELIBEXP SITEARCHEXP ] ) {
        next unless defined $self->{$macro};
        $self->{$macro} = $self->fixpath($self->{$macro},1);
     }
@@ -561,16 +561,17 @@ sub constants {
        $self->{$macro} = $self->fixpath($self->{$macro});
     }
 
-    for $tmp (qw/
+    foreach $macro (qw/
              AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION VERSION_SYM XS_VERSION
-             INST_LIB INST_ARCHLIB INST_EXE PREFIX INSTALLDIRS INSTALLPRIVLIB
-             INSTALLARCHLIB INSTALLSITELIB INSTALLSITEARCH INSTALLBIN PERL_LIB
+             INST_BIN INST_EXE INST_LIB INST_ARCHLIB INST_SCRIPT PREFIX
+             INSTALLDIRS INSTALLPRIVLIB  INSTALLARCHLIB INSTALLSITELIB
+             INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
              PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
              FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC PERL_VMS
              PERL_INC PERL FULLPERL
              / ) {
-       next unless defined $self->{$tmp};
-       push @m, "$tmp = $self->{$tmp}\n";
+       next unless defined $self->{$macro};
+       push @m, "$macro = $self->{$macro}\n";
     }
 
 
@@ -587,18 +588,36 @@ MM_VMS_REVISION = $ExtUtils::MM_VMS::Revision
 
 # FULLEXT = Pathname for extension directory (eg DBD/Oracle).
 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
-# ROOTEXT = Directory part of FULLEXT with leading slash (eg /DBD)
+# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
 # DLBASE  = Basename part of dynamic library. May be just equal BASEEXT.
 ];
 
     for $tmp (qw/
-             FULLEXT BASEEXT ROOTEXT DLBASE VERSION_FROM INC DEFINE OBJECT
+             FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
              LDFROM LINKTYPE
              / ) {
        next unless defined $self->{$tmp};
        push @m, "$tmp = $self->{$tmp}\n";
     }
 
+    for $tmp (qw/ XS MAN1PODS MAN3PODS PM /) {
+       next unless defined $self->{$tmp};
+       my(%tmp,$key);
+       for $key (keys %{$self->{$tmp}}) {
+           $tmp{$self->fixpath($key)} = $self->fixpath($self->{$tmp}{$key});
+       }
+       $self->{$tmp} = \%tmp;
+    }
+
+    for $tmp (qw/ C O_FILES H /) {
+       next unless defined $self->{$tmp};
+       my(@tmp,$val);
+       for $val (@{$self->{$tmp}}) {
+           push(@tmp,$self->fixpath($val));
+       }
+       $self->{$tmp} = \@tmp;
+    }
+
     push @m,'
 
 # Handy lists of source code files:
@@ -619,7 +638,7 @@ MAN3PODS = ',join(', ', sort keys %{$self->{MAN3PODS}}),'
     }
 
 push @m,"
-.SUFFIXES : .xs .c .cpp .cxx \$(OBJ_EXT)
+.SUFFIXES : \$(OBJ_EXT) .c .cpp .cxx .xs
 
 # Here is the Config.pm that we are using/depend on
 CONFIGDEP = \$(PERL_ARCHLIB)Config.pm, \$(PERL_INC)config.h \$(VERSION_FROM)
@@ -648,8 +667,8 @@ PERL_ARCHIVE = ',($ENV{'PERLSHR'} ? $ENV{'PERLSHR'} : 'Sys$Share:PerlShr.Exe'),'
 ';
     }
 
-    $self->{TO_INST_PM} = [ map($self->fixpath($_),sort keys %{$self->{PM}}) ];
-    $self->{PM_TO_BLIB} = [ map($self->fixpath($_),%{$self->{PM}}) ];
+    $self->{TO_INST_PM} = [ sort keys %{$self->{PM}} ];
+    $self->{PM_TO_BLIB} = [ %{$self->{PM}} ];
     push @m,'
 TO_INST_PM = ',join(', ',@{$self->{TO_INST_PM}}),'
 
@@ -669,10 +688,6 @@ to ExtUtils::Liblist.
 
 sub const_loadlibs{
     my($self) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     my (@m);
     push @m, "
 # $self->{NAME} might depend on some other libraries.
@@ -726,10 +741,6 @@ on the command line.
 
 sub cflags {
     my($self,$libperl) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     my($quals) = $Config{'ccflags'};
     my($name,$sys,@m);
     my($optimize) = '/Optimize';
@@ -796,10 +807,6 @@ command line a bit differently than MM_Unix method.
 
 sub const_cccmd {
     my($self,$libperl) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     my(@m);
 
     return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
@@ -839,10 +846,6 @@ command line to find args.
 
 sub pm_to_blib {
     my($self) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     my($line,$from,$to,@m);
     my($autodir) = $self->catdir('$(INST_LIB)','auto');
     my(@files) = @{$self->{PM_TO_BLIB}};
@@ -861,6 +864,7 @@ pm_to_blib : $(TO_INST_PM)
            $line = '';
        }
     }
+    push(@m,"\t$self->{NOECHO}\$(PERL) -e \"print '$line'\" >>.MM_tmp\n") if $line;
 
     push(@m,q[ $(PERL) "-I$(PERL_LIB)" "-MExtUtils::Install" -e "pm_to_blib({split(' ',<STDIN>)},'].$autodir.q[')" <.MM_tmp]);
     push(@m,qq[
@@ -879,10 +883,6 @@ Use VMS-style quoting on command line.
 
 sub tool_autosplit{
     my($self, %attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     my($asl) = "";
     $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
     q{
@@ -897,12 +897,9 @@ Use VMS-style quoting on xsubpp command line.
 
 =cut
 
-sub tool_xsubpp{
+sub tool_xsubpp {
     my($self) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
+    return '' unless $self->needs_linking;
     my($xsdir) = $self->catdir($self->{PERL_LIB},'ExtUtils');
     # drop back to old location if xsubpp is not in new location yet
     $xsdir = $self->catdir($self->{PERL_SRC},'ext') unless (-f $self->catfile($xsdir,'xsubpp'));
@@ -960,6 +957,7 @@ sub xsubpp_version
 {
     my($self,$xsubpp) = @_;
     my ($version) ;
+    return '' unless $self->needs_linking;
 
     # try to figure out the version number of the xsubpp on the system
 
@@ -1021,10 +1019,6 @@ to be updated.
 
 sub tools_other {
     my($self) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     qq!
 # Assumes \$(MMS) invokes MMS or MMK
 # (It is assumed in some cases later that the default makefile name
@@ -1041,12 +1035,13 @@ MV = $self->{MV}
 RM_F  = $self->{RM_F}
 RM_RF = $self->{RM_RF}
 UMASK_NULL = $self->{UMASK_NULL}
+NOOP = $self->{NOOP}
 MKPATH = Create/Directory
 EQUALIZE_TIMESTAMP = \$(PERL) -we "open F,qq{>\$ARGV[1]};close F;utime(0,(stat(\$ARGV[0]))[9]+1,\$ARGV[1])"
 !. ($self->{PARENT} ? '' : 
-q!WARN_IF_OLD_PACKLIST = \$(PERL) -e "if (-f \$ARGV[0]){print qq[WARNING: Old package found (\$ARGV[0]); please check for collisions\\n]}"
+qq!WARN_IF_OLD_PACKLIST = \$(PERL) -e "if (-f \$ARGV[0]){print qq[WARNING: Old package found (\$ARGV[0]); please check for collisions\\n]}"
 MOD_INSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "install({split(' ',<STDIN>)},1);"
-DOC_INSTALL = \$(PERL) -e "@ARGV=split('|',<STDIN>);print '=head3 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];while(\$key=shift && \$val=shift){print qq[=item *\\n\\nC<\$key: \$val>\\n\\n];}print qq[=back\\n\\n]"
+DOC_INSTALL = \$(PERL) -e "\@ARGV=split('|',<STDIN>);print '=head3 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];while(\$key=shift && \$val=shift){print qq[=item *\\n\\nC<\$key: \$val>\\n\\n];}print qq[=back\\n\\n]"
 UNINSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "uninstall(\$ARGV[0],1);"
 !);
 }
@@ -1060,10 +1055,7 @@ default MM_Unix method.
 
 sub dist {
     my($self, %attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
+    $attribs{VERSION}      ||= $self->{VERSION_SYM};
     $attribs{ZIPFLAGS}     ||= '-Vu';
     $attribs{COMPRESS}     ||= 'gzip';
     $attribs{SUFFIX}       ||= '-gz';
@@ -1082,10 +1074,6 @@ $(PERL_INC) have been pulled into $(CCCMD).  Also use MM[SK] macros.
 
 sub c_o {
     my($self) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     return '' unless $self->needs_linking();
     '
 .c$(OBJ_EXT) :
@@ -1108,10 +1096,6 @@ Use MM[SK] macros.
 
 sub xs_c {
     my($self) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     return '' unless $self->needs_linking();
     '
 .xs.c :
@@ -1127,10 +1111,6 @@ Use MM[SK] macros, and VMS command line for C compiler.
 
 sub xs_o {     # many makes are too dumb to use xs_c then c_o
     my($self) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     return '' unless $self->needs_linking();
     '
 .xs$(OBJ_EXT) :
@@ -1147,10 +1127,6 @@ Use VMS quoting on command line for Version_check.
 
 sub top_targets {
     my($self) = shift;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     my(@m);
     push @m, '
 all :: pure_all manifypods
@@ -1223,10 +1199,6 @@ libraries to which it should be linked.
 
 sub dlsyms {
     my($self,%attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
 
     return '' unless $self->needs_linking();
 
@@ -1285,10 +1257,6 @@ Use VMS Link command.
 
 sub dynamic_lib {
     my($self, %attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     return '' unless $self->needs_linking(); #might be because of a subdir
 
     return '' unless $self->has_link_code();
@@ -1320,10 +1288,6 @@ Use VMS-style quoting on Mkbootstrap command line.
 
 sub dynamic_bs {
     my($self, %attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     return '
 BOOTSTRAP =
 ' unless $self->has_link_code();
@@ -1353,10 +1317,6 @@ Use VMS commands to manipulate object library.
 
 sub static_lib {
     my($self) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     return '' unless $self->needs_linking();
 
     return '
@@ -1387,10 +1347,6 @@ $(INST_STATIC) : $(OBJECT) $(MYEXTLIB)
 
 # sub installpm_x { # called by installpm perl file
 #     my($self, $dist, $inst, $splitlib) = @_;
-#     unless (ref $self){
-#      ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-#      $self = $ExtUtils::MakeMaker::Parent[-1];
-#     }
 #     if ($inst =~ m!#!) {
 #      warn "Warning: MM[SK] would have problems processing this file: $inst, SKIPPED\n";
 #      return '';
@@ -1421,19 +1377,16 @@ to specify fallback location at build time if we can't find pod2man.
 
 =cut
 
+
 sub manifypods {
     my($self, %attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
-    return "\nmanifypods :\n\t\$(NOOP)\n" unless %{$self->{MAN3PODS}};
+    return "\nmanifypods :\n\t\$(NOOP)\n" unless %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
     my($dist);
-    my($pod2man_exe,$found_pod2man);
+    my($pod2man_exe);
     if (defined $self->{PERL_SRC}) {
        $pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
     } else {
-       $pod2man_exe = $self->catfile($Config{bin},'pod2man');
+       $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
     }
     if ($pod2man_exe = $self->perl_script($pod2man_exe)) { $found_pod2man = 1; }
     else {
@@ -1478,10 +1431,6 @@ Use VMS-style quoting on command line.
 
 sub processPL {
     my($self) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     return "" unless $self->{PL_FILES};
     my(@m, $plfile);
     foreach $plfile (sort keys %{$self->{PL_FILES}}) {
@@ -1506,15 +1455,11 @@ in C<realclean> target.
 
 sub installbin {
     my($self) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     return '' unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
     return '' unless @{$self->{EXE_FILES}};
     my(@m, $from, $to, %fromto, @to, $line);
     for $from (@{$self->{EXE_FILES}}) {
-       my($path) = '$(INST_EXE)' . basename($from);
+       my($path) = '$(INST_SCRIPT)' . basename($from);
        local($_) = $path;  # backward compatibility
        $to = $self->libscan($path);
        print "libscan($from) => '$to'\n" if ($Verbose >=2);
@@ -1537,7 +1482,7 @@ realclean ::
        }
        else { $line .= " $to"; }
     }
-    push @m, "\t\$(RM_F) $line\n\n";
+    push @m, "\t\$(RM_F) $line\n\n" if $line;
 
     while (($from,$to) = each %fromto) {
        last unless defined $from;
@@ -1562,10 +1507,6 @@ Use VMS commands to change default directory.
 
 sub subdir_x {
     my($self, $subdir) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     my(@m,$key);
     $subdir = $self->fixpath($subdir,1);
     push @m, '
@@ -1589,10 +1530,6 @@ commands for handling subdirectories.
 
 sub clean {
     my($self, %attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     my(@m,$dir);
     push @m, '
 # Delete temporary files but do not touch installed files. We don\'t delete
@@ -1621,7 +1558,7 @@ clean ::
        }
        else { $line .= " $file"; }
     }
-    push @m, "\t\$(RM_RF) $line\n\n";
+    push @m, "\t\$(RM_RF) $line\n" if line;
     push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
     join('', @m);
 }
@@ -1634,10 +1571,6 @@ Guess what we're working around?  Also, use MM[SK] for subdirectories.
 
 sub realclean {
     my($self, %attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     my(@m);
     push(@m,'
 # Delete temporary files (via clean) and also delete installed files
@@ -1655,7 +1588,10 @@ realclean :: clean
     # combination of macros).  In order to stay below DCL's 255 char limit,
     # we put only 2 on a line.
     my($file,$line,$fcnt);
-    my(@files) = qw{ $(INST_DYNAMIC) $(INST_STATIC) $(INST_BOOT) $(OBJECT) $(MAKEFILE) $(MAKEFILE)_old };
+    my(@files) = qw{ $(MAKEFILE) $(MAKEFILE)_old };
+    if ($self->has_link_code) {
+       push(@files,qw{ $(INST_DYNAMIC) $(INST_STATIC) $(INST_BOOT) $(OBJECT) });
+    }
     push(@files, values %{$self->{PM}});
     $line = '';  #avoid unitialized var warning
     foreach $file (@files) {
@@ -1667,7 +1603,7 @@ realclean :: clean
        }
        else { $line .= " $file"; }
     }
-    push @m, "\t\$(RM_F) $line\n";
+    push @m, "\t\$(RM_F) $line\n" if $line;
     if ($attribs{FILES} && ref $attribs{FILES} eq 'ARRAY') {
        $line = '';
        foreach $file (@{$attribs{'FILES'}}) {
@@ -1678,7 +1614,7 @@ realclean :: clean
            }
            else { $line .= " $file"; }
        }
-       push @m, "\t\$(RM_RF) $line\n";
+       push @m, "\t\$(RM_RF) $line\n" if $line;
     }
     push(@m, " $attribs{POSTOP}\n")                     if $attribs{POSTOP};
     join('', @m);
@@ -1692,10 +1628,6 @@ Use VMS-style quoting on command line.
 
 sub dist_basics {
     my($self) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
 '
 distclean :: realclean distcheck
        $(NOOP)
@@ -1711,7 +1643,7 @@ manifest :
 ';
 }
 
-=sub dist_core (override)
+=item dist_core (override)
 
 Syntax for invoking F<VMS_Share> differs from that for Unix F<shar>,
 so C<shdist> target actions are VMS-specific.
@@ -1720,10 +1652,6 @@ so C<shdist> target actions are VMS-specific.
 
 sub dist_core {
     my($self) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
 q[
 dist : $(DIST_DEFAULT)
        ].$self->{NOECHO}.q[$(PERL) -le "print 'Warning: $m older than $vf' if -e ($vf = '$(VERSION_FROM)') && -M $vf < -M ($m = '$(MAKEFILE)'"
@@ -1737,6 +1665,14 @@ $(DISTVNAME).zip : distdir
        $(RM_RF) $(DISTVNAME)
        $(POSTOP)
 
+$(DISTVNAME).tar$(SUFFIX) : distdir
+       $(PREOP)
+       $(TO_UNIX)
+       $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar $(SRC)
+       $(RM_RF) $(DISTVNAME)
+       $(COMPRESS) $(DISTVNAME).tar
+       $(POSTOP)
+
 shdist : distdir
        $(PREOP)
        $(SHARE) $(SRC) $(DISTVNAME).share
@@ -1753,10 +1689,6 @@ Use VMS-style quoting on command line.
 
 sub dist_dir {
     my($self) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
 q{
 distdir :
        $(RM_RF) $(DISTVNAME)
@@ -1774,10 +1706,6 @@ quoting on command line.
 
 sub dist_test {
     my($self) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
 q{
 disttest : distdir
        startdir = F$Environment("Default")
@@ -1800,10 +1728,6 @@ VMS-style command line quoting in a few cases.
 
 sub install {
     my($self, %attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     my(@m,@docfiles);
 
     if ($self->{EXE_FILES}) {
@@ -1849,7 +1773,8 @@ pure_perl_install ::
        ].$self->{NOECHO}.q[$(PERL) -e "print 'write ].$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
        ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_LIB) $(INSTALLPRIVLIB) '" >>.MM_tmp
        ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLARCHLIB) '" >>.MM_tmp
-       ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_EXE) $(INSTALLBIN) '" >>.MM_tmp
+       ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
+       ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
        ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
        ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
        $(MOD_INSTALL) <.MM_tmp
@@ -1862,7 +1787,8 @@ pure_site_install ::
        ].$self->{NOECHO}.q[$(PERL) -e "print 'write ].$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
        ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_LIB) $(INSTALLSITELIB) '" >>.MM_tmp
        ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLSITEARCH) '" >>.MM_tmp
-       ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_EXE) $(INSTALLBIN) '" >>.MM_tmp
+       ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
+       ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
        ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
        ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
        $(MOD_INSTALL) <.MM_tmp
@@ -1912,10 +1838,6 @@ we have to rebuild Config.pm, use MM[SK] to do it.
 
 sub perldepend {
     my($self) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     my(@m);
 
     push @m, '
@@ -1970,10 +1892,6 @@ Use VMS commands and quoting.
 
 sub makefile {
     my($self) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     my(@m,@cmd);
     # We do not know what target was originally specified so we
     # must force a manual rerun to be sure. But as it should only
@@ -2006,15 +1924,13 @@ Use VMS commands for handling subdirectories.
 
 sub test {
     my($self, %attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     my($tests) = $attribs{TESTS} || ( -d 't' ? 't/*.t' : '');
     my(@m);
     push @m,"
 TEST_VERBOSE = 0
 TEST_TYPE = test_\$(LINKTYPE)
+TEST_FILE = test.pl
+TESTDB_SW = -d
 
 test :: \$(TEST_TYPE)
        \$(NOOP)
@@ -2038,11 +1954,9 @@ testdb :: testdb_\$(LINKTYPE)
     push(@m, "    \$(NOOP)\n") if (!$tests && ! -f "test.pl");
     push(@m, "\n");
 
-    if (-f 'test.pl') {
-       push(@m, "testdb_dynamic :: pure_all\n");
-       push(@m, $self->test_via_script('$(FULLPERL) -d', 'test.pl'));
-       push(@m, "\n");
-    }
+    push(@m, "testdb_dynamic :: pure_all\n");
+    push(@m, $self->test_via_script('$(FULLPERL) "$(TESTDB_SW)"', '$(TEST_FILE)'));
+    push(@m, "\n");
 
     # Occasionally we may face this degenerate target:
     push @m, "test_ : test_dynamic\n\n";
@@ -2050,13 +1964,10 @@ testdb :: testdb_\$(LINKTYPE)
     if ($self->needs_linking()) {
        push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
        push(@m, $self->test_via_harness('$(MAP_TARGET)', $tests)) if $tests;
-       if (-f 'test.pl') {
-           push(@m, $self->test_via_script('$(MAP_TARGET)', 'test.pl'));
-           push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
-           push(@m, $self->test_via_script('$(MAP_TARGET) -d', 'test.pl'));
-           push(@m, "\n");
-       }
-       push(@m, "\t$self->{NOECHO}\$(NOOP)\n") if (!$tests && ! -f "test.pl");
+       push(@m, $self->test_via_script('$(MAP_TARGET)', 'test.pl')) if -f 'test.pl';
+       push(@m, "\n");
+       push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
+       push(@m, $self->test_via_script('$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
        push(@m, "\n");
     }
     else {
@@ -2075,10 +1986,6 @@ Use VMS-style quoting on command line.
 
 sub test_via_harness {
     my($self,$perl,$tests) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     "  $perl".' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_LIB)" "-I$(PERL_ARCHLIB)" \\'."\n\t".
     '-e "use Test::Harness qw(&runtests $verbose); $verbose=$(TEST_VERBOSE); runtests @ARGV;" \\'."\n\t$tests\n";
 }
@@ -2091,10 +1998,6 @@ Use VMS-style quoting on command line.
 
 sub test_via_script {
     my($self,$perl,$script) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     "  $perl".' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" '.$script.'
 ';
 }
@@ -2110,10 +2013,6 @@ Consequently, it hasn't really been tested, and may well be incomplete.
 
 sub makeaperl {
     my($self, %attribs) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) = 
       @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
     my(@m);
@@ -2158,6 +2057,40 @@ $(MAP_TARGET) :: $(MAKE_APERL_FILE)
     File::Find::find(sub {
        return unless m/\Q$self->{LIB_EXT}\E$/;
        return if m/^libperl/;
+
+       if( exists $self->{INCLUDE_EXT} ){
+               my $found = 0;
+               my $incl;
+               my $xx;
+
+               ($xx = $File::Find::name) =~ s,.*?/auto/,,;
+               $xx =~ s,/?$_,,;
+               $xx =~ s,/,::,g;
+
+               # Throw away anything not explicitly marked for inclusion.
+               # DynaLoader is implied.
+               foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
+                       if( $xx eq $incl ){
+                               $found++;
+                               last;
+                       }
+               }
+               return unless $found;
+       }
+       elsif( exists $self->{EXCLUDE_EXT} ){
+               my $excl;
+               my $xx;
+
+               ($xx = $File::Find::name) =~ s,.*?/auto/,,;
+               $xx =~ s,/?$_,,;
+               $xx =~ s,/,::,g;
+
+               # Throw away anything explicitly marked for exclusion
+               foreach $excl (@{$self->{EXCLUDE_EXT}}){
+                       return if( $xx eq $excl );
+               }
+       }
+
        $olbs{$ENV{DEFAULT}} = $_;
     }, grep( -d $_, @{$searchdirs || []}));
 
@@ -2295,10 +2228,6 @@ support is added to that package.
 
 sub ext {
     my($self) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     '','','';
 }
 
@@ -2315,10 +2244,6 @@ part of a filespec.
 sub nicetext {
 
     my($self,$text) = @_;
-    unless (ref $self){
-       ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
-       $self = $ExtUtils::MakeMaker::Parent[-1];
-    }
     $text =~ s/([^\s:])(:+\s)/$1 $2/gs;
     $text;
 }
@@ -2326,3 +2251,4 @@ sub nicetext {
 1;
 
 __END__
+
index 63e742b..827cb72 100644 (file)
@@ -1,25 +1,11 @@
-require 5.002; # MakeMaker 5.17 was the last MakeMaker that was compatible with perl5.001m
-
-package main;
-use vars qw(%att);
-
-package ExtUtils::MakeMaker::TieAtt;
-# this package will go away again, when we don't have modules around
-# anymore that import %att It ties an empty %att and records in which
-# object this %att was tied. FETCH and STORE return/store-to the
-# appropriate value from %$self
-
-# the warndirectuse method warns if somebody calls MM->something. It
-# has nothing to do with the tie'd %att.
-
-$Enough_limit = 5;
+BEGIN {require 5.002;} # MakeMaker 5.17 was the last MakeMaker that was compatible with perl5.001m
 
 package ExtUtils::MakeMaker;
 
-$Version = $VERSION = "5.26";
-$Version_OK = "5.05";  # Makefiles older than $Version_OK will die
+$Version = $VERSION = "5.34";
+$Version_OK = "5.17";  # Makefiles older than $Version_OK will die
                        # (Will be checked from MakeMaker version 4.13 onwards)
-($Revision = substr(q$Revision: 1.187 $, 10)) =~ s/\s+$//;
+($Revision = substr(q$Revision: 1.202 $, 10)) =~ s/\s+$//;
 
 
 
@@ -29,14 +15,15 @@ use Carp ();
 #use FileHandle ();
 
 use vars qw(
-           $VERSION $Version_OK $Revision
-           $Verbose %MM_Sections $ISA_TTY
-           @MM_Sections %Recognized_Att_Keys @Get_from_Config
-           %Prepend_dot_dot %Config @Parent %NORMAL_INC
-           $Setup_done %Keep_after_flush
-           @Overridable
+
+           @ISA @EXPORT @EXPORT_OK $AUTOLOAD
+           $ISA_TTY $Is_Mac $Is_OS2 $Is_VMS $Revision $Setup_done
+           $VERSION $Verbose $Version_OK %Config %Keep_after_flush
+           %MM_Sections %Prepend_dot_dot %Recognized_Att_Keys
+           @Get_from_Config @MM_Sections @Overridable @Parent
+
           );
-#use strict qw(refs);
+# use strict;
 
 eval {require DynaLoader;};    # Get mod2fname, if defined. Will fail
                                 # with miniperl.
@@ -48,7 +35,7 @@ eval {require DynaLoader;};   # Get mod2fname, if defined. Will fail
 @ISA = qw(Exporter);
 @EXPORT = qw(&WriteMakefile &writeMakefile $Verbose &prompt);
 @EXPORT_OK = qw($VERSION &Version_check &neatvalue &mkbootstrap &mksymlists
-               $Version %att);  ## Import of %att is deprecated, please use OO features!
+               $Version);
                # $Version in mixed case will go away!
 
 #
@@ -66,7 +53,8 @@ eval {require DynaLoader;};   # Get mod2fname, if defined. Will fail
 #
 {
     package MY;
-    @ISA = qw(MM);
+    @MY::ISA = qw(MM);
+###    sub AUTOLOAD { use Devel::Symdump; print Devel::Symdump->rnew->as_string; Carp::confess "hey why? $AUTOLOAD" }
     package MM;
     sub DESTROY {}
 }
@@ -80,28 +68,21 @@ package ExtUtils::MakeMaker;
 # Now we can can pull in the friends
 #
 $Is_VMS = $^O eq 'VMS';
-$Is_OS2 = $^O eq 'os2';
+$Is_OS2 = $^O =~ m|^os/?2$|i;
+$Is_Mac = $^O eq 'MacOS';
 
 require ExtUtils::MM_Unix;
 
 if ($Is_VMS) {
     require ExtUtils::MM_VMS;
+    require VMS::Filespec; # is a noop as long as we require it within MM_VMS
 }
 if ($Is_OS2) {
     require ExtUtils::MM_OS2;
 }
-
-%NORMAL_INC = %INC;
-@NORMAL_INC{qw|File/Find.pm Cwd.pm ExtUtils/Manifest.pm ExtUtils/Liblist.pm|} = (1) x 4;
-
-
-# This has to go one day...
-$SIG{__WARN__} = sub {
-    $_[0] =~ /^Use of uninitialized value/ && return;
-    $_[0] =~ /used only once/ && return;
-    $_[0] =~ /^Subroutine\s+[\w:]+\s+redefined/ && return;
-    warn @_;
-};
+if ($Is_Mac) {
+    require ExtUtils::MM_Mac;
+}
 
 # The SelfLoader would bring a lot of overhead for MakeMaker, because
 # we know for sure we will use most of the autoloaded functions once
@@ -110,10 +91,12 @@ $SIG{__WARN__} = sub {
 sub AUTOLOAD {
     my $code;
     if (defined fileno(DATA)) {
-       while (<DATA>) {
-           last if /^__END__/;
-           $code .= $_;
-       }
+       my $fh = select DATA;
+       my $o = $/;                     # For future reads from the file.
+       $/ = "\n__END__\n";
+       $code = <DATA>;
+       $/ = $o;
+       select $fh;
        close DATA;
        eval $code;
        if ($@) {
@@ -143,6 +126,13 @@ Please rerun 'perl Makefile.PL' to regenerate the Makefile.\n"
        unless $checkversion == $VERSION;
 }
 
+sub warnhandler {
+    $_[0] =~ /^Use of uninitialized value/ && return;
+    $_[0] =~ /used only once/ && return;
+    $_[0] =~ /^Subroutine\s+[\w:]+\s+redefined/ && return;
+    warn @_;
+}
+
 sub ExtUtils::MakeMaker::eval_in_subdirs ;
 sub ExtUtils::MakeMaker::eval_in_x ;
 sub ExtUtils::MakeMaker::full_setup ;
@@ -160,19 +150,15 @@ sub ExtUtils::MakeMaker::neatvalue ;
 sub ExtUtils::MakeMaker::selfdocument ;
 sub ExtUtils::MakeMaker::WriteMakefile ;
 sub ExtUtils::MakeMaker::prompt ;
-sub ExtUtils::MakeMaker::TieAtt::TIEHASH ;
-sub ExtUtils::MakeMaker::TieAtt::FETCH ;
-sub ExtUtils::MakeMaker::TieAtt::STORE ;
-sub ExtUtils::MakeMaker::TieAtt::FIRSTKEY ;
-sub ExtUtils::MakeMaker::TieAtt::NEXTKEY ;
-sub ExtUtils::MakeMaker::TieAtt::DESTROY ;
-sub ExtUtils::MakeMaker::TieAtt::warndirectuse ;
-
-__DATA__
+
+1;
+#__DATA__
 package ExtUtils::MakeMaker;
 
 sub WriteMakefile {
     Carp::croak "WriteMakefile: Need even number of args" if @_ % 2;
+    local $SIG{__WARN__} = \&warnhandler;
+
     unless ($Setup_done++){
        full_setup();
        undef &ExtUtils::MakeMaker::full_setup; #safe memory
@@ -181,20 +167,19 @@ sub WriteMakefile {
     MM->new(\%att)->flush;
 }
 
-sub prompt {
+sub prompt ($;$) {
     my($mess,$def)=@_;
     $ISA_TTY = -t STDIN && -t STDOUT ;
     Carp::confess("prompt function called without an argument") unless defined $mess;
-    $def = "" unless defined $def;
-    my $dispdef = "[$def] ";
+    my $dispdef = defined $def ? "[$def] " : " ";
+    $def = defined $def ? $def : "";
     my $ans;
     if ($ISA_TTY) {
        local $|=1;
        print "$mess $dispdef";
-       chop($ans = <STDIN>);
+       chomp($ans = <STDIN>);
     }
-    return $ans if defined $ans;
-    return $def;
+    return $ans || $def;
 }
 
 sub eval_in_subdirs {
@@ -224,62 +209,86 @@ sub eval_in_x {
 #    $fh->close;
     close FH;
     eval $eval;
-    warn "WARNING from evaluation of $dir/Makefile.PL: $@" if $@;
+    if ($@) {
+#        if ($@ =~ /prerequisites/) {
+#            die "MakeMaker WARNING: $@";
+#        } else {
+#            warn "WARNING from evaluation of $dir/Makefile.PL: $@";
+#        }
+       warn "WARNING from evaluation of $dir/Makefile.PL: $@";
+    }
 }
 
 sub full_setup {
     $Verbose ||= 0;
     $^W=1;
 
-# package name for the classes into which the first object will be blessed
+    # package name for the classes into which the first object will be blessed
     $PACKNAME = "PACK000";
 
     @Attrib_help = qw/
 
     C CONFIG CONFIGURE DEFINE DIR DISTNAME DL_FUNCS DL_VARS EXE_FILES
-    NO_VC FIRST_MAKEFILE FULLPERL H INC INSTALLARCHLIB INSTALLBIN
-    INSTALLDIRS INSTALLMAN1DIR INSTALLMAN3DIR INSTALLPRIVLIB
-    INSTALLSITEARCH INSTALLSITELIB INST_ARCHLIB INST_EXE INST_LIB
-    INST_MAN1DIR INST_MAN3DIR LDFROM LIBPERL_A LIBS LINKTYPE MAKEAPERL
-    MAKEFILE MAN1PODS MAN3PODS MAP_TARGET MYEXTLIB NAME NEEDS_LINKING
-    NOECHO NORECURS OBJECT OPTIMIZE PERL PERLMAINCC PERL_ARCHLIB
-    PERL_LIB PERL_SRC PL_FILES PM PMLIBDIRS PREFIX PREREQ SKIP
-    TYPEMAPS VERSION VERSION_FROM XS XSOPT XSPROTOARG XS_VERSION clean
-    depend dist dynamic_lib linkext macro realclean tool_autosplit
+    EXCLUDE_EXT INCLUDE_EXT NO_VC FIRST_MAKEFILE FULLPERL H INC
+    INSTALLARCHLIB INSTALLBIN INSTALLDIRS INSTALLMAN1DIR
+    INSTALLMAN3DIR INSTALLPRIVLIB INSTALLSCRIPT INSTALLSITEARCH
+    INSTALLSITELIB INST_ARCHLIB INST_BIN INST_EXE INST_LIB
+    INST_MAN1DIR INST_MAN3DIR INST_SCRIPT LDFROM LIBPERL_A LIBS
+    LINKTYPE MAKEAPERL MAKEFILE MAN1PODS MAN3PODS MAP_TARGET MYEXTLIB
+    NAME NEEDS_LINKING NOECHO NORECURS OBJECT OPTIMIZE PERL PERLMAINCC
+    PERL_ARCHLIB PERL_LIB PERL_SRC PL_FILES PM PMLIBDIRS PREFIX
+    PREREQ_PM SKIP TYPEMAPS VERSION VERSION_FROM XS XSOPT XSPROTOARG
+    XS_VERSION clean depend dist dynamic_lib linkext macro realclean
+    tool_autosplit
 
     installpm
 
        /;
 
+    # ^^^ installpm is deprecated, will go about Summer 96
+
+    # @Overridable is close to @MM_Sections but not identical.  The
+    # order is important. Many subroutines declare macros. These
+    # depend on each other. Let's try to collect the macros up front,
+    # then pasthru, then the rules.
+
+    # MM_Sections are the sections we have to call explicitly
+    # in Overridable we have subroutines that are used indirectly
 
-    # @Overridable is close to MM_Sections
 
     @MM_Sections = 
        qw(
 
-       post_initialize const_config constants tool_autosplit
-       tool_xsubpp tools_other dist macro depend post_constants
-       pasthru c_o xs_c xs_o top_targets linkext dlsyms dynamic
-       dynamic_bs dynamic_lib static static_lib manifypods processPL
-       installbin subdirs clean realclean dist_basics dist_core
-       dist_dir dist_test dist_ci install force perldepend makefile
-       staticmake test postamble
+ post_initialize const_config constants tool_autosplit tool_xsubpp
+ tools_other dist macro depend cflags const_loadlibs const_cccmd
+ post_constants
+
+ pasthru
+
+ c_o xs_c xs_o top_targets linkext dlsyms dynamic dynamic_bs
+ dynamic_lib static static_lib manifypods processPL installbin subdirs
+ clean realclean dist_basics dist_core dist_dir dist_test dist_ci
+ install force perldepend makefile staticmake test
 
          ); # loses section ordering
 
     @Overridable = @MM_Sections;
-    push @Overridable, qw[ dir_target
-                          libscan makeaperl
-                          needs_linking subdir_x test_via_harness
-                          test_via_script ];
-    push @MM_Sections, qw[
-                         pm_to_blib selfdocument cflags const_loadlibs
-                         const_cccmd
+    push @Overridable, qw[
+
+ dir_target libscan makeaperl needs_linking subdir_x test_via_harness
+ test_via_script
+
                         ];
 
+    push @MM_Sections, qw[
 
-    #### Can we drop this?
-    #### @MM_Sections{@MM_Sections} = {} x @MM_Sections;
+ pm_to_blib selfdocument
+
+                        ];
+
+    # Postamble needs to be the last that was always the case
+    push @MM_Sections, "postamble";
+    push @Overridable, "postamble";
 
     # All sections are valid keys.
     @Recognized_Att_Keys{@MM_Sections} = (1) x @MM_Sections;
@@ -308,8 +317,11 @@ sub full_setup {
     #
     %Prepend_dot_dot = 
        qw(
-          INST_LIB 1 INST_ARCHLIB 1 INST_EXE 1 MAP_TARGET 1 INST_MAN1DIR 1 INST_MAN3DIR 1
-          PERL_SRC 1 PERL 1 FULLPERL 1
+
+          INST_BIN 1 INST_EXE 1 INST_LIB 1 INST_ARCHLIB 1 INST_SCRIPT
+          1 MAP_TARGET 1 INST_MAN1DIR 1 INST_MAN3DIR 1 PERL_SRC 1
+          PERL 1 FULLPERL 1
+
          );
 
     my @keep = qw/
@@ -353,6 +365,36 @@ sub ExtUtils::MakeMaker::new {
 
     my(%initial_att) = %$self; # record initial attributes
 
+    my($prereq);
+    foreach $prereq (sort keys %{$self->{PREREQ_PM}}) {
+       my $eval = "use $prereq $self->{PREREQ_PM}->{$prereq}";
+       eval $eval;
+       if ($@){
+           warn "Warning: prerequisite $prereq $self->{PREREQ_PM}->{$prereq} not found";
+       } else {
+           delete $self->{PREREQ_PM}{$prereq};
+       }
+    }
+#    if (@unsatisfied){
+#        unless (defined $ExtUtils::MakeMaker::useCPAN) {
+#            print qq{MakeMaker WARNING: prerequisites not found (@unsatisfied)
+# Please install these modules first and rerun 'perl Makefile.PL'.\n};
+#            if ($ExtUtils::MakeMaker::hasCPAN) {
+#                $ExtUtils::MakeMaker::useCPAN = prompt(qq{Should I try to use the CPAN module to fetch them for you?},"yes");
+#            } else {
+#                print qq{Hint: You may want to install the CPAN module to autofetch the needed modules\n};
+#                $ExtUtils::MakeMaker::useCPAN=0;
+#            }
+#        }
+#        if ($ExtUtils::MakeMaker::useCPAN) {
+#            require CPAN;
+#            CPAN->import(@unsatisfied);
+#        } else {
+#            die qq{prerequisites not found (@unsatisfied)};
+#        }
+#      warn qq{WARNING: prerequisites not found (@unsatisfied)};
+#    }
+
     if (defined $self->{CONFIGURE}) {
        if (ref $self->{CONFIGURE} eq 'CODE') {
            $self = { %$self, %{&{$self->{CONFIGURE}}}};
@@ -457,7 +499,6 @@ END
        $self->eval_in_subdirs if @{$self->{DIR}};
     }
 
-    tie %::att, ExtUtils::MakeMaker::TieAtt, $self;
     my $section;
     foreach $section ( @MM_Sections ){
        print "Processing Makefile '$section' section\n" if ($Verbose >= 2);
@@ -551,12 +592,21 @@ sub parse_args{
        # have to build a list with the shell
        $self->{DIR} = [grep $_, split ":", $self->{DIR}];
     }
+    # Turn a INCLUDE_EXT argument on the command line into an array
+    if (defined $self->{INCLUDE_EXT} && ref \$self->{INCLUDE_EXT} eq 'SCALAR') {
+       $self->{INCLUDE_EXT} = [grep $_, split '\s+', $self->{INCLUDE_EXT}];
+    }
+    # Turn a EXCLUDE_EXT argument on the command line into an array
+    if (defined $self->{EXCLUDE_EXT} && ref \$self->{EXCLUDE_EXT} eq 'SCALAR') {
+       $self->{EXCLUDE_EXT} = [grep $_, split '\s+', $self->{EXCLUDE_EXT}];
+    }
     my $mmkey;
     foreach $mmkey (sort keys %$self){
        print STDOUT "  $mmkey => ", neatvalue($self->{$mmkey}), "\n" if $Verbose;
        print STDOUT "'$mmkey' is not a known MakeMaker parameter name.\n"
            unless exists $Recognized_Att_Keys{$mmkey};
     }
+    $| = 1 if $Verbose;
 }
 
 sub check_hints {
@@ -567,7 +617,7 @@ sub check_hints {
 
     # First we look for the best hintsfile we have
     my(@goodhints);
-    my($hint)="$Config{osname}_$Config{osvers}";
+    my($hint)="${^O}_$Config{osvers}";
     $hint =~ s/\./_/g;
     $hint =~ s/_$//;
     return unless $hint;
@@ -630,7 +680,7 @@ sub mv_all_methods {
        # %MY:: being intact, we have to fill the hole with an
        # inheriting method:
 
-       eval "package MY; sub $method {local *$method; shift->MY::$method(\@_); }";
+       eval "package MY; sub $method { shift->SUPER::$method(\@_); }";
     }
 
     # We have to clean out %INC also, because the current directory is
@@ -638,13 +688,18 @@ sub mv_all_methods {
     # out of a History.pl file which is "required" so woudn't get
     # loaded again in another extension requiring a History.pl
 
-    my $inc;
-    foreach $inc (keys %INC) {
-       next if $NORMAL_INC{$inc};
-       #warn "***$inc*** deleted";
-       delete $INC{$inc};
-    }
-
+    # With perl5.002_01 the deletion of entries in %INC caused Tk-b11
+    # to core dump in the middle of a require statement. The required
+    # file was Tk/MMutil.pm.  The consequence is, we have to be
+    # extremely careful when we try to give perl a reason to reload a
+    # library with same name.  The workaround prefers to drop nothing
+    # from %INC and teach the writers not to use such libraries.
+
+#    my $inc;
+#    foreach $inc (keys %INC) {
+#      #warn "***$inc*** deleted";
+#      delete $INC{$inc};
+#    }
 }
 
 sub skipcheck {
@@ -764,53 +819,6 @@ sub selfdocument {
     join "\n", @m;
 }
 
-package ExtUtils::MakeMaker::TieAtt;
-
-sub TIEHASH {
-    bless { SECRETHASH => $_[1]};
-}
-
-sub FETCH {
-    print "Warning (non-fatal): Importing of %att is deprecated [$_[1]]
-       use \$self instead\n" unless ++$Enough>$Enough_limit;
-    print "Further ExtUtils::MakeMaker::TieAtt warnings suppressed\n" if $Enough==$Enough_limit;
-    $_[0]->{SECRETHASH}->{$_[1]};
-}
-
-sub STORE {
-    print "Warning (non-fatal): Importing of %att is deprecated [$_[1]][$_[2]]
-       use \$self instead\n" unless ++$Enough>$Enough_limit;
-    print "Further ExtUtils::MakeMaker::TieAtt warnings suppressed\n" if $Enough==$Enough_limit;
-    $_[0]->{SECRETHASH}->{$_[1]} = $_[2];
-}
-
-sub FIRSTKEY {
-    print "Warning (non-fatal): Importing of %att is deprecated [FIRSTKEY]
-       use \$self instead\n" unless ++$Enough>$Enough_limit;
-    print "Further ExtUtils::MakeMaker::TieAtt warnings suppressed\n" if $Enough==$Enough_limit;
-    each %{$_[0]->{SECRETHASH}};
-}
-
-sub NEXTKEY {
-    each %{$_[0]->{SECRETHASH}};
-}
-
-sub DESTROY {
-}
-
-sub warndirectuse {
-    my($caller) = @_;
-    return if $Enough>$Enough_limit;
-    print STDOUT "Warning (non-fatal): Direct use of class methods deprecated; use\n";
-    my($method) = $caller =~ /.*:(\w+)$/;
-    print STDOUT
-'              my $self = shift;
-               $self->MM::', $method, "();
-       instead\n";
-    print "Further ExtUtils::MakeMaker::TieAtt warnings suppressed\n"
-       if ++$Enough==$Enough_limit;
-}
-
 package ExtUtils::MakeMaker;
 1;
 
@@ -840,90 +848,29 @@ It splits the task of generating the Makefile into several subroutines
 that can be individually overridden.  Each subroutine returns the text
 it wishes to have written to the Makefile.
 
-=head2 Hintsfile support
-
-MakeMaker.pm uses the architecture specific information from
-Config.pm. In addition it evaluates architecture specific hints files
-in a C<hints/> directory. The hints files are expected to be named
-like their counterparts in C<PERL_SRC/hints>, but with an C<.pl> file
-name extension (eg. C<next_3_2.pl>). They are simply C<eval>ed by
-MakeMaker within the WriteMakefile() subroutine, and can be used to
-execute commands as well as to include special variables. The rules
-which hintsfile is chosen are the same as in Configure.
-
-The hintsfile is eval()ed immediately after the arguments given to
-WriteMakefile are stuffed into a hash reference $self but before this
-reference becomes blessed. So if you want to do the equivalent to
-override or create an attribute you would say something like
-
-    $self->{LIBS} = ['-ldbm -lucb -lc'];
-
-=head2 What's new in version 5 of MakeMaker
-
-MakeMaker 5 is pure object oriented. This allows us to write an
-unlimited number of Makefiles with a single perl process. 'perl
-Makefile.PL' with MakeMaker 5 goes through all subdirectories
-immediately and evaluates any Makefile.PL found in the next level
-subdirectories. The benefit of this approach comes in useful for both
-single and multi directories extensions.
-
-Multi directory extensions have an immediately visible speed
-advantage, because there's no startup penalty for any single
-subdirectory Makefile.
-
-Single directory packages benefit from the much improved
-needs_linking() method. As the main Makefile knows everything about
-the subdirectories, a needs_linking() method can now query all
-subdirectories if there is any linking involved down in the tree. The
-speedup for PM-only Makefiles seems to be around 1 second on my
-Indy 100 MHz.
-
-=head2 Incompatibilities between MakeMaker 5.00 and 4.23
-
-There are no incompatibilities in the short term, as all changes are
-accompanied by short-term workarounds that guarantee full backwards
-compatibility.
-
-You are likely to face a few warnings that expose deprecations which
-will result in incompatibilities in the long run:
-
-You should not use %att directly anymore. Instead any subroutine you
-override in the MY package will be called by the object method, so you
-can access all object attributes directly via the object in $_[0].
-
-You should not call the class methos MM->something anymore. Instead
-you should call the superclass. Something like
+MakeMaker is object oriented. Each directory below the current
+directory that contains a Makefile.PL. Is treated as a separate
+object. This makes it possible to write an unlimited number of
+Makefiles with a single invocation of WriteMakefile().
 
-    sub MY::constants {
-        my $self = shift;
-        $self->MM::constants();
-    }
-
-Especially the libscan() and exescan() methods should be altered
-towards OO programming, that means do not expect that $_ to contain
-the path but rather $_[1].
-
-Try to build several extensions simultanously to debug your
-Makefile.PL. You can unpack a bunch of distributed packages within one
-directory and run
+=head2 How To Write A Makefile.PL
 
-    perl -MExtUtils::MakeMaker -e 'WriteMakefile()'
+The short answer is: Don't. Run h2xs(1) before you start thinking
+about writing a module. For so called pm-only modules that consist of
+C<*.pm> files only, h2xs has the very useful C<-X> switch. This will
+generate dummy files of all kinds that are useful for the module
+developer.
 
-That's actually fun to watch :)
+The medium answer is:
 
-Do not use exit() in your Makefile.PL. MakeMaker tries hard to enable
-multi-module builds in one go.
-
-Final suggestion: Try to delete all of your MY:: subroutines and
-watch, if you really still need them. MakeMaker might already do what
-you want without them. If you see no way to avoid your own subroutine
-solution, please let us know about the problem.
+    use ExtUtils::MakeMaker;
+    WriteMakefile( NAME => "Foo::Bar" );
 
+The long answer is below.
 
 =head2 Default Makefile Behaviour
 
-The automatically generated Makefile enables the user of the extension
-to invoke
+The generated Makefile enables the user of the extension to invoke
 
   perl Makefile.PL # optionally "perl Makefile.PL verbose"
   make
@@ -958,11 +905,11 @@ switches set correctly.
 =head2 make install
 
 make alone puts all relevant files into directories that are named by
-the macros INST_LIB, INST_ARCHLIB, INST_EXE, INST_MAN1DIR, and
-INST_MAN3DIR. All these default to something below ./blib if
-you are I<not> building below the perl source directory. If you I<are>
+the macros INST_LIB, INST_ARCHLIB, INST_SCRIPT, INST_MAN1DIR, and
+INST_MAN3DIR. All these default to something below ./blib if you are
+I<not> building below the perl source directory. If you I<are>
 building below the perl source, INST_LIB and INST_ARCHLIB default to
- ../../lib, and INST_EXE is not defined.
+../../lib, and INST_SCRIPT is not defined.
 
 The I<install> target of the generated Makefile copies the files found
 below each of the INST_* directories to their INSTALL*
@@ -974,7 +921,8 @@ INSTALLDIRS according to the following table:
 
     INST_ARCHLIB    INSTALLARCHLIB    INSTALLSITEARCH
     INST_LIB        INSTALLPRIVLIB    INSTALLSITELIB
-    INST_EXE                   INSTALLBIN
+    INST_BIN                  INSTALLBIN
+    INST_SCRIPT              INSTALLSCRIPT
     INST_MAN1DIR             INSTALLMAN1DIR
     INST_MAN3DIR             INSTALLMAN3DIR
 
@@ -987,26 +935,11 @@ You can check the values of these variables on your system with
         sprintf("%20s: %s", $_, $Config{$_}),
         grep /^install/, keys %Config'
 
-If you don't want to keep the defaults, MakeMaker helps you to
-minimize the typing needed: the usual relationship between
-INSTALLPRIVLIB and INSTALLARCHLIB is determined by Configure at perl
-compilation time. MakeMaker supports the user who sets
-INSTALLPRIVLIB. If INSTALLPRIVLIB is set, but INSTALLARCHLIB not, then
-MakeMaker defaults the latter to be the same subdirectory of
-INSTALLPRIVLIB as Configure decided for the counterparts in %Config ,
-otherwise it defaults to INSTALLPRIVLIB. The same relationship holds
-for INSTALLSITELIB and INSTALLSITEARCH.
+And to check the sequence in which the library directories are
+searched by perl, run
 
-MakeMaker gives you much more freedom than needed to configure
-internal variables and get different results. It is worth to mention,
-that make(1) also lets you configure most of the variables that are
-used in the Makefile. But in the majority of situations this will not
-be necessary, and should only be done, if the author of a package
-recommends it (or you know what you're doing).
-
-=cut
+    perl -le 'print join $/, @INC'
 
-#'
 
 =head2 PREFIX attribute
 
@@ -1023,7 +956,7 @@ default, nor by make.
 
 If the user has superuser privileges, and is not working on AFS
 (Andrew File System) or relatives, then the defaults for
-INSTALLPRIVLIB, INSTALLARCHLIB, INSTALLBIN, etc. will be appropriate,
+INSTALLPRIVLIB, INSTALLARCHLIB, INSTALLSCRIPT, etc. will be appropriate,
 and this incantation will be the best:
 
     perl Makefile.PL; make; make test
@@ -1040,7 +973,7 @@ probably have changed since perl itself has been installed. They will
 have to do this by calling
 
     perl Makefile.PL INSTALLSITELIB=/afs/here/today \
-       INSTALLBIN=/afs/there/now INSTALLMAN3DIR=/afs/for/manpages
+       INSTALLSCRIPT=/afs/there/now INSTALLMAN3DIR=/afs/for/manpages
     make
 
 Be careful to repeat this procedure every time you recompile an
@@ -1142,19 +1075,25 @@ of the perl library. The other variables default to the following:
 If perl has not yet been installed then PERL_SRC can be defined on the
 command line as shown in the previous section.
 
-=head2 Useful Default Makefile Macros
 
-FULLEXT = Pathname for extension directory (eg DBD/Oracle).
+=head2 Which architecture dependent directory?
 
-BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
-
-ROOTEXT = Directory part of FULLEXT with leading slash (eg /DBD)
-
-INST_LIBDIR = C<$(INST_LIB)$(ROOTEXT)>
-
-INST_AUTODIR = C<$(INST_LIB)/auto/$(FULLEXT)>
+If you don't want to keep the defaults for the INSTALL* macros,
+MakeMaker helps you to minimize the typing needed: the usual
+relationship between INSTALLPRIVLIB and INSTALLARCHLIB is determined
+by Configure at perl compilation time. MakeMaker supports the user who
+sets INSTALLPRIVLIB. If INSTALLPRIVLIB is set, but INSTALLARCHLIB not,
+then MakeMaker defaults the latter to be the same subdirectory of
+INSTALLPRIVLIB as Configure decided for the counterparts in %Config ,
+otherwise it defaults to INSTALLPRIVLIB. The same relationship holds
+for INSTALLSITELIB and INSTALLSITEARCH.
 
-INST_ARCHAUTODIR = C<$(INST_ARCHLIB)/auto/$(FULLEXT)>
+MakeMaker gives you much more freedom than needed to configure
+internal variables and get different results. It is worth to mention,
+that make(1) also lets you configure most of the variables that are
+used in the Makefile. But in the majority of situations this will not
+be necessary, and should only be done, if the author of a package
+recommends it (or you know what you're doing).
 
 =head2 Using Attributes and Parameters
 
@@ -1238,10 +1177,19 @@ universal symbols.  Used only under AIX (export lists) and VMS
 (linker options) at present.  Defaults to [].  (e.g. [ qw(
 Foo_version Foo_numstreams Foo_tree ) ])
 
+=item EXCLUDE_EXT
+
+Array of extension names to exclude when doing a static build.  This
+is ignored if INCLUDE_EXT is present.  Consult INCLUDE_EXT for more
+details.  (e.g.  [ qw( Socket POSIX ) ] )
+
+This attribute may be most useful when specified as a string on the
+commandline:  perl Makefile.PL EXCLUDE_EXT='Socket Safe'
+
 =item EXE_FILES
 
 Ref to array of executable files. The files will be copied to the
-INST_EXE directory. Make realclean will delete them from there
+INST_SCRIPT directory. Make realclean will delete them from there
 again.
 
 =item NO_VC
@@ -1269,6 +1217,21 @@ Ref to array of *.h file names. Similar to C.
 
 Include file dirs eg: C<"-I/usr/5include -I/path/to/inc">
 
+=item INCLUDE_EXT
+
+Array of extension names to be included when doing a static build.
+MakeMaker will normally build with all of the installed extensions when
+doing a static build, and that is usually the desired behavior.  If
+INCLUDE_EXT is present then MakeMaker will build only with those extensions
+which are explicitly mentioned. (e.g.  [ qw( Socket POSIX ) ])
+
+It is not necessary to mention DynaLoader or the current extension when
+filling in INCLUDE_EXT.  If the INCLUDE_EXT is mentioned but is empty then
+only DynaLoader and the current extension will be included in the build.
+
+This attribute may be most useful when specified as a string on the
+commandline:  perl Makefile.PL INCLUDE_EXT='POSIX Socket Devel::Peek'
+
 =item INSTALLARCHLIB
 
 Used by 'make install', which copies files from INST_ARCHLIB to this
@@ -1276,8 +1239,7 @@ directory if INSTALLDIRS is set to perl.
 
 =item INSTALLBIN
 
-Used by 'make install' which copies files from INST_EXE to this
-directory.
+Directory to install binary files (e.g. tkperl) into.
 
 =item INSTALLDIRS
 
@@ -1301,6 +1263,11 @@ $Config{installman3dir}.
 Used by 'make install', which copies files from INST_LIB to this
 directory if INSTALLDIRS is set to perl.
 
+=item INSTALLSCRIPT
+
+Used by 'make install' which copies files from INST_SCRIPT to this
+directory.
+
 =item INSTALLSITELIB
 
 Used by 'make install', which copies files from INST_LIB to this
@@ -1315,11 +1282,15 @@ directory if INSTALLDIRS is set to site (default).
 
 Same as INST_LIB for architecture dependent files.
 
+=item INST_BIN
+
+Directory to put real binary files during 'make'. These will be copied
+to INSTALLBIN during 'make install'
+
 =item INST_EXE
 
-Directory, where executable scripts should be installed during
-'make'. Defaults to "./blib/bin", just to have a dummy location during
-testing. make install will copy the files in INST_EXE to INSTALLBIN.
+Old name for INST_SCRIPT. Deprecated. Please use INST_SCRIPT if you
+need to use it.
 
 =item INST_LIB
 
@@ -1334,6 +1305,13 @@ Directory to hold the man pages at 'make' time
 
 Directory to hold the man pages at 'make' time
 
+=item INST_SCRIPT
+
+Directory, where executable files should be installed during
+'make'. Defaults to "./blib/bin", just to have a dummy location during
+testing. make install will copy the files in INST_SCRIPT to
+INSTALLSCRIPT.
+
 =item LDFROM
 
 defaults to "$(OBJECT)" and is used in the ld command to specify
@@ -1421,7 +1399,7 @@ this boolean variable yourself.
 
 =item NOECHO
 
-Defaults the C<@>. By setting it to an empty string you can generate a
+Defaults to C<@>. By setting it to an empty string you can generate a
 Makefile that echos all commands. Mainly used in debugging MakeMaker
 itself.
 
@@ -1501,18 +1479,19 @@ branch from that node into lib/, lib/ARCHNAME or whatever Configure
 decided at the build time of your perl (unless you override one of
 them, of course).
 
-=item PREREQ
+=item PREREQ_PM
 
-Placeholder, not yet implemented. Will eventually be a hashref: Names
-of modules that need to be available to run this extension (e.g. Fcntl
-for SDBM_File) are the keys of the hash and the desired version is the
-value. Needs further evaluation, should probably allow to define
-prerequisites among header files, libraries, perl version, etc.
+Hashref: Names of modules that need to be available to run this
+extension (e.g. Fcntl for SDBM_File) are the keys of the hash and the
+desired version is the value. If the required version number is 0, we
+only check if any version is installed already.
 
 =item SKIP
 
 Arryref. E.g. [qw(name1 name2)] skip (do not write) sections of the
-Makefile
+Makefile. Caution! Do not use the SKIP attribute for the neglectible
+speedup. It may seriously damage the resulting Makefile. Only use it,
+if you really need it.
 
 =item TYPEMAPS
 
@@ -1543,7 +1522,7 @@ B<after> the eval() will be assigned to the VERSION attribute of the
 MakeMaker object. The following lines will be parsed o.k.:
 
     $VERSION = '1.00';
-    ( $VERSION ) = '$Revision: 1.187 $ ' =~ /\$Revision:\s+([^\s]+)/;
+    ( $VERSION ) = '$Revision: 1.201 $ ' =~ /\$Revision:\s+([^\s]+)/;
     $FOO::VERSION = '1.10';
 
 but these will fail:
@@ -1587,7 +1566,7 @@ to the value of the VERSION attribute.
 =head2 Additional lowercase attributes
 
 can be used to pass parameters to the methods which implement that
-part of the Makefile. These are not normally required:
+part of the Makefile.
 
 =over 2
 
@@ -1603,7 +1582,7 @@ part of the Makefile. These are not normally required:
 
   {TARFLAGS => 'cvfF', COMPRESS => 'gzip', SUFFIX => 'gz',
   SHAR => 'shar -m', DIST_CP => 'ln', ZIP => '/bin/zip',
-  ZIPFLAGS => '-rl'}
+  ZIPFLAGS => '-rl', DIST_DEFAULT => 'private tardist' }
 
 If you specify COMPRESS, then SUFFIX should also be altered, as it is
 needed to tell make the target file of the compression. Setting
@@ -1665,15 +1644,15 @@ either say:
 or you can edit the default by saying something like:
 
        sub MY::c_o {
-           my $self = shift;
-           local *c_o;
-            $_=$self->MM::c_o;
-           s/old text/new text/;
-           $_;
+            my($inherited) = shift->SUPER::c_o(@_);
+           $inherited =~ s/old text/new text/;
+           $inherited;
        }
 
-Both methods above are available for backwards compatibility with
-older Makefile.PLs.
+If you running experiments with embedding perl as a library into other
+applications, you might find MakeMaker not sufficient. You'd better
+have a look at ExtUtils::embed which is a collection of utilities for
+embedding.
 
 If you still need a different solution, try to develop another
 subroutine, that fits your needs and submit the diffs to
@@ -1692,6 +1671,24 @@ Makefile:
     }
 
 
+=head2 Hintsfile support
+
+MakeMaker.pm uses the architecture specific information from
+Config.pm. In addition it evaluates architecture specific hints files
+in a C<hints/> directory. The hints files are expected to be named
+like their counterparts in C<PERL_SRC/hints>, but with an C<.pl> file
+name extension (eg. C<next_3_2.pl>). They are simply C<eval>ed by
+MakeMaker within the WriteMakefile() subroutine, and can be used to
+execute commands as well as to include special variables. The rules
+which hintsfile is chosen are the same as in Configure.
+
+The hintsfile is eval()ed immediately after the arguments given to
+WriteMakefile are stuffed into a hash reference $self but before this
+reference becomes blessed. So if you want to do the equivalent to
+override or create an attribute you would say something like
+
+    $self->{LIBS} = ['-ldbm -lucb -lc'];
+
 =head2 Distribution Support
 
 For authors of extensions MakeMaker provides several Makefile
@@ -1737,7 +1734,9 @@ a make test in that directory.
 =item    make tardist
 
 First does a distdir. Then a command $(PREOP) which defaults to a null
-command. Next it runs C<tar> on that directory into a tarfile and
+command, followed by $(TOUNIX), which defaults to a null command under
+UNIX, and will convert files in distribution directory to UNIX format
+otherwise. Next it runs C<tar> on that directory into a tarfile and
 deletes the directory. Finishes with a command $(POSTOP) which
 defaults to a null command.
 
@@ -1778,6 +1777,7 @@ following parameters are recognized:
     COMPRESS     ('compress')
     POSTOP       ('@ :')
     PREOP        ('@ :')
+    TO_UNIX      (depends on the system)
     RCS_LABEL    ('rcs -q -Nv$(VERSION_SYM):')
     SHAR         ('shar')
     SUFFIX       ('Z')
@@ -1790,6 +1790,10 @@ An example:
 
     WriteMakefile( 'dist' => { COMPRESS=>"gzip", SUFFIX=>"gz" })
 
+=head1 SEE ALSO
+
+ExtUtils::MM_Unix, ExtUtils::Manifest, ExtUtils::testlib,
+ExtUtils::Install, ExtUtils::embed
 
 =head1 AUTHORS
 
@@ -1801,13 +1805,4 @@ Zakharevich F<E<lt>ilya@math.ohio-state.eduE<gt>>. Contact the
 makemaker mailing list C<mailto:makemaker@franz.ww.tu-berlin.de>, if
 you have any questions.
 
-=head1 MODIFICATION HISTORY
-
-For a more complete documentation see the file Changes in the
-MakeMaker distribution package.
-
-=head1 TODO
-
-See the file Todo in the MakeMaker distribution package.
-
 =cut
index eb55560..14d0f6e 100644 (file)
@@ -15,7 +15,7 @@ $Debug = 0;
 $Verbose = 1;
 $Is_VMS = $^O eq 'VMS';
 
-$VERSION = $VERSION = substr(q$Revision: 1.23 $,10,4);
+$VERSION = $VERSION = substr(q$Revision: 1.24 $,10,4);
 
 $Quiet = 0;
 
@@ -36,7 +36,7 @@ sub mkmanifest {
     my $matches = _maniskip();
     my $found = manifind();
     my($key,$val,$file,%all);
-    my %all = (%$found, %$read);
+    %all = (%$found, %$read);
     $all{$MANIFEST} = ($Is_VMS ? "$MANIFEST\t\t" : '') . 'This list of files'
         if $manimiss; # add new MANIFEST to known file list
     foreach $file (sort keys %all) {
@@ -138,7 +138,7 @@ sub _maniskip {
     my ($mfile) = @_;
     my $matches = sub {0};
     my @skip ;
-    my $mfile = "$MANIFEST.SKIP" unless defined $mfile;
+    $mfile = "$MANIFEST.SKIP" unless defined $mfile;
     local *M;
     return $matches unless -f $mfile;
     open M, $mfile or return $matches;
@@ -290,8 +290,10 @@ comments are seperated by one or more TAB characters in the
 output. All files that match any regular expression in a file
 C<MANIFEST.SKIP> (if such a file exists) are ignored.
 
-Manicheck() checks if all the files within a C<MANIFEST> in the current
-directory really do exist.
+Manicheck() checks if all the files within a C<MANIFEST> in the
+current directory really do exist. It only reports discrepancies and
+exits silently if MANIFEST and the tree below the current directory
+are in sync.
 
 Filecheck() finds files below the current directory that are not
 mentioned in the C<MANIFEST> file. An optional file C<MANIFEST.SKIP>
index 87b2b8f..5c0173a 100644 (file)
@@ -4,13 +4,14 @@ use strict qw[ subs refs ];
 
 use Carp;
 use Exporter;
-# mention vars twice to prevent single-use warnings
-@ExtUtils::Mksymlists::ISA = @ExtUtils::Mksymlists::ISA = 'Exporter';
-@ExtUtils::Mksymlists::EXPORT = @ExtUtils::Mksymlists::EXPORT = '&Mksymlists';
-$ExtUtils::Mksymlists::VERSION = $ExtUtils::Mksymlists::VERSION = '1.00';
+use vars qw( @ISA @EXPORT $VERSION );
+@ISA = 'Exporter';
+@EXPORT = '&Mksymlists';
+$VERSION = '1.03';
 
 sub Mksymlists {
     my(%spec) = @_;
+    my($osname) = $^O;
 
     croak("Insufficient information specified to Mksymlists")
         unless ( $spec{NAME} or
@@ -44,10 +45,10 @@ sub Mksymlists {
         $spec{DLBASE} = DynaLoader::mod2fname([ split(/::/,$spec{NAME}) ]);
     }
 
-    if    ($^O eq 'aix') { _write_aix(\%spec); }
-    elsif ($^O eq 'VMS') { _write_vms(\%spec) }
-    elsif ($^O eq 'os2') { _write_os2(\%spec) }
-    else { croak("Don't know how to create linker option file for $^O\n"); }
+    if    ($osname eq 'aix') { _write_aix(\%spec); }
+    elsif ($osname eq 'VMS') { _write_vms(\%spec) }
+    elsif ($osname =~ m|^os/?2$|i) { _write_os2(\%spec) }
+    else { croak("Don't know how to create linker option file for $osname\n"); }
 }
 
 
@@ -95,7 +96,7 @@ while (($name, $exp)= each %{$data->{IMPORTS}}) {
 sub _write_vms {
     my($data) = @_;
 
-    require Config;
+    require Config; # a reminder for once we do $^O
 
     my($isvax) = $Config::Config{'arch'} =~ /VAX/i;
     my($sym);