MM_Unix.pm : work around File::Find problem on VMS
[p5sagit/p5-mst-13.2.git] / lib / ExtUtils / MM_Unix.pm
index b106ab2..bb76013 100644 (file)
@@ -5,7 +5,7 @@ require 5.005_03;  # Maybe further back, dunno
 use strict;
 
 use Exporter ();
-use Carp ();
+use Carp;
 use Config;
 use File::Basename qw(basename dirname fileparse);
 use File::Spec;
@@ -19,21 +19,17 @@ use vars qw($VERSION @ISA
 
 use ExtUtils::MakeMaker qw($Verbose neatvalue);
 
-$VERSION = '1.30_01';
+$VERSION = '1.33';
 
 require ExtUtils::MM_Any;
 @ISA = qw(ExtUtils::MM_Any);
 
 $Is_OS2   = $^O eq 'os2';
 $Is_Mac   = $^O eq 'MacOS';
-$Is_Win32 = $^O eq 'MSWin32';
+$Is_Win32 = $^O eq 'MSWin32' || $Config{osname} eq 'NetWare';
 $Is_Dos   = $^O eq 'dos';
 $Is_VOS   = $^O eq 'vos';
-
-if ($Is_VMS = $^O eq 'VMS') {
-    require VMS::Filespec;
-    import VMS::Filespec qw( &vmsify );
-}
+$Is_VMS   = $^O eq 'VMS';
 
 =head1 NAME
 
@@ -865,8 +861,8 @@ sub dist_test {
     push @m, q{
 disttest : distdir
        cd $(DISTVNAME) && $(ABSPERLRUN) Makefile.PL
-       cd $(DISTVNAME) && $(MAKE)
-       cd $(DISTVNAME) && $(MAKE) test
+       cd $(DISTVNAME) && $(MAKE) $(PASTHRU)
+       cd $(DISTVNAME) && $(MAKE) test $(PASTHRU)
 };
     join "", @m;
 }
@@ -1008,7 +1004,7 @@ $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists
     push(@m,'  $(RM_F) $@
 ');
 
-    my $libs = $self->{LDLOADLIBS} || '';
+    my $libs = '$(LDLOADLIBS)';
 
     if ($^O eq 'netbsd') {
        # Use nothing on static perl platforms, and to the flags needed
@@ -1017,9 +1013,9 @@ $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists
        # or -R to add paths to the run-time library search path.
        if ($Config{'useshrplib'}) {
            if ($Config{'lddlflags'} =~ /-Wl,-R/) {
-               $libs = '-L$(PERL_INC) -Wl,-R$(INSTALLARCHLIB)/CORE -lperl';
+               $libs .= ' -L$(PERL_INC) -Wl,-R$(INSTALLARCHLIB)/CORE -lperl';
            } elsif ($Config{'lddlflags'} =~ /-R/) {
-               $libs = '-L$(PERL_INC) -R$(INSTALLARCHLIB)/CORE -lperl';
+               $libs .= ' -L$(PERL_INC) -R$(INSTALLARCHLIB)/CORE -lperl';
            }
        }
     }
@@ -1102,6 +1098,20 @@ in these dirs:
     0; # false and not empty
 }
 
+=item find_tests
+
+  my $test = $mm->find_tests;
+
+Returns a string suitable for feeding to the shell to return all
+tests in t/*.t.
+
+=cut
+
+sub find_tests {
+    my($self) = shift;
+    return 't/*.t';
+}
+
 =back
 
 =head2 Methods to actually produce chunks of text for the Makefile
@@ -1126,7 +1136,7 @@ sub fixin { # stolen from the pink Camel book, more or less
     for my $file (@files) {
        local(*FIXIN);
        local(*FIXOUT);
-       open(FIXIN, $file) or Carp::croak "Can't process '$file': $!";
+       open(FIXIN, $file) or croak "Can't process '$file': $!";
        local $/ = "\n";
        chomp(my $line = <FIXIN>);
        next unless $line =~ s/^\s*\#!\s*//;     # Not a shbang file.
@@ -1339,8 +1349,15 @@ sub init_dirscan {       # --- File and Directory Lists (.xs .pm .pod etc)
     # (which includes PARENT_NAME). This is a subtle distinction but one
     # that's important for nested modules.
 
-    $self->{PMLIBDIRS} = ['lib', $self->{BASEEXT}]
+    if ($Is_VMS) {
+      # avoid logical name collisions by adding directory syntax
+      $self->{PMLIBDIRS} = ['./lib', './' . $self->{BASEEXT}]
        unless $self->{PMLIBDIRS};
+    }
+    else {
+      $self->{PMLIBDIRS} = ['lib', $self->{BASEEXT}]
+       unless $self->{PMLIBDIRS};
+    }
 
     #only existing directories that aren't in $dir are allowed
 
@@ -1556,8 +1573,19 @@ sub init_main {
 
     if ($self->{PERL_SRC}){
        $self->{PERL_LIB}     ||= File::Spec->catdir("$self->{PERL_SRC}","lib");
-       $self->{PERL_ARCHLIB} = $self->{PERL_LIB};
-       $self->{PERL_INC}     = ($Is_Win32) ? File::Spec->catdir($self->{PERL_LIB},"CORE") : $self->{PERL_SRC};
+
+        if (defined $Cross::platform) {
+            $self->{PERL_ARCHLIB} = 
+              File::Spec->catdir("$self->{PERL_SRC}","xlib",$Cross::platform);
+            $self->{PERL_INC}     = 
+              File::Spec->catdir("$self->{PERL_SRC}","xlib",$Cross::platform, 
+                                 $Is_Win32?("CORE"):());
+        }
+        else {
+            $self->{PERL_ARCHLIB} = $self->{PERL_LIB};
+            $self->{PERL_INC}     = ($Is_Win32) ? 
+              File::Spec->catdir($self->{PERL_LIB},"CORE") : $self->{PERL_SRC};
+        }
 
        # catch a situation that has occurred a few times in the past:
        unless (
@@ -1593,7 +1621,6 @@ from the perl source tree.
        $self->{PERL_INC}     = File::Spec->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now
        my $perl_h;
 
-       no warnings 'uninitialized' ;
        if (not -f ($perl_h = File::Spec->catfile($self->{PERL_INC},"perl.h"))
            and not $old){
            # Maybe somebody tries to build an extension with an
@@ -1691,17 +1718,21 @@ usually solves this kind of problem.
     # 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"
+       $self->{VERSION} = $self->parse_version($self->{VERSION_FROM});
+        if( $self->{VERSION} eq 'undef' ) {
+           carp "WARNING: Setting VERSION via file ".
+                 "'$self->{VERSION_FROM}' failed\n";
+        }
     }
 
     # strip blanks
-    if ($self->{VERSION}) {
+    if (defined $self->{VERSION}) {
        $self->{VERSION} =~ s/^\s+//;
        $self->{VERSION} =~ s/\s+$//;
     }
-
-    $self->{VERSION} ||= "0.10";
+    else {
+        $self->{VERSION} = '';
+    }
     ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
 
     $self->{DISTVNAME} = "$self->{DISTNAME}-$self->{VERSION}";
@@ -1807,7 +1838,14 @@ sub init_INST {
     # you to build directly into, say $Config{privlibexp}.
     unless ($self->{INST_LIB}){
        if ($self->{PERL_CORE}) {
-           $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB};
+            if (defined $Cross::platform) {
+                $self->{INST_LIB} = $self->{INST_ARCHLIB} = 
+                  File::Spec->catdir($self->{PERL_LIB},"..","xlib",
+                                     $Cross::platform);
+            }
+            else {
+                $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB};
+            }
        } else {
            $self->{INST_LIB} = File::Spec->catdir($Curdir,"blib","lib");
        }
@@ -1842,47 +1880,43 @@ INSTALLDIRS) and PREFIX.
 sub init_INSTALL {
     my($self) = shift;
 
-    # The user who requests an installation directory explicitly
-    # should not have to tell us an architecture installation directory
-    # as well. We look if a directory exists that is named after the
-    # architecture. If not we take it as a sign that it should be the
-    # same as the requested installation directory. Otherwise we take
-    # the found one.
-    # We do the same thing twice: for privlib/archlib and for sitelib/sitearch
-    for my $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;
+    $self->init_lib2arch;
 
-            $self->prefixify($Arch,$ilib,$self->{$Lib});
+    if( $Config{usevendorprefix} ) {
+        $Config_Override{installvendorman1dir} =
+          File::Spec->catdir($Config{vendorprefixexp}, 'man', 'man$(MAN1EXT)');
+        $Config_Override{installvendorman3dir} =
+          File::Spec->catdir($Config{vendorprefixexp}, 'man', 'man$(MAN3EXT)');
+    }
+    else {
+        $Config_Override{installvendorman1dir} = '';
+        $Config_Override{installvendorman3dir} = '';
+    }
 
-            unless (-d $self->{$Arch}) {
-                print STDOUT "Directory $self->{$Arch} not found\n" 
-                  if $Verbose;
-                $self->{$Arch} = $self->{$Lib};
-            }
-            print STDOUT "Defaulting $Arch to $self->{$Arch}\n" if $Verbose;
-        }
+    my $iprefix = $Config{installprefixexp} || $Config{installprefix} || 
+                  $Config{prefixexp}        || $Config{prefix} || '';
+    my $vprefix = $Config{usevendorprefix}  ? $Config{vendorprefixexp} : '';
+    my $sprefix = $Config{siteprefixexp}    || '';
+
+    # 5.005_03 doesn't have a siteprefix.
+    $sprefix = $iprefix unless $sprefix;
+
+    # There are often no Config.pm defaults for these, but we can make
+    # it up.
+    unless( $Config{installsiteman1dir} ) {
+        $Config_Override{installsiteman1dir} = 
+          File::Spec->catdir($sprefix, 'man', 'man$(MAN1EXT)');
     }
 
-    # There are no Config.pm defaults for these.
-    $Config_Override{installsiteman1dir} = 
-        "$Config{siteprefixexp}/man/man\$(MAN1EXT)";
-    $Config_Override{installsiteman3dir} = 
-        "$Config{siteprefixexp}/man/man\$(MAN3EXT)";
-    $Config_Override{installvendorman1dir} =
-        "$Config{vendorprefixexp}/man/man\$(MAN1EXT)";
-    $Config_Override{installvendorman3dir} =
-        "$Config{vendorprefixexp}/man/man\$(MAN3EXT)";
+    unless( $Config{installsiteman3dir} ) {
+        $Config_Override{installsiteman3dir} = 
+          File::Spec->catdir($sprefix, 'man', 'man$(MAN3EXT)');
+    }
 
-    my $iprefix = $Config{installprefixexp} || '';
-    my $vprefix = $Config{vendorprefixexp}  || $iprefix;
-    my $sprefix = $Config{siteprefixexp}    || '';
+    unless( $Config{installsitebin} ) {
+        $Config_Override{installsitebin} =
+          File::Spec->catdir($sprefix, 'bin');
+    }
 
     my $u_prefix  = $self->{PREFIX}       || '';
     my $u_sprefix = $self->{SITEPREFIX}   || $u_prefix;
@@ -1904,47 +1938,54 @@ sub init_INSTALL {
         $manstyle = $self->{LIBSTYLE} eq 'lib/perl5' ? 'lib/perl5' : '';
     }
 
+    # Some systems, like VOS, set installman*dir to '' if they can't
+    # read man pages.
+    for my $num (1, 3) {
+        $self->{'INSTALLMAN'.$num.'DIR'} ||= 'none'
+          unless $Config{'installman'.$num.'dir'};
+    }
+
     my %bin_layouts = 
     (
         bin         => { s => $iprefix,
-                         r => '$(PREFIX)',
+                         r => $u_prefix,
                          d => 'bin' },
         vendorbin   => { s => $vprefix,
-                         r => '$(VENDORPREFIX)',
+                         r => $u_vprefix,
                          d => 'bin' },
         sitebin     => { s => $sprefix,
-                         r => '$(SITEPREFIX)',
+                         r => $u_sprefix,
                          d => 'bin' },
         script      => { s => $iprefix,
-                         r => '$(PREFIX)',
+                         r => $u_prefix,
                          d => 'bin' },
     );
     
     my %man_layouts =
     (
         man1dir         => { s => $iprefix,
-                             r => '$(PREFIX)',
+                             r => $u_prefix,
                              d => 'man/man$(MAN1EXT)',
                              style => $manstyle, },
         siteman1dir     => { s => $sprefix,
-                             r => '$(SITEPREFIX)',
+                             r => $u_sprefix,
                              d => 'man/man$(MAN1EXT)',
                              style => $manstyle, },
         vendorman1dir   => { s => $vprefix,
-                             r => '$(VENDORPREFIX)',
+                             r => $u_vprefix,
                              d => 'man/man$(MAN1EXT)',
                              style => $manstyle, },
 
         man3dir         => { s => $iprefix,
-                             r => '$(PREFIX)',
+                             r => $u_prefix,
                              d => 'man/man$(MAN3EXT)',
                              style => $manstyle, },
         siteman3dir     => { s => $sprefix,
-                             r => '$(SITEPREFIX)',
+                             r => $u_sprefix,
                              d => 'man/man$(MAN3EXT)',
                              style => $manstyle, },
         vendorman3dir   => { s => $vprefix,
-                             r => '$(VENDORPREFIX)',
+                             r => $u_vprefix,
                              d => 'man/man$(MAN3EXT)',
                              style => $manstyle, },
     );
@@ -1952,28 +1993,28 @@ sub init_INSTALL {
     my %lib_layouts =
     (
         privlib     => { s => $iprefix,
-                         r => '$(PREFIX)',
+                         r => $u_prefix,
                          d => '',
                          style => $libstyle, },
         vendorlib   => { s => $vprefix,
-                         r => '$(VENDORPREFIX)',
+                         r => $u_vprefix,
                          d => '',
                          style => $libstyle, },
         sitelib     => { s => $sprefix,
-                         r => '$(SITEPREFIX)',
+                         r => $u_sprefix,
                          d => 'site_perl',
                          style => $libstyle, },
         
         archlib     => { s => $iprefix,
-                         r => '$(PREFIX)',
+                         r => $u_prefix,
                          d => "$version/$arch",
                          style => $libstyle },
         vendorarch  => { s => $vprefix,
-                         r => '$(VENDORPREFIX)',
+                         r => $u_vprefix,
                          d => "$version/$arch",
                          style => $libstyle },
         sitearch    => { s => $sprefix,
-                         r => '$(SITEPREFIX)',
+                         r => $u_sprefix,
                          d => "site_perl/$version/$arch",
                          style => $libstyle },
     );
@@ -2018,11 +2059,51 @@ sub init_INSTALL {
           if $Verbose >= 2;
     }
 
-    $self->{PREFIX} ||= $iprefix;
-
     return 1;
 }
 
+=begin _protected
+
+=item init_lib2arch
+
+    $mm->init_lib2arch
+
+=end _protected
+
+=cut
+
+sub init_lib2arch {
+    my($self) = shift;
+
+    # The user who requests an installation directory explicitly
+    # should not have to tell us an architecture installation directory
+    # as well. We look if a directory exists that is named after the
+    # architecture. If not we take it as a sign that it should be the
+    # same as the requested installation directory. Otherwise we take
+    # the found one.
+    for my $libpair ({l=>"privlib",   a=>"archlib"}, 
+                     {l=>"sitelib",   a=>"sitearch"},
+                     {l=>"vendorlib", a=>"vendorarch"},
+                    )
+    {
+        my $lib = "install$libpair->{l}";
+        my $Lib = uc $lib;
+        my $Arch = uc "install$libpair->{a}";
+        if( $self->{$Lib} && ! $self->{$Arch} ){
+            my($ilib) = $Config{$lib};
+
+            $self->prefixify($Arch,$ilib,$self->{$Lib});
+
+            unless (-d $self->{$Arch}) {
+                print STDOUT "Directory $self->{$Arch} not found\n" 
+                  if $Verbose;
+                $self->{$Arch} = $self->{$Lib};
+            }
+            print STDOUT "Defaulting $Arch to $self->{$Arch}\n" if $Verbose;
+        }
+    }
+}
+
 
 =item init_PERL
 
@@ -2670,7 +2751,7 @@ q[-e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "],
  $self->{MAKEFILE}, q[";' \\
 -e 'print "Manifying $$m{$$_}\n";' \\
 -e 'system(q[$(PERLRUN) $(POD2MAN_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\
--e 'chmod(oct($(PERM_RW))), $$m{$$_} or warn "chmod $(PERM_RW) $$m{$$_}: $$!\n";}'
+-e 'chmod(oct($(PERM_RW)), $$m{$$_}) or warn "chmod $(PERM_RW) $$m{$$_}: $$!\n";}'
 ];
     push @m, "\nmanifypods : pure_all ";
     push @m, join " \\\n\t", keys %{$self->{MAN1PODS}}, keys %{$self->{MAN3PODS}};
@@ -2745,7 +2826,8 @@ sub needs_linking {
     my($self) = shift;
     my($child,$caller);
     $caller = (caller(0))[3];
-    Carp::confess("Needs_linking called too early") if $caller =~ /^ExtUtils::MakeMaker::/;
+    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;
@@ -2835,13 +2917,14 @@ sub parse_version {
                $_
            }; \$$2
        };
-       no warnings;
+        local $^W = 0;
        $result = eval($eval);
        warn "Could not eval '$eval' in $parsefile: $@" if $@;
-       $result = "undef" unless defined $result;
        last;
     }
     close FH;
+
+    $result = "undef" unless defined $result;
     return $result;
 }
 
@@ -3085,8 +3168,8 @@ sub ppd {
 
     if ($self->{ABSTRACT_FROM}){
         $self->{ABSTRACT} = $self->parse_abstract($self->{ABSTRACT_FROM}) or
-            Carp::carp "WARNING: Setting ABSTRACT via file ".
-                       "'$self->{ABSTRACT_FROM}' failed\n";
+            carp "WARNING: Setting ABSTRACT via file ".
+                 "'$self->{ABSTRACT_FROM}' failed\n";
     }
 
     my ($pack_ver) = join ",", (split (/\./, $self->{VERSION}), (0)x4)[0..3];
@@ -3175,15 +3258,12 @@ sub prefixify {
     my($self,$var,$sprefix,$rprefix,$default) = @_;
 
     my $path = $self->{uc $var} || 
-               $Config_Override{lc $var} || $Config{lc $var};
-
-    print STDERR "  prefixify $var=$path\n" if $Verbose >= 2;
-    print STDERR "    from $sprefix to $rprefix\n" 
-      if $Verbose >= 2;
+               $Config_Override{lc $var} || $Config{lc $var} || '';
 
-    $path = VMS::Filespec::unixpath($path) if $Is_VMS;
+    print STDERR "  prefixify $var => $path\n" if $Verbose >= 2;
+    print STDERR "    from $sprefix to $rprefix\n" if $Verbose >= 2;
 
-    unless( $path =~ s,^\Q$sprefix\E(?=/|\z),$rprefix,s ) {
+    unless( $path =~ s{^\Q$sprefix\E\b}{$rprefix}s ) {
 
         print STDERR "    cannot prefix, using default.\n" if $Verbose >= 2;
         print STDERR "    no default!\n" if !$default && $Verbose >= 2;
@@ -3506,7 +3586,7 @@ sub test {
     my($self, %attribs) = @_;
     my $tests = $attribs{TESTS} || '';
     if (!$tests && -d 't') {
-       $tests = $Is_Win32 ? join(' ', <t\\*.t>) : 't/*.t';
+        $tests = $self->find_tests;
     }
     # note: 'test.pl' name is also hardcoded in init_dirscan()
     my(@m);