Re: [PATCH] ExtUtils::MakeMaker 6.10_02
Michael G. Schwern [Mon, 7 Apr 2003 02:09:17 +0000 (19:09 -0700)]
Message-ID: <20030407090917.GA9221@windhund.schwern.org>

p4raw-id: //depot/perl@19162

30 files changed:
MANIFEST
lib/ExtUtils/Command.pm
lib/ExtUtils/Command/MM.pm
lib/ExtUtils/Install.pm
lib/ExtUtils/Installed.pm
lib/ExtUtils/Liblist.pm
lib/ExtUtils/Liblist/Kid.pm
lib/ExtUtils/MM_Any.pm
lib/ExtUtils/MM_BeOS.pm
lib/ExtUtils/MM_Cygwin.pm
lib/ExtUtils/MM_DOS.pm
lib/ExtUtils/MM_MacOS.pm
lib/ExtUtils/MM_NW5.pm
lib/ExtUtils/MM_OS2.pm
lib/ExtUtils/MM_UWIN.pm
lib/ExtUtils/MM_Unix.pm
lib/ExtUtils/MM_VMS.pm
lib/ExtUtils/MM_Win32.pm
lib/ExtUtils/MM_Win95.pm
lib/ExtUtils/MakeMaker.pm
lib/ExtUtils/MakeMaker/FAQ.pod
lib/ExtUtils/Manifest.pm
lib/ExtUtils/PATCHING
lib/ExtUtils/README
lib/ExtUtils/TODO
lib/ExtUtils/t/00compile.t
lib/ExtUtils/t/MM_Any.t [new file with mode: 0644]
lib/ExtUtils/t/MM_Cygwin.t
lib/ExtUtils/t/basic.t
t/lib/MakeMaker/Test/Utils.pm

index 3a27040..1a93b93 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -1114,6 +1114,7 @@ lib/ExtUtils/t/INST_PREFIX.t      See if MakeMaker can apply PREFIXs
 lib/ExtUtils/t/Liblist.t       See if ExtUtils::Liblist works
 lib/ExtUtils/t/Manifest.t      See if ExtUtils::Manifest works
 lib/ExtUtils/t/Mkbootstrap.t   See if ExtUtils::Mkbootstrap works
+lib/ExtUtils/t/MM_Any.t                See if ExtUtils::MM_Any works
 lib/ExtUtils/t/MM_BeOS.t       See if ExtUtils::MM_BeOS works
 lib/ExtUtils/t/MM_Cygwin.t     See if ExtUtils::MM_Cygwin works
 lib/ExtUtils/t/MM_NW5.t                See if ExtUtils::MM_NW5 works
index b06430d..12e2b99 100644 (file)
@@ -11,7 +11,7 @@ require Exporter;
 use vars qw(@ISA @EXPORT $VERSION);
 @ISA     = qw(Exporter);
 @EXPORT  = qw(cp rm_f rm_rf mv cat eqtime mkpath touch test_f);
-$VERSION = '1.04';
+$VERSION = '1.05';
 
 my $Is_VMS = $^O eq 'VMS';
 
index 4aa3738..a597cc4 100644 (file)
@@ -9,7 +9,7 @@ use vars qw($VERSION @ISA @EXPORT);
 
 @EXPORT  = qw(test_harness pod2man perllocal_install uninstall 
               warn_if_old_packlist);
-$VERSION = '0.02';
+$VERSION = '0.03';
 
 my $Is_VMS = $^O eq 'VMS';
 
index 757679a..5763f1b 100644 (file)
@@ -2,7 +2,7 @@ package ExtUtils::Install;
 
 use 5.00503;
 use vars qw(@ISA @EXPORT $VERSION);
-$VERSION = 1.31;
+$VERSION = 1.32;
 
 use Exporter;
 use Carp ();
@@ -425,7 +425,10 @@ sub pm_to_blib {
 
     mkpath($autodir,0,0755);
     while(my($from, $to) = each %$fromto) {
-       next if -f $to && -M $to < -M $from;
+       if( -f $to && -s $from == -s $to && -M $to < -M $from ) {
+            print "Skip $to (unchanged)\n";
+            next;
+        }
 
        # When a pm_filter is defined, we need to pre-process the source first
        # to determine whether it has changed or not.  Therefore, only perform
index 1375a82..72bbb53 100644 (file)
@@ -9,18 +9,20 @@ use Config;
 use File::Find;
 use File::Basename;
 use File::Spec;
-require VMS::Filespec if $^O eq 'VMS';
-
-use vars qw($VERSION);
-$VERSION = '0.06';
 
+my $Is_VMS = $^O eq 'VMS';
 my $DOSISH = ($^O =~ /^(MSWin\d\d|os2|dos|mint)$/);
 
+require VMS::Filespec if $Is_VMS;
+
+use vars qw($VERSION);
+$VERSION = '0.07';
+
 sub _is_prefix {
     my ($self, $path, $prefix) = @_;
     return unless defined $prefix && defined $path;
 
-    if( $^O eq 'VMS' ) {
+    if( $Is_VMS ) {
         $prefix = VMS::Filespec::unixify($prefix);
         $path   = VMS::Filespec::unixify($path);
     }
@@ -78,7 +80,7 @@ sub new {
     my $sitearch = $Config{sitearchexp};
 
     # File::Find does not know how to deal with VMS filepaths.
-    if( $^O eq 'VMS' ) {
+    if( $Is_VMS ) {
         $archlib  = VMS::Filespec::unixify($archlib);
         $sitearch = VMS::Filespec::unixify($sitearch);
     }
@@ -96,7 +98,7 @@ sub new {
     # Read the module packlists
     my $sub = sub {
         # Only process module .packlists
-        return if ($_) ne ".packlist" || $File::Find::dir eq $archlib;
+        return if $_ ne ".packlist" || $File::Find::dir eq $archlib;
 
         # Hack of the leading bits of the paths & convert to a module name
         my $module = $File::Find::name;
@@ -110,7 +112,9 @@ sub new {
         $self->{$module}{version} = '';
         foreach my $dir (@INC) {
             my $p = File::Spec->catfile($dir, $modfile);
-            if (-f $p) {
+            if (-r $p) {
+                $module = _module_name($p, $module) if $Is_VMS;
+
                 require ExtUtils::MM;
                 $self->{$module}{version} = MM->parse_version($p);
                 last;
@@ -128,6 +132,36 @@ sub new {
     return(bless($self, $class));
 }
 
+# VMS's non-case preserving file-system means the package name can't
+# be reconstructed from the filename.
+sub _module_name {
+    my($file, $orig_module) = @_;
+
+    my $module = '';
+    if (open PACKFH, $file) {
+        while (<PACKFH>) {
+            if (/package\s+(\S+)\s*;/) {
+                my $pack = $1;
+                # Make a sanity check, that lower case $module
+                # is identical to lowercase $pack before
+                # accepting it
+                if (lc($pack) eq lc($orig_module)) {
+                    $module = $pack;
+                    last;
+                }
+            }
+        }
+        close PACKFH;
+    }
+
+    print STDERR "Couldn't figure out the package name for $file\n"
+      unless $module;
+
+    return $module;
+}
+
+
+
 sub modules {
     my ($self) = @_;
 
index 8604f82..4b09808 100644 (file)
@@ -1,7 +1,7 @@
 package ExtUtils::Liblist;
 
 use vars qw($VERSION);
-$VERSION = '1.00';
+$VERSION = '1.01';
 
 use File::Spec;
 require ExtUtils::Liblist::Kid;
index d17eb87..9030eda 100644 (file)
@@ -9,7 +9,7 @@ use 5.00503;
 # Broken out of MakeMaker from version 4.11
 
 use vars qw($VERSION);
-$VERSION = 1.29;
+$VERSION = 1.30;
 
 use Config;
 use Cwd 'cwd';
index 20c6bd6..c0ffb2f 100644 (file)
@@ -2,7 +2,7 @@ package ExtUtils::MM_Any;
 
 use strict;
 use vars qw($VERSION @ISA);
-$VERSION = 0.04;
+$VERSION = 0.05;
 @ISA = qw(File::Spec);
 
 use Config;
@@ -42,6 +42,34 @@ B<THIS MAY BE TEMPORARY!>
 These are methods which are by their nature cross-platform and should
 always be cross-platform.
 
+=over 4
+
+=item os_flavor_is
+
+    $mm->os_flavor_is($this_flavor);
+    $mm->os_flavor_is(@one_of_these_flavors);
+
+Checks to see if the current operating system is one of the given flavors.
+
+This is useful for code like:
+
+    if( $mm->os_flavor_is('Unix') ) {
+        $out = `foo 2>&1`;
+    }
+    else {
+        $out = `foo`;
+    }
+
+=cut
+
+sub os_flavor_is {
+    my $self = shift;
+    my %flavors = map { ($_ => 1) } $self->os_flavor;
+    return (grep { $flavors{$_} } @_) ? 1 : 0;
+}
+
+=back
+
 =head2 File::Spec wrappers
 
 ExtUtils::MM_Any is a subclass of File::Spec.  The methods noted here
@@ -213,7 +241,7 @@ Called by init_main.
 sub init_VERSION {
     my($self) = shift;
 
-    $self->{MAKEMAKER}  = $INC{'ExtUtils/MakeMaker.pm'};
+    $self->{MAKEMAKER}  = $ExtUtils::MakeMaker::Filename;
     $self->{MM_VERSION} = $ExtUtils::MakeMaker::VERSION;
     $self->{MM_REVISION}= $ExtUtils::MakeMaker::Revision;
     $self->{VERSION_FROM} ||= '';
@@ -333,6 +361,7 @@ END
 CMD
     }
 
+    $manify .= "\t\$(NOECHO) \$(NOOP)\n" unless @man_cmds;
     $manify .= join '', map { "$_\n" } @man_cmds;
 
     return $manify;
@@ -665,8 +694,8 @@ Defines at least these macros.
 
   Macro             Description
 
-  NOOP              
-  NOECHO                                        
+  NOOP              Do nothing
+  NOECHO            Tell make not to display the command itself
 
   MAKEFILE
   FIRST_MAKEFILE
@@ -676,6 +705,7 @@ Defines at least these macros.
   SHELL             Program used to run
                     shell commands
 
+  ECHO              Print text adding a newline on the end
   RM_F              Remove a file 
   RM_RF             Remove a directory          
   TOUCH             Update a file's timestamp   
@@ -755,6 +785,29 @@ sub platform_constants {
     return '';
 }
 
+=item os_flavor
+
+    my @os_flavor = $mm->os_flavor;
+
+@os_flavor is the style of operating system this is, usually
+corresponding to the MM_*.pm file we're using.  
+
+The first element of @os_flavor is the major family (ie. Unix,
+Windows, VMS, OS/2, MacOS, etc...) and the rest are sub families.
+
+Some examples:
+
+    Cygwin98       ('Unix',  'Cygwin', 'Cygwin9x')
+    Windows NT     ('Win32', 'WinNT')
+    Win98          ('Win32', 'Win9x')
+    Linux          ('Unix',  'Linux')
+    MacOS Classic  ('MacOS', 'MacOS Classic')
+    MacOS X        ('Unix',  'Darwin', 'MacOS', 'MacOS X')
+    OS/2           ('OS/2')
+
+This is used to write code for styles of operating system.  
+See os_flavor_is() for use.
+
 
 =back
 
index 4f4a3e5..e0b3390 100644 (file)
@@ -25,9 +25,19 @@ require ExtUtils::MM_Unix;
 
 use vars qw(@ISA $VERSION);
 @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
-$VERSION = 1.03;
+$VERSION = 1.04;
 
 
+=item os_flavor (o)
+
+BeOS is BeOS.
+
+=cut
+
+sub os_flavor {
+    return('BeOS');
+}
+
 =item init_linker
 
 libperl.a equivalent to be linked to dynamic extensions.
index 120e1bb..4529895 100644 (file)
@@ -10,7 +10,7 @@ require ExtUtils::MM_Any;
 require ExtUtils::MM_Unix;
 @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
 
-$VERSION = 1.05;
+$VERSION = 1.06;
 
 
 =head1 NAME
@@ -27,6 +27,16 @@ See ExtUtils::MM_Unix for a documentation of the methods provided there.
 
 =over 4
 
+=item os_flavor (o)
+
+We're Unix and Cygwin.
+
+=cut
+
+sub os_flavor {
+    return('Unix', 'Cygwin');
+}
+
 =item cflags (o)
 
 if configured for dynamic loading, triggers #define EXT in EXTERN.h
index 93e01f2..b985d00 100644 (file)
@@ -3,7 +3,7 @@ package ExtUtils::MM_DOS;
 use strict;
 use vars qw($VERSION @ISA);
 
-$VERSION = 0.01;
+$VERSION = 0.02;
 
 require ExtUtils::MM_Any;
 require ExtUtils::MM_Unix;
@@ -30,6 +30,14 @@ Unless otherwise stated, it works just like ExtUtils::MM_Unix
 
 =over 4
 
+=item os_flavor
+
+=cut
+
+sub os_flavor {
+    return('DOS');
+}
+
 =item B<replace_manpage_separator>
 
 Generates Foo__Bar.3 style man page names
index a83e37f..4c43d24 100644 (file)
@@ -12,7 +12,7 @@ require ExtUtils::MM_Unix;
 @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
 
 use vars qw($VERSION);
-$VERSION = '1.04';
+$VERSION = '1.05';
 
 use Config;
 use Cwd 'cwd';
@@ -932,6 +932,16 @@ sub _include {  # for Unix-style includes, with -I instead of -i
        }
 }
 
+=item os_flavor
+
+MacOS Classic is MacOS and MacOS Classic.
+
+=cut
+
+sub os_flavor {
+    return('MacOS', 'MacOS Classic');
+}
+
 =back
 
 =cut
index 40c4823..82c2d66 100644 (file)
@@ -23,7 +23,7 @@ use Config;
 use File::Basename;
 
 use vars qw(@ISA $VERSION);
-$VERSION = '2.05';
+$VERSION = '2.06';
 
 require ExtUtils::MM_Win32;
 @ISA = qw(ExtUtils::MM_Win32);
@@ -37,6 +37,17 @@ my $GCC      = 1 if $Config{'cc'} =~ /^gcc/i;
 my $DMAKE    = 1 if $Config{'make'} =~ /^dmake/i;
 
 
+=item os_flavor
+
+We're Netware in addition to being Windows.
+
+=cut
+
+sub os_flavor {
+    my $self = shift;
+    return ($self->SUPER::os_flavor, 'Netware');
+}
+
 =item init_platform (o)
 
 Add Netware macros.
index 47ecba8..656daa5 100644 (file)
@@ -6,7 +6,7 @@ use vars qw($VERSION @ISA);
 use ExtUtils::MakeMaker qw(neatvalue);
 use File::Spec;
 
-$VERSION = '1.03';
+$VERSION = '1.04';
 
 require ExtUtils::MM_Any;
 require ExtUtils::MM_Unix;
@@ -42,7 +42,7 @@ sub init_dist {
     my($self) = @_;
 
     $self->{TO_UNIX} ||= <<'MAKE_TEXT';
-$(NOECHO) $(TEST_F) tmp.zip && $(RM) tmp.zip; $(ZIP) -ll -mr tmp.zip $(DISTVNAME) && unzip -o tmp.zip && $(RM) tmp.zip
+$(NOECHO) $(TEST_F) tmp.zip && $(RM_F) tmp.zip; $(ZIP) -ll -mr tmp.zip $(DISTVNAME) && unzip -o tmp.zip && $(RM_F) tmp.zip
 MAKE_TEXT
 
     $self->SUPER::init_dist;
@@ -136,6 +136,16 @@ sub init_linker {
     $self->{EXPORT_LIST} = '$(BASEEXT).def';
 }
 
+=item os_flavor
+
+OS/2 is OS/2
+
+=cut
+
+sub os_flavor {
+    return('OS/2');
+}
+
 =back
 
 =cut
index 2bfddcf..1667d55 100644 (file)
@@ -2,7 +2,7 @@ package ExtUtils::MM_UWIN;
 
 use strict;
 use vars qw($VERSION @ISA);
-$VERSION = 0.01;
+$VERSION = 0.02;
 
 require ExtUtils::MM_Unix;
 @ISA = qw(ExtUtils::MM_Unix);
@@ -28,6 +28,17 @@ Unless otherwise stated it works just like ExtUtils::MM_Unix
 
 =over 4
 
+=item os_flavor
+
+In addition to being Unix, we're U/WIN.
+
+=cut
+
+sub os_flavor {
+    return('Unix', 'U/WIN');
+}
+
+
 =item B<replace_manpage_separator>
 
 =cut
index 87d93bf..6799836 100644 (file)
@@ -20,7 +20,7 @@ use vars qw($VERSION @ISA
 
 use ExtUtils::MakeMaker qw($Verbose neatvalue);
 
-$VERSION = '1.35';
+$VERSION = '1.36';
 
 require ExtUtils::MM_Any;
 @ISA = qw(ExtUtils::MM_Any);
@@ -97,6 +97,17 @@ my $Updir   = __PACKAGE__->updir;
 
 =over 4
 
+=item os_flavor (o)
+
+Simply says that we're Unix.
+
+=cut
+
+sub os_flavor {
+    return('Unix');
+}
+
+
 =item c_o (o)
 
 Defines the suffix rules to compile different flavors of C files to
@@ -1059,12 +1070,14 @@ sub dynamic_lib {
     $armaybe = 'ar' if ($Is_OSF and $armaybe eq ':');
     my(@m);
     my $ld_opt = $Is_OS2 ? '$(OPTIMIZE) ' : '';        # Useful on other systems too?
+    my $ld_fix = $Is_OS2 ? '|| ( $(RM_F) $@ && sh -c false )' : '';
     push(@m,'
 # This section creates the dynamically loadable $(INST_DYNAMIC)
 # from $(OBJECT) and possibly $(MYEXTLIB).
 ARMAYBE = '.$armaybe.'
 OTHERLDFLAGS = '.$ld_opt.$otherldflags.'
 INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
+INST_DYNAMIC_FIX = '.$ld_fix.'
 
 $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)$(DIRFILESEP).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(PERL_ARCHIVE_AFTER) $(INST_DYNAMIC_DEP)
 ');
@@ -1105,7 +1118,7 @@ $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)$(DIRFILE
 
     push(@m,
 '      LD_RUN_PATH="$(LD_RUN_PATH)" $(LD) '.$ldrun.' $(LDDLFLAGS) '.$ldfrom.
-' $(OTHERLDFLAGS) -o $@ $(MYEXTLIB) $(PERL_ARCHIVE) '.$libs.' $(PERL_ARCHIVE_AFTER) $(EXPORT_LIST)');
+' $(OTHERLDFLAGS) -o $@ $(MYEXTLIB) $(PERL_ARCHIVE) '.$libs.' $(PERL_ARCHIVE_AFTER) $(EXPORT_LIST) $(INST_DYNAMIC_FIX)');
     push @m, '
        $(CHMOD) $(PERM_RWX) $@
 ';
@@ -1237,6 +1250,9 @@ sub fixin { # stolen from the pink Camel book, more or less
 
     my($does_shbang) = $Config{'sharpbang'} =~ /^\s*\#\!/;
     for my $file (@files) {
+        my $file_new = "$file.new";
+        my $file_bak = "$file.bak";
+
        local(*FIXIN);
        local(*FIXOUT);
        open(FIXIN, $file) or croak "Can't process '$file': $!";
@@ -1288,7 +1304,7 @@ eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}'
            next;
        }
 
-       unless ( open(FIXOUT,">$file.new") ) {
+       unless ( open(FIXOUT,">$file_new") ) {
            warn "Can't create new $file: $!\n";
            next;
        }
@@ -1301,19 +1317,21 @@ eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}'
        close FIXIN;
        close FIXOUT;
 
-       unless ( rename($file, "$file.bak") ) { 
-           warn "Can't rename $file to $file.bak: $!";
+        chmod 0666, $file_bak;
+        unlink $file_bak;
+       unless ( rename($file, $file_bak) ) {   
+           warn "Can't rename $file to $file_bak: $!";
            next;
        }
-       unless ( rename("$file.new", $file) ) { 
-           warn "Can't rename $file.new to $file: $!";
-           unless ( rename("$file.bak", $file) ) {
-               warn "Can't rename $file.bak back to $file either: $!";
-               warn "Leaving $file renamed as $file.bak\n";
+       unless ( rename($file_new, $file) ) {   
+           warn "Can't rename $file_new to $file: $!";
+           unless ( rename($file_bak, $file) ) {
+               warn "Can't rename $file_bak back to $file either: $!";
+               warn "Leaving $file renamed as $file_bak\n";
            }
            next;
        }
-       unlink "$file.bak";
+       unlink $file_bak;
     } continue {
        close(FIXIN) if fileno(FIXIN);
        system("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';;
@@ -2901,7 +2919,7 @@ $(OBJECT) : $(FIRST_MAKEFILE)
     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.
-$(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP) $(VERSION_FROM)
+$(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP)
        $(NOECHO) $(ECHO) "Makefile out-of-date with respect to $?"
        $(NOECHO) $(ECHO) "Cleaning current config before rebuilding Makefile..."
        $(NOECHO) $(RM_F) $(MAKEFILE_OLD)
@@ -3892,7 +3910,8 @@ sub tool_xsubpp {
         }
     }
 
-    my(@tmdeps) = $self->catdir('$(XSUBPPDIR)','typemap');
+    my $tmdir   = File::Spec->catdir($self->{PERL_LIB},"ExtUtils");
+    my(@tmdeps) = $self->catfile($tmdir,'typemap');
     if( $self->{TYPEMAPS} ){
        my $typemap;
        foreach $typemap (@{$self->{TYPEMAPS}}){
@@ -3927,11 +3946,9 @@ sub tool_xsubpp {
        }
     }
 
-    my $xsubpp = "xsubpp";
-
     return qq{
 XSUBPPDIR = $xsdir
-XSUBPP = \$(XSUBPPDIR)/$xsubpp
+XSUBPP = \$(XSUBPPDIR)/xsubpp
 XSPROTOARG = $self->{XSPROTOARG}
 XSUBPPDEPS = @tmdeps \$(XSUBPP)
 XSUBPPARGS = @tmargs
index 422f864..39e2c65 100644 (file)
@@ -20,8 +20,8 @@ BEGIN {
 
 use File::Basename;
 use vars qw($Revision @ISA $VERSION);
-($VERSION) = '5.66';
-($Revision = substr(q$Revision: 1.82 $, 10)) =~ s/\s+$//;
+($VERSION) = '5.67';
+($Revision = substr(q$Revision: 1.89 $, 10)) =~ s/\s+$//;
 
 require ExtUtils::MM_Any;
 require ExtUtils::MM_Unix;
@@ -707,11 +707,17 @@ Use VMS-style quoting on xsubpp command line.
 sub tool_xsubpp {
     my($self) = @_;
     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'));
-    my(@tmdeps) = '$(XSUBPPDIR)typemap';
+
+    my $xsdir;
+    foreach my $dir (@INC) {
+        $xsdir = $self->catdir($dir, 'ExtUtils');
+        if( -r $self->catfile($xsdir, "xsubpp") ) {
+            last;
+        }
+    }
+
+    my $tmdir   = File::Spec->catdir($self->{PERL_LIB},"ExtUtils");
+    my(@tmdeps) = $self->catfile($tmdir,'typemap');
     if( $self->{TYPEMAPS} ){
        my $typemap;
        foreach $typemap (@{$self->{TYPEMAPS}}){
@@ -840,7 +846,7 @@ sub tools_other {
     # than just typing the literal string.
     my $extra_tools = <<'EXTRA_TOOLS';
 
-# Assumes \$(MMS) invokes MMS or MMK
+# Assumes $(MMS) invokes MMS or MMK
 # (It is assumed in some cases later that the default makefile name
 # (Descrip.MMS for MM[SK]) is used.)
 USEMAKEFILE = /Descrip=
@@ -848,7 +854,7 @@ USEMACROS = /Macro=(
 MACROEND = )
 
 # Just in case anyone is using the old macro.
-SAY = $ECHO
+SAY = $(ECHO)
 
 EXTRA_TOOLS
 
@@ -2161,8 +2167,8 @@ sub oneliner {
 
 =item B<echo> (o)
 
-perl trips up on "<foo>" thinking its an input redirect.  So we use the
-native Write sys$output instead.
+perl trips up on "<foo>" thinking it's an input redirect.  So we use the
+native Write command instead.  Besides, its faster.
 
 =cut
 
@@ -2170,12 +2176,12 @@ sub echo {
     my($self, $text, $file, $appending) = @_;
     $appending ||= 0;
 
-    die "The VMS version of echo() cannot currently append" if $appending;
+    my $opencmd = $appending ? 'Open/Append' : 'Open/Write';
 
-    my @cmds = ("\$(NOECHO) Assign $file Sys\$Output");
-    push @cmds, map { '$(NOECHO) Write Sys$Output '.$self->quote_literal($_) } 
+    my @cmds = ("\$(NOECHO) $opencmd MMECHOFILE $file ");
+    push @cmds, map { '$(NOECHO) Write MMECHOFILE '.$self->quote_literal($_) } 
                 split /\n/, $text;
-    push @cmds, '$(NOECHO) Deassign Sys$Output';
+    push @cmds, '$(NOECHO) Close MMECHOFILE';
     return @cmds;
 }
 
@@ -2226,7 +2232,7 @@ sub init_linker {
     $self->{EXPORT_LIST} ||= '$(BASEEXT).opt';
 
     my $shr = $Config{dbgprefix} . 'PERLSHR';
-    $self->{PERL_ARCHIVE} ||= $self->catfile($self->{PERL_SRC},"$shr.$Config{'dlext'}");
+    $self->{PERL_ARCHIVE} ||=  $self->catfile($self->{PERL_SRC}, "$shr.$Config{'dlext'}");
 
     $self->{PERL_ARCHIVE_AFTER} ||= '';
 }
@@ -2237,7 +2243,7 @@ Expands MM[KS]/Make macros in a text string, using the contents of
 identically named elements of C<%$self>, and returns the result
 as a file specification in Unix syntax.
 
-NOTE:  This is the cannonical version of the method.  The version in
+NOTE:  This is the canonical version of the method.  The version in
 File::Spec::VMS is deprecated.
 
 =cut
@@ -2295,7 +2301,7 @@ is a VMS-syntax file specification, and if it is not specified, fixpath()
 checks to see whether it matches the name of a directory in the current
 default directory, and returns a directory or file specification accordingly.
 
-NOTE:  This is the cannonical version of the method.  The version in
+NOTE:  This is the canonical version of the method.  The version in
 File::Spec::VMS is deprecated.
 
 =cut
@@ -2348,6 +2354,16 @@ sub fixpath {
 }
 
 
+=item os_flavor
+
+VMS is VMS.
+
+=cut
+
+sub os_flavor {
+    return('VMS');
+}
+
 =back
 
 =cut
index da1440f..fef8767 100644 (file)
@@ -29,7 +29,7 @@ use vars qw(@ISA $VERSION $BORLAND $GCC $DMAKE $NMAKE);
 require ExtUtils::MM_Any;
 require ExtUtils::MM_Unix;
 @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
-$VERSION = '1.06';
+$VERSION = '1.07';
 
 $ENV{EMXSHELL} = 'sh'; # to run `commands`
 
@@ -144,8 +144,10 @@ Using \ for Windows.
 sub init_DIRFILESEP {
     my($self) = shift;
 
-    # gotta be careful this isn't interpreted as an escape.
-    $self->{DIRFILESEP} = '^\\';
+    # The ^ makes sure its not interpreted as an escape in nmake
+    $self->{DIRFILESEP} = $NMAKE ? '^\\' :
+                          $DMAKE ? '\\\\'
+                                 : '\\';
 }
 
 =item B<init_others>
@@ -166,7 +168,8 @@ sub init_others {
     my ($self) = @_;
 
     # Used in favor of echo because echo won't strip quotes. :(
-    $self->{ECHO}     ||= '$(PERLRUN) -le "print qq{@ARGV}"';
+    $self->{ECHO}     ||= $self->oneliner('print qq{@ARGV}', ['-l']);
+
     $self->{TOUCH}    ||= '$(PERLRUN) -MExtUtils::Command -e touch';
     $self->{CHMOD}    ||= '$(PERLRUN) -MExtUtils::Command -e chmod'; 
     $self->{CP}       ||= '$(PERLRUN) -MExtUtils::Command -e cp';
@@ -183,6 +186,9 @@ sub init_others {
 
     $self->SUPER::init_others;
 
+    # Setting SHELL from $Config{sh} can break dmake.  Its ok without it.
+    delete $self->{SHELL};
+
     $self->{LDLOADLIBS} ||= $Config{libs};
     # -Lfoo must come first for Borland, so we put it in LDDLFLAGS
     if ($BORLAND) {
@@ -458,6 +464,15 @@ sub quote_literal {
     # Win98's command.com
     $text =~ s{"}{\\"}g;
 
+    # dmake eats '{' inside double quotes and leaves alone { outside double
+    # quotes; however it transforms {{ into { either inside and outside double
+    # quotes.  It also translates }} into }.  The escaping below is not
+    # 100% correct.
+    if( $DMAKE ) {
+        $text =~ s/{/{{/g;
+        $text =~ s/}}/}}}/g;
+    }
+
     return qq{"$text"};
 }
 
@@ -485,6 +500,17 @@ sub max_exec_len {
 }
 
 
+=item os_flavor
+
+Windows is Win32.
+
+=cut
+
+sub os_flavor {
+    return('Win32');
+}
+
+
 1;
 __END__
 
index 1854d5d..47aef7f 100644 (file)
@@ -1,7 +1,7 @@
 package ExtUtils::MM_Win95;
 
 use vars qw($VERSION @ISA);
-$VERSION = 0.02;
+$VERSION = 0.03;
 
 require ExtUtils::MM_Win32;
 @ISA = qw(ExtUtils::MM_Win32);
@@ -204,6 +204,19 @@ sub max_exec_len {
     return $self->{_MAX_EXEC_LEN} ||= 2500;
 }
 
+
+=item os_flavor
+
+Win95 and Win98 and WinME are collectively Win9x and Win32
+
+=cut
+
+sub os_flavor {
+    my $self = shift;
+    return ($self->SUPER::os_flavor, 'Win9x');
+}
+
+
 =back
 
 
index 87a388a..67fb3e7 100644 (file)
@@ -2,21 +2,20 @@ package ExtUtils::MakeMaker;
 
 BEGIN {require 5.005_03;}
 
-$VERSION = "6.03";
-$Version_OK = "5.49";   # Makefiles older than $Version_OK will die
-                        # (Will be checked from MakeMaker version 4.13 onwards)
-($Revision = substr(q$Revision: 1.63 $, 10)) =~ s/\s+$//;
+$VERSION = '6.10_02';
+($Revision = substr(q$Revision: 1.108 $, 10)) =~ s/\s+$//;
 
 require Exporter;
 use Config;
 use Carp ();
+use File::Path;
 
 use vars qw(
             @ISA @EXPORT @EXPORT_OK
-            $ISA_TTY $Revision $VERSION $Verbose $Version_OK %Config 
-            %Keep_after_flush %MM_Sections @Prepend_parent
+            $Revision $VERSION $Verbose %Config 
+            @Prepend_parent @Parent
             %Recognized_Att_Keys @Get_from_Config @MM_Sections @Overridable 
-            @Parent $PACKNAME
+            $Filename
            );
 use strict;
 
@@ -29,6 +28,10 @@ use strict;
 my $Is_VMS     = $^O eq 'VMS';
 my $Is_Win32   = $^O eq 'MSWin32';
 
+# Our filename for diagnostic and debugging purposes.  More reliable
+# than %INC (think caseless filesystems)
+$Filename = __FILE__;
+
 full_setup();
 
 require ExtUtils::MM;  # Things like CPAN assume loading ExtUtils::MakeMaker
@@ -604,12 +607,12 @@ sub WriteEmptyMakefile {
     my %att = @_;
     my $self = MM->new(\%att);
     if (-f $self->{MAKEFILE_OLD}) {
-      chmod 0666, $self->{MAKEFILE_OLD};
-      unlink $self->{MAKEFILE_OLD} or warn "unlink $self->{MAKEFILE_OLD}: $!";
+      _unlink($self->{MAKEFILE_OLD}) or 
+        warn "unlink $self->{MAKEFILE_OLD}: $!";
     }
     if ( -f $self->{MAKEFILE} ) {
-        _rename($self->{MAKEFILE}, $self->{MAKEFILE_OLD})
-          or warn "rename $self->{MAKEFILE} => $self->{MAKEFILE_OLD}: $!"
+        _rename($self->{MAKEFILE}, $self->{MAKEFILE_OLD}) or
+          warn "rename $self->{MAKEFILE} => $self->{MAKEFILE_OLD}: $!"
     }
     open MF, '>'.$self->{MAKEFILE} or die "open $self->{MAKEFILE} for write: $!";
     print MF <<'EOP';
@@ -885,6 +888,13 @@ sub _rename {
     return rename $src, $dest;
 }
 
+# This is an unlink for OS's where the target must be writable first.
+sub _unlink {
+    my @files = @_;
+    chmod 0666, @files;
+    return unlink @files;
+}
+
 
 # The following mkbootstrap() is only for installations that are calling
 # the pre-4.1 mkbootstrap() from their old Makefiles. This MakeMaker
@@ -2006,7 +2016,7 @@ MakeMaker object. The following lines will be parsed o.k.:
 
     $VERSION = '1.00';
     *VERSION = \'1.01';
-    ( $VERSION ) = '$Revision: 1.63 $ ' =~ /\$Revision:\s+([^\s]+)/;
+    ( $VERSION ) = '$Revision: 1.108 $ ' =~ /\$Revision:\s+([^\s]+)/;
     $FOO::VERSION = '1.10';
     *FOO::VERSION = \'1.11';
     our $VERSION = 1.2.3;       # new for perl5.6.0 
index 6d7ba70..3e0489d 100644 (file)
@@ -61,6 +61,21 @@ MakeMaker.
 
 =over 4
 
+=item How to I prevent "object version X.XX does not match bootstrap parameter Y.YY" errors?
+
+XS code is very sensitive to the module version number and will
+complain if the version number in your Perl module doesn't match.  If
+you change your module's version # without reruning Makefile.PL the old
+version number will remain in the Makefile causing the XS code to be built
+with the wrong number.
+
+To avoid this, you can force the Makefile to be rebuilt whenever you
+change the module containing the version number by adding this to your
+WriteMakefile() arguments.
+
+    depend => { '$(FIRST_MAKEFILE)' => '$(VERSION_FROM)' }
+
+
 =item How do I make two or more XS files coexist in the same directory?
 
 Sometimes you need to have two and more XS files in the same package.
index df4cb9e..6f8ce12 100644 (file)
@@ -12,7 +12,7 @@ use vars qw($VERSION @ISA @EXPORT_OK
           $Is_MacOS $Is_VMS 
           $Debug $Verbose $Quiet $MANIFEST $DEFAULT_MSKIP);
 
-$VERSION = 1.38;
+$VERSION = 1.39;
 @ISA=('Exporter');
 @EXPORT_OK = qw(mkmanifest
                 manicheck  filecheck  fullcheck  skipcheck
@@ -29,9 +29,8 @@ $Verbose = defined $ENV{PERL_MM_MANIFEST_VERBOSE} ?
 $Quiet = 0;
 $MANIFEST = 'MANIFEST';
 
-my $manifest_mod = $INC{"ExtUtils/Manifest.pm"} ||
-                   ($Is_VMS ? $INC{'extutils/manifest.pm'} : '');
-$DEFAULT_MSKIP = (File::Spec->splitpath($manifest_mod))[1].
+my $Filename = __FILE__;
+$DEFAULT_MSKIP = (File::Spec->splitpath($Filename))[1].
                  "$MANIFEST.SKIP";
 
 
@@ -86,6 +85,10 @@ that are found in the existing F<MANIFEST> file in the new one.
 
 =cut
 
+sub _sort {
+    return sort { lc $a cmp lc $b } @_;
+}
+
 sub mkmanifest {
     my $manimiss = 0;
     my $read = (-r 'MANIFEST' && maniread()) or $manimiss++;
@@ -99,7 +102,7 @@ sub mkmanifest {
     %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) {
+    foreach $file (_sort keys %all) {
        if ($skip->($file)) {
            # Policy: only remove files if they're listed in MANIFEST.SKIP.
            # Don't remove files just because they don't exist.
@@ -231,7 +234,7 @@ sub skipcheck {
     my $matches = _maniskip();
 
     my @skipped = ();
-    foreach my $file (sort keys %$found){
+    foreach my $file (_sort keys %$found){
         if (&$matches($file)){
             warn "Skipping $file\n";
             push @skipped, $file;
@@ -250,7 +253,7 @@ sub _check_files {
     my $found = manifind($p);
 
     my(@missfile) = ();
-    foreach my $file (sort keys %$read){
+    foreach my $file (_sort keys %$read){
         warn "Debug: manicheck checking from $MANIFEST $file\n" if $Debug;
         if ($dosnames){
             $file = lc $file;
@@ -274,7 +277,7 @@ sub _check_manifest {
     my $skip  = _maniskip();
 
     my @missentry = ();
-    foreach my $file (sort keys %$found){
+    foreach my $file (_sort keys %$found){
         next if $skip->($file);
         warn "Debug: manicheck checking from disk $file\n" if $Debug;
         unless ( exists $read->{$file} ) {
@@ -534,8 +537,8 @@ sub maniadd {
 
     my $manifest = maniread();
     open(MANIFEST, ">>$MANIFEST") or die "Could not open $MANIFEST: $!";
-    while( my($file, $comment) = each %$additions ) {
-        $comment ||= '';
+    foreach my $file (_sort keys %$additions) {
+        my $comment = $additions->{$file} || '';
         printf MANIFEST "%-40s%s\n", $file, $comment unless
           exists $manifest->{$file};
     }
index 2170be2..fec5c42 100644 (file)
@@ -10,6 +10,29 @@ avoid new features.  If you want to add something to MakeMaker,
 consider instead working on Module::Build, MakeMaker's heir apparent.
 
 
+Reporting bugs
+
+- Often the only information we have for fixing a bug is contained in your
+  report.  So...
+
+- Please report your bugs via http://rt.cpan.org or by mailing to
+  makemaker@perl.org.  RT is preferred.
+
+- Please report your bug immediately upon encountering it.  Do not wait
+  until you have a patch to fix the bug.  Patches are good, but not at
+  the expense of timely bug reports.
+
+- Please be as verbose as possible.  Include the complete output of
+  your 'make test' or even 'make test TEST_VERBOSE=1' and a copy of the 
+  generated Makefile.  Err on the side of verbosity.  The more data we
+  have to work with, the faster we can diagnose the problem.
+
+- If you find an undocumented feature, or if a feature has changed/been
+  added which causes a problem, report it.  Do not assume it was done
+  deliberately.  Even if it was done deliberately, we still want to hear
+  if it caused problems.
+
+
 Patching details
 
 - Please use unified diffs.  (diff -u)
@@ -109,12 +132,10 @@ Cross-Platform Compatibility
   creating one.  Its ok to have an MM_* module with only one method.
 
 - Some shells have very small buffers.  This means command lines must
-  be as small as possible.  20K is the upper limit for Unixen, and 256
-  for VMS.  Not sure what Windows and DOS are limited to, probably 1K.
-  This limit *includes* any files passed into it.  Some modules (such as
-  bioperl) generate enourmous commands because of their large number of
-  files.  If your command is just too long, consider making it an
-  ExtUtils::Command::MM function.
+  be as small as possible.  If your command is just too long, consider
+  making it an ExtUtils::Command::MM function.  If your command might
+  receive many arguments (such as pod2man or pm_to_blib) consider
+  using split_command() to split it into several, shorter calls.
 
 - Most shells quote differently.  If you need to put a perl one-liner
   in the Makefile, please use oneliner() to generate it.
index 95f66e9..eda94c0 100644 (file)
@@ -14,13 +14,10 @@ Known Problems:
 ActivePerl likely broken if installed in C:\Program Files or other
 prefix with a space in the name.
 
-manifypods target produces command lines too long for some systems
-
 Using the MMS utility on VMS causes lots of extra newlines.  Unknown
 why this is so, might be a bug in MMS.  Problem not seen with MMK.
 
-ActivePerl/Win95 disttest produces "File creation error" from somewhere
-in running Makefile.PL after check_manifest() is run.  Don't know why.
+MacOS Classic is likely broken.
 
 
 See TODO for details.
index 342ce9e..42734c0 100644 (file)
@@ -30,20 +30,26 @@ Unify VMS->find_perl
 
 Consider if VMS->find_perl needs to have pieces put into maybe_command()
 
-Consider if shell escaping all macro data is a good idea.
-
-Move Win32->init_others() ExtUtils::Command overrides into MM_Any.
+Add a MM_Any->init_others() using ExtUtils::Command.
 
 Figure out and document the 4th arg to ExtUtils::Install::install()
 
 Consider if adding a nativize() routine to replace macify() and
 fixpath() is useful.
 
-Eliminate the above from inside FS::VMS->catfile and catdir.  Make into 
-MM_VMS wrappers.
+Eliminate eliminate_macros() from inside FS::VMS->catfile and catdir.
+Make into MM_VMS wrappers.
 
 Add "NO_META" to stop autogeneration (and auto overwrite) of META.yml.
 
 Test ExtUtils::Command::MM
 
-Finish ExtUtils::MakeMaker::Tutorial
\ No newline at end of file
+Finish ExtUtils::MakeMaker::Tutorial
+
+Add 'how to install additional files' to ExtUtils::MakeMaker::FAQ.
+
+Fix NORECUSE bug continuing to set DIR
+
+Give typemap location its own macro.
+
+Merge MM_VMS->tool_xsubpp
index 19cddc5..b53475e 100644 (file)
@@ -19,30 +19,20 @@ BEGIN {
     $Has_Test_Pod = eval 'use Test::Pod 0.95; 1';
 }
 
-my(@modules);
-
-chdir File::Spec->catdir(File::Spec->updir, 'lib');
-find( sub {
-        return if /~$/;
-        if( $File::Find::dir =~ /^blib|t$/ ) {
-            $File::Find::prune = 1;
-            return;
-        }
-        push @modules, $File::Find::name if /\.pm$/;
-    }, 'ExtUtils'
-);
-
+chdir File::Spec->updir;
+my $manifest = File::Spec->catfile('MANIFEST');
+open(MANIFEST, $manifest) or die "Can't open $manifest: $!";
+my @modules = map { m{^lib/(\S+)}; $1 } 
+              grep { m{^lib/ExtUtils/\S*\.pm}  } <MANIFEST>;
+chomp @modules;
+close MANIFEST;
+
+chdir 'lib';
 plan tests => scalar @modules * 2;
 foreach my $file (@modules) {
-    local @INC = @INC;
-    unshift @INC, File::Spec->curdir;
-
-    # This piece of insanity brought to you by non-case preserving
-    # file systems!  We have extutils/command.pm, %INC has 
-    # ExtUtils/Command.pm
-    # Furthermore, 5.8.0 has a bug about require alone in an eval.  Thus
-    # the extra statement.
-    eval q{ require($file); 1 } unless grep { lc $file =~ lc $_ } keys %INC;
+    # 5.8.0 has a bug about require alone in an eval.  Thus the extra 
+    # statement.
+    eval q{ require($file); 1 };
     is( $@, '', "require $file" );
 
     SKIP: {
diff --git a/lib/ExtUtils/t/MM_Any.t b/lib/ExtUtils/t/MM_Any.t
new file mode 100644 (file)
index 0000000..0326274
--- /dev/null
@@ -0,0 +1,33 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+    if( $ENV{PERL_CORE} ) {
+        chdir 't' if -d 't';
+        @INC = '../lib';
+    }
+    else {
+        unshift @INC, 't/lib';
+    }
+}
+chdir 't';
+
+use Test::More tests => 7;
+BEGIN { use_ok('ExtUtils::MM') }
+
+
+### OS Flavor methods
+
+can_ok( 'MM', 'os_flavor', 'os_flavor_is' );
+
+# Can't really know what the flavors are going to be, so we just
+# make sure it returns something.
+my @flavors = MM->os_flavor;
+ok( @flavors,   'os_flavor() returned something' );
+
+ok( MM->os_flavor_is($flavors[rand @flavors]), 
+                                          'os_flavor_is() one flavor' );
+ok( MM->os_flavor_is($flavors[rand @flavors], 'BogusOS'),
+                                          '    many flavors' );
+ok( !MM->os_flavor_is('BogusOS'),        '    wrong flavor' );
+ok( !MM->os_flavor_is(),                 '    no flavor' );
+
index bc4165e..5b0b04f 100644 (file)
@@ -16,7 +16,7 @@ use Test::More;
 
 BEGIN {
        if ($^O =~ /cygwin/i) {
-               plan tests => 13;
+               plan tests => 11;
        } else {
                plan skip_all => "This is not cygwin";
        }
@@ -82,18 +82,6 @@ my $res = $MM->manifypods();
 like( $res, qr/pure_all.*foo.*foo.1/s, '... should add MAN3PODS targets' );
 
 
-SKIP: {
-    skip "Only relevent in the core", 2 unless $ENV{PERL_CORE};
-    $MM->{PERL_SRC} = File::Spec->updir;
-    $MM->{MAN1PODS} = { bar => 1 };
-    my $out = tie *STDOUT, 'FakeOut';
-    $res = $MM->manifypods();
-    is( $$out, '', '... should not warn if PERL_SRC provided' );
-    like( $res, qr/bar \\\n\t1 \\\n\tfoo/,
-          '... should join MAN1PODS and MAN3PODS');
-}
-
-
 # init_linker
 {
     my $libperl = $Config{libperl} || 'libperl.a';
index 4e0a607..f60e5ee 100644 (file)
@@ -21,6 +21,10 @@ use MakeMaker::Test::Utils;
 use File::Find;
 use File::Spec;
 
+# 'make disttest' sets a bunch of environment variables which interfere
+# with our testing.
+delete @ENV{qw(PREFIX LIB MAKEFLAGS)};
+
 my $perl = which_perl();
 my $Is_VMS = $^O eq 'VMS';
 
@@ -62,7 +66,7 @@ $| = 1;
 ok( chdir 'Big-Dummy', "chdir'd to Big-Dummy" ) ||
   diag("chdir failed: $!");
 
-my @mpl_out = `$perl Makefile.PL PREFIX=dummy-install`;
+my @mpl_out = run(qq{$perl Makefile.PL "PREFIX=dummy-install"});
 
 cmp_ok( $?, '==', 0, 'Makefile.PL exited with zero' ) ||
   diag(@mpl_out);
@@ -89,7 +93,7 @@ my $make = make_run();
 {
     # Supress 'make manifest' noise
     local $ENV{PERL_MM_MANIFEST_VERBOSE} = 0;
-    my $manifest_out = `$make manifest`;
+    my $manifest_out = run("$make manifest");
     ok( -e 'MANIFEST',      'make manifest created a MANIFEST' );
     ok( -s 'MANIFEST',      '  its not empty' );
 }
@@ -97,8 +101,8 @@ my $make = make_run();
 END { unlink 'MANIFEST'; }
 
 
-`$make ppd`;
-is( $?, 0,                      '  exited normally' );
+my $ppd_out = run("$make ppd");
+is( $?, 0,                      '  exited normally' ) || diag $ppd_out;
 ok( open(PPD, 'Big-Dummy.ppd'), '  .ppd file generated' );
 my $ppd_html;
 { local $/; $ppd_html = <PPD> }
@@ -124,19 +128,19 @@ like( $ppd_html, qr{^\s*</SOFTPKG>}m,                      '  </SOFTPKG>');
 END { unlink 'Big-Dummy.ppd' }
 
 
-my $test_out = `$make test`;
+my $test_out = run("$make test");
 like( $test_out, qr/All tests successful/, 'make test' );
 is( $?, 0,                                 '  exited normally' );
 
 # Test 'make test TEST_VERBOSE=1'
 my $make_test_verbose = make_macro($make, 'test', TEST_VERBOSE => 1);
-$test_out = `$make_test_verbose`;
+$test_out = run("$make_test_verbose");
 like( $test_out, qr/ok \d+ - TEST_VERBOSE/, 'TEST_VERBOSE' );
 like( $test_out, qr/All tests successful/,  '  successful' );
 is( $?, 0,                                  '  exited normally' );
 
 
-my $install_out = `$make install`;
+my $install_out = run("$make install");
 is( $?, 0, 'install' ) || diag $install_out;
 like( $install_out, qr/^Installing /m );
 like( $install_out, qr/^Writing /m );
@@ -156,7 +160,7 @@ ok( $files{'perllocal.pod'},'  perllocal.pod created' );
 SKIP: {
     skip "VMS install targets do not preserve PREFIX", 8 if $Is_VMS;
 
-    $install_out = `$make install PREFIX=elsewhere`;
+    $install_out = run("$make install PREFIX=elsewhere");
     is( $?, 0, 'install with PREFIX override' ) || diag $install_out;
     like( $install_out, qr/^Installing /m );
     like( $install_out, qr/^Writing /m );
@@ -171,7 +175,7 @@ SKIP: {
 }
 
 
-my $dist_test_out = `$make disttest`;
+my $dist_test_out = run("$make disttest");
 is( $?, 0, 'disttest' ) || diag($dist_test_out);
 
 # Test META.yml generation
@@ -185,7 +189,7 @@ is( $manifest->{'meta.yml'}, 'Module meta-data in YAML' );
 
 
 # Make sure init_dirscan doesn't go into the distdir
-@mpl_out = `$perl Makefile.PL "PREFIX=dummy-install"`;
+@mpl_out = run(qq{$perl Makefile.PL "PREFIX=dummy-install"});
 
 cmp_ok( $?, '==', 0, 'Makefile.PL exited with zero' ) ||
   diag(@mpl_out);
@@ -199,7 +203,7 @@ ok( grep(/^Writing $makefile for Big::Dummy/, @mpl_out) == 1,
 open(SAVERR, ">&STDERR") or die $!;
 open(STDERR, ">".File::Spec->devnull) or die $!;
 
-my $realclean_out = `$make realclean`;
+my $realclean_out = run("$make realclean");
 is( $?, 0, 'realclean' ) || diag($realclean_out);
 
 open(STDERR, ">&SAVERR") or die $!;
index 9260faf..be3ec73 100644 (file)
@@ -12,7 +12,7 @@ require Exporter;
 $VERSION = 0.02;
 
 @EXPORT = qw(which_perl perl_lib makefile_name makefile_backup
-             make make_run make_macro calibrate_mtime
+             make make_run run make_macro calibrate_mtime
             );
 
 my $Is_VMS   = $^O eq 'VMS';
@@ -39,6 +39,8 @@ MakeMaker::Test::Utils - Utility routines for testing MakeMaker
 
   my $mtime         = calibrate_mtime;
 
+  my $out           = run($cmd);
+
 =head1 DESCRIPTION
 
 A consolidation of little utility functions used through out the
@@ -230,6 +232,34 @@ sub calibrate_mtime {
     return $mtime;
 }
 
+=item B<run>
+
+  my $out = run($command);
+  my @out = run($command);
+
+Runs the given $command as an external program returning at least STDOUT
+as $out.  If possible it will return STDOUT and STDERR combined as you
+would expect to see on a screen.
+
+=cut
+
+sub run {
+    my $cmd = shift;
+
+    require ExtUtils::MM;
+
+    # Unix can handle 2>&1 and OS/2 from 5.005_54 up.
+    # This makes our failure diagnostics nicer to read.
+    if( MM->os_flavor_is('Unix') or
+        ($] > 5.00554 and MM->os_flavor_is('OS/2'))
+      ) {
+        return `$cmd 2>&1`;
+    }
+    else {
+        return `$cmd`;
+    }
+}    
+
 =back
 
 =head1 AUTHOR