Move ExtUtils::Install from lib to ext.
Nicholas Clark [Thu, 10 Sep 2009 10:08:39 +0000 (11:08 +0100)]
18 files changed:
MANIFEST
Porting/Maintainers.pl
ext/.gitignore
ext/ExtUtils-Install/Changes [moved from lib/ExtUtils/Changes_EU-Install with 100% similarity]
ext/ExtUtils-Install/lib/ExtUtils/Install.pm [moved from lib/ExtUtils/Install.pm with 100% similarity]
ext/ExtUtils-Install/lib/ExtUtils/Installed.pm [moved from lib/ExtUtils/Installed.pm with 100% similarity]
ext/ExtUtils-Install/lib/ExtUtils/Packlist.pm [moved from lib/ExtUtils/Packlist.pm with 100% similarity]
ext/ExtUtils-Install/t/Install.t [moved from lib/ExtUtils/t/Install.t with 97% similarity]
ext/ExtUtils-Install/t/InstallWithMM.t [moved from lib/ExtUtils/t/InstallWithMM.t with 93% similarity]
ext/ExtUtils-Install/t/Installapi2.t [moved from lib/ExtUtils/t/Installapi2.t with 98% similarity]
ext/ExtUtils-Install/t/Installed.t [moved from lib/ExtUtils/t/Installed.t with 98% similarity]
ext/ExtUtils-Install/t/Packlist.t [moved from lib/ExtUtils/t/Packlist.t with 96% similarity]
ext/ExtUtils-Install/t/can_write_dir.t [moved from lib/ExtUtils/t/can_write_dir.t with 100% similarity]
ext/ExtUtils-Install/t/lib/MakeMaker/Test/Setup/BFD.pm [new file with mode: 0644]
ext/ExtUtils-Install/t/lib/MakeMaker/Test/Utils.pm [new file with mode: 0644]
ext/ExtUtils-Install/t/lib/TieOut.pm [new file with mode: 0644]
lib/.gitignore
make_ext.pl

index f56f40f..e11f57e 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -1049,6 +1049,19 @@ ext/ExtUtils-Constant/lib/ExtUtils/Constant/ProxySubs.pm generate XS code for pr
 ext/ExtUtils-Constant/lib/ExtUtils/Constant/Utils.pm           generate XS code to import C header constants
 ext/ExtUtils-Constant/lib/ExtUtils/Constant/XS.pm              generate XS code to import C header constants
 ext/ExtUtils-Constant/t/Constant.t                             See if ExtUtils::Constant works
+ext/ExtUtils-Install/Changes                           ExtUtils-Install change log
+ext/ExtUtils-Install/lib/ExtUtils/Installed.pm         Information on installed extensions
+ext/ExtUtils-Install/lib/ExtUtils/Install.pm           Handles 'make install' on extensions
+ext/ExtUtils-Install/lib/ExtUtils/Packlist.pm          Manipulates .packlist files
+ext/ExtUtils-Install/t/can_write_dir.t                 Does the _can_write_dir function of ExtUtils::Install work properly?
+ext/ExtUtils-Install/t/Installapi2.t                   See if new api for ExtUtils::Install::install() works
+ext/ExtUtils-Install/t/Installed.t                     See if ExtUtils::Installed works
+ext/ExtUtils-Install/t/Install.t                       See if ExtUtils::Install works
+ext/ExtUtils-Install/t/InstallWithMM.t                 See if ExtUtils::Install works (related to EUMM/t/basic.t)
+ext/ExtUtils-Install/t/lib/MakeMaker/Test/Setup/BFD.pm MakeMaker test utilities
+ext/ExtUtils-Install/t/lib/MakeMaker/Test/Utils.pm     MakeMaker test utilities
+ext/ExtUtils-Install/t/lib/TieOut.pm                   Testing library to capture prints
+ext/ExtUtils-Install/t/Packlist.t                      See if Packlist works
 ext/Fcntl/Fcntl.pm     Fcntl extension Perl module
 ext/Fcntl/Fcntl.xs     Fcntl extension external subroutines
 ext/Fcntl/Makefile.PL  Fcntl extension makefile writer
@@ -2564,11 +2577,8 @@ lib/ExtUtils/CBuilder/t/00-have-compiler.t       ExtUtils::CBuilder tests
 lib/ExtUtils/CBuilder/t/01-basic.t     tests for ExtUtils::CBuilder
 lib/ExtUtils/CBuilder/t/02-link.t      tests for ExtUtils::CBuilder
 lib/ExtUtils/Changes           MakeMaker change log
-lib/ExtUtils/Changes_EU-Install                ExtUtils-Install change log
 lib/ExtUtils/Command/MM.pm     Calling MM functions from the cmd line
 lib/ExtUtils/Embed.pm          Utilities for embedding Perl in C programs
-lib/ExtUtils/Installed.pm      Information on installed extensions
-lib/ExtUtils/Install.pm                Handles 'make install' on extensions
 lib/ExtUtils/instmodsh         Give information about installed extensions
 lib/ExtUtils/Liblist/Kid.pm    Does the real work of the above
 lib/ExtUtils/Liblist.pm                Locates libraries
@@ -2599,7 +2609,6 @@ lib/ExtUtils/MM_Win32.pm  MakeMaker methods for Win32
 lib/ExtUtils/MM_Win95.pm       MakeMaker methods for Win95
 lib/ExtUtils/MY.pm             MakeMaker user override class
 lib/ExtUtils/NOTES             Notes about MakeMaker internals
-lib/ExtUtils/Packlist.pm       Manipulates .packlist files
 lib/ExtUtils/ParseXS/Changes   ExtUtils::ParseXS change log
 lib/ExtUtils/ParseXS.pm                converts Perl XS code into C code
 lib/ExtUtils/ParseXS/t/basic.t See if ExtUtils::ParseXS works
@@ -2615,7 +2624,6 @@ lib/ExtUtils/t/arch_check.t       Test MakeMaker's arch_check()
 lib/ExtUtils/t/backwards.t     Check MakeMaker's backwards compatibility
 lib/ExtUtils/t/basic.t         See if MakeMaker can build a module
 lib/ExtUtils/t/build_man.t     Set if MakeMaker builds manpages
-lib/ExtUtils/t/can_write_dir.t Does the _can_write_dir function of ExtUtils::Install work properly?
 lib/ExtUtils/t/cd.t            Test to see cd works
 lib/ExtUtils/t/config.t                Test ExtUtils::MakeMaker::Config
 lib/ExtUtils/t/dir_target.t    Verify if dir_target() is supported
@@ -2625,12 +2633,8 @@ lib/ExtUtils/t/FIRST_MAKEFILE.t          See if FIRST_MAKEFILE works
 lib/ExtUtils/t/fixin.t         See if ExtUtils::MakeMaker works
 lib/ExtUtils/t/fix_libs.t      Test for ExtUtils::MakeMaker
 lib/ExtUtils/t/hints.t         See if hint files are honored.
-lib/ExtUtils/t/Installapi2.t   See if new api for ExtUtils::Install::install() works
 lib/ExtUtils/t/INSTALL_BASE.t  Test INSTALL_BASE in MakeMaker
 lib/ExtUtils/t/installed_file.t        Test for ExtUtils::MakeMaker
-lib/ExtUtils/t/Installed.t     See if ExtUtils::Installed works
-lib/ExtUtils/t/Install.t       See if ExtUtils::Install works
-lib/ExtUtils/t/InstallWithMM.t See if ExtUtils::Install works (related to EUMM/t/basic.t)
 lib/ExtUtils/t/INST_PREFIX.t   See if MakeMaker can apply PREFIXs
 lib/ExtUtils/t/INST.t          Check MakeMaker INST_* macros
 lib/ExtUtils/t/is_of_type.t    Test for ExtUtils::MakeMaker
@@ -2654,7 +2658,6 @@ lib/ExtUtils/t/MM_VMS.t           See if ExtUtils::MM_VMS works
 lib/ExtUtils/t/MM_Win32.t      See if ExtUtils::MM_Win32 works
 lib/ExtUtils/TODO              Things TODO in MakeMaker
 lib/ExtUtils/t/oneliner.t      See if MM can generate perl one-liners
-lib/ExtUtils/t/Packlist.t      See if Packlist works
 lib/ExtUtils/t/parse_version.t See if parse_version works
 lib/ExtUtils/t/PL_FILES.t      Test PL_FILES in MakeMaker
 lib/ExtUtils/t/pm.t            See if MakeMaker can handle PM
index f3b16b9..4e0e01e 100755 (executable)
@@ -601,26 +601,15 @@ use File::Glob qw(:case);
        {
        'MAINTAINER'    => 'yves',
        'DISTRIBUTION'  => 'YVES/ExtUtils-Install-1.54.tar.gz',
-       'FILES'         => q[lib/ExtUtils/{Install,Installed,Packlist}.pm
-                             lib/ExtUtils/Changes_EU-Install
-                            lib/ExtUtils/t/Installed.t
-                            lib/ExtUtils/t/InstallWithMM.t
-                            lib/ExtUtils/t/{Install,Installapi2,Packlist,can_write_dir}.t],
-       'EXCLUDED'      => [ qw{ t/lib/MakeMaker/Test/Setup/BFD.pm
-                                t/lib/MakeMaker/Test/Utils.pm
-                                t/lib/Test/Builder.pm
+       'FILES'         => q[ext/ExtUtils-Install],
+       'EXCLUDED'      => [ qw{ t/lib/Test/Builder.pm
                                 t/lib/Test/Builder/Module.pm
                                 t/lib/Test/More.pm
                                 t/lib/Test/Simple.pm
-                                t/lib/TieOut.pm
                                 t/pod-coverage.t
                                 t/pod.t
                               },
                           ],
-       'MAP'           => { 't/'       => 'lib/ExtUtils/t/',
-                            'lib/'     => 'lib/',
-                            'Changes'  => 'lib/ExtUtils/Changes_EU-Install',
-                          },
        'CPAN'          => 1,
        'UPSTREAM'      => 'blead',
        },
index 1082a07..9dc488d 100644 (file)
@@ -28,6 +28,7 @@ ppport.h
 /Digest/Makefile.PL
 /Devel-SelfStubber/Makefile.PL
 /ExtUtils-Constant/Makefile.PL
+/ExtUtils-Install/Makefile.PL
 /FileCache/Makefile.PL
 /File-Fetch/Makefile.PL
 /Filter-Simple/Makefile.PL
similarity index 97%
rename from lib/ExtUtils/t/Install.t
rename to ext/ExtUtils-Install/t/Install.t
index a30515e..cf3c67e 100644 (file)
@@ -3,14 +3,8 @@
 # Test ExtUtils::Install.
 
 BEGIN {
-    if( $ENV{PERL_CORE} ) {
-        @INC = ('../../lib', '../lib', 'lib');
-    }
-    else {
-        unshift @INC, 't/lib';
-    }
+    unshift @INC, 't/lib';
 }
-chdir 't';
 
 use strict;
 use TieOut;
similarity index 93%
rename from lib/ExtUtils/t/InstallWithMM.t
rename to ext/ExtUtils-Install/t/InstallWithMM.t
index 354b8f4..028c01a 100644 (file)
@@ -3,13 +3,7 @@
 # Make sure EUI works with MakeMaker
 
 BEGIN {
-    if( $ENV{PERL_CORE} ) {
-        chdir 't' if -d 't';
-        @INC = ('../lib', 'lib');
-    }
-    else {
-        unshift @INC, 't/lib';
-    }
+    unshift @INC, 't/lib';
 }
 
 use strict;
similarity index 98%
rename from lib/ExtUtils/t/Installapi2.t
rename to ext/ExtUtils-Install/t/Installapi2.t
index c59b8ab..1a59da2 100644 (file)
@@ -3,14 +3,8 @@
 # Test ExtUtils::Install.
 
 BEGIN {
-    if( $ENV{PERL_CORE} ) {
-        @INC = ('../../lib', '../lib', 'lib');
-    }
-    else {
-        unshift @INC, 't/lib';
-    }
+    unshift @INC, 't/lib';
 }
-chdir 't';
 
 use strict;
 use TieOut;
similarity index 98%
rename from lib/ExtUtils/t/Installed.t
rename to ext/ExtUtils-Install/t/Installed.t
index dd492c2..6e0be3d 100644 (file)
@@ -1,15 +1,8 @@
 #!/usr/bin/perl -w
 
 BEGIN {
-    if( $ENV{PERL_CORE} ) {
-        chdir 't' if -d 't';
-        @INC = '../lib';
-    }
-    else {
-        unshift @INC, 't/lib/';
-    }
+    unshift @INC, 't/lib/';
 }
-chdir 't';
 
 my $Is_VMS = $^O eq 'VMS';
 
similarity index 96%
rename from lib/ExtUtils/t/Packlist.t
rename to ext/ExtUtils-Install/t/Packlist.t
index cb73e00..8284bff 100644 (file)
@@ -1,15 +1,8 @@
 #!/usr/bin/perl -w
 
 BEGIN {
-    if( $ENV{PERL_CORE} ) {
-        chdir 't' if -d 't';
-        @INC = '../lib';
-    }
-    else {
-        unshift @INC, 't/lib';
-    }
+    unshift @INC, 't/lib';
 }
-chdir 't';
 
 use Test::More tests => 34;
 
diff --git a/ext/ExtUtils-Install/t/lib/MakeMaker/Test/Setup/BFD.pm b/ext/ExtUtils-Install/t/lib/MakeMaker/Test/Setup/BFD.pm
new file mode 100644 (file)
index 0000000..9745656
--- /dev/null
@@ -0,0 +1,132 @@
+package MakeMaker::Test::Setup::BFD;
+
+@ISA = qw(Exporter);
+require Exporter;
+@EXPORT = qw(setup_recurs teardown_recurs);
+
+use strict;
+use File::Path;
+use File::Basename;
+use MakeMaker::Test::Utils;
+
+my $Is_VMS = $^O eq 'VMS';
+
+my %Files = (
+             'Big-Dummy/lib/Big/Dummy.pm'     => <<'END',
+package Big::Dummy;
+
+$VERSION = 0.01;
+
+=head1 NAME
+
+Big::Dummy - Try "our" hot dog's
+
+=cut
+
+1;
+END
+
+             'Big-Dummy/Makefile.PL'          => <<'END',
+use ExtUtils::MakeMaker;
+
+# This will interfere with the PREREQ_PRINT tests.
+printf "Current package is: %s\n", __PACKAGE__ unless "@ARGV" =~ /PREREQ/;
+
+WriteMakefile(
+    NAME          => 'Big::Dummy',
+    VERSION_FROM  => 'lib/Big/Dummy.pm',
+    EXE_FILES     => [qw(bin/program)],
+    PREREQ_PM     => { strict => 0 },
+    ABSTRACT_FROM => 'lib/Big/Dummy.pm',
+    AUTHOR        => 'Michael G Schwern <schwern@pobox.com>',
+);
+END
+
+             'Big-Dummy/bin/program'          => <<'END',
+#!/usr/bin/perl -w
+
+=head1 NAME
+
+program - this is a program
+
+=cut
+
+1;
+END
+
+             'Big-Dummy/t/compile.t'          => <<'END',
+print "1..2\n";
+
+print eval "use Big::Dummy; 1;" ? "ok 1\n" : "not ok 1\n";
+print "ok 2 - TEST_VERBOSE\n";
+END
+
+             'Big-Dummy/Liar/t/sanity.t'      => <<'END',
+print "1..3\n";
+
+print eval "use Big::Dummy; 1;" ? "ok 1\n" : "not ok 1\n";
+print eval "use Big::Liar; 1;" ? "ok 2\n" : "not ok 2\n";
+print "ok 3 - TEST_VERBOSE\n";
+END
+
+             'Big-Dummy/Liar/lib/Big/Liar.pm' => <<'END',
+package Big::Liar;
+
+$VERSION = 0.01;
+
+1;
+END
+
+             'Big-Dummy/Liar/Makefile.PL'     => <<'END',
+use ExtUtils::MakeMaker;
+
+my $mm = WriteMakefile(
+              NAME => 'Big::Liar',
+              VERSION_FROM => 'lib/Big/Liar.pm',
+              _KEEP_AFTER_FLUSH => 1
+             );
+
+print "Big::Liar's vars\n";
+foreach my $key (qw(INST_LIB INST_ARCHLIB)) {
+    print "$key = $mm->{$key}\n";
+}
+END
+
+            );
+
+
+sub setup_recurs {
+    setup_mm_test_root();
+    chdir 'MM_TEST_ROOT:[t]' if $Is_VMS;
+
+    while(my($file, $text) = each %Files) {
+        # Convert to a relative, native file path.
+        $file = File::Spec->catfile(File::Spec->curdir, split m{\/}, $file);
+
+        my $dir = dirname($file);
+        mkpath $dir;
+        open(FILE, ">$file") || die "Can't create $file: $!";
+        print FILE $text;
+        close FILE;
+
+        # ensure file at least 1 second old for makes that assume
+        # files with the same time are out of date.
+        my $time = calibrate_mtime();
+        utime $time, $time - 1, $file;
+    }
+
+    return 1;
+}
+
+sub teardown_recurs { 
+    foreach my $file (keys %Files) {
+        my $dir = dirname($file);
+        if( -e $dir ) {
+            rmtree($dir) || return;
+        }
+    }
+    return 1;
+}
+
+
+1;
diff --git a/ext/ExtUtils-Install/t/lib/MakeMaker/Test/Utils.pm b/ext/ExtUtils-Install/t/lib/MakeMaker/Test/Utils.pm
new file mode 100644 (file)
index 0000000..7e5d5fc
--- /dev/null
@@ -0,0 +1,412 @@
+package MakeMaker::Test::Utils;
+
+use File::Spec;
+use strict;
+use Config;
+
+require Exporter;
+our @ISA = qw(Exporter);
+
+our $Is_VMS   = $^O eq 'VMS';
+our $Is_MacOS = $^O eq 'MacOS';
+
+our @EXPORT = qw(which_perl perl_lib makefile_name makefile_backup
+                 make make_run run make_macro calibrate_mtime
+                 setup_mm_test_root
+                 have_compiler slurp
+                 $Is_VMS $Is_MacOS
+                 run_ok
+                );
+
+
+# Setup the code to clean out %ENV
+{
+    # Environment variables which might effect our testing
+    my @delete_env_keys = qw(
+        PERL_MM_OPT
+        PERL_MM_USE_DEFAULT
+        HARNESS_TIMER
+        HARNESS_OPTIONS
+        HARNESS_VERBOSE
+        PREFIX
+        MAKEFLAGS
+    );
+
+    # Remember the ENV values because on VMS %ENV is global
+    # to the user, not the process.
+    my %restore_env_keys;
+
+    sub clean_env {
+        for my $key (@delete_env_keys) {
+            if( exists $ENV{$key} ) {
+                $restore_env_keys{$key} = delete $ENV{$key};
+            }
+            else {
+                delete $ENV{$key};
+            }
+        }
+    }
+
+    END {
+        while( my($key, $val) = each %restore_env_keys ) {
+            $ENV{$key} = $val;
+        }
+    }
+}
+clean_env();
+
+
+=head1 NAME
+
+MakeMaker::Test::Utils - Utility routines for testing MakeMaker
+
+=head1 SYNOPSIS
+
+  use MakeMaker::Test::Utils;
+
+  my $perl     = which_perl;
+  perl_lib;
+
+  my $makefile      = makefile_name;
+  my $makefile_back = makefile_backup;
+
+  my $make          = make;
+  my $make_run      = make_run;
+  make_macro($make, $targ, %macros);
+
+  my $mtime         = calibrate_mtime;
+
+  my $out           = run($cmd);
+
+  my $have_compiler = have_compiler();
+
+  my $text          = slurp($filename);
+
+
+=head1 DESCRIPTION
+
+A consolidation of little utility functions used through out the
+MakeMaker test suite.
+
+=head2 Functions
+
+The following are exported by default.
+
+=over 4
+
+=item B<which_perl>
+
+  my $perl = which_perl;
+
+Returns a path to perl which is safe to use in a command line, no
+matter where you chdir to.
+
+=cut
+
+sub which_perl {
+    my $perl = $^X;
+    $perl ||= 'perl';
+
+    # VMS should have 'perl' aliased properly
+    return $perl if $Is_VMS;
+
+    $perl .= $Config{exe_ext} unless $perl =~ m/$Config{exe_ext}$/i;
+
+    my $perlpath = File::Spec->rel2abs( $perl );
+    unless( $Is_MacOS || -x $perlpath ) {
+        # $^X was probably 'perl'
+
+        # When building in the core, *don't* go off and find
+        # another perl
+        die "Can't find a perl to use (\$^X=$^X), (\$perlpath=$perlpath)" 
+          if $ENV{PERL_CORE};
+
+        foreach my $path (File::Spec->path) {
+            $perlpath = File::Spec->catfile($path, $perl);
+            last if -x $perlpath;
+        }
+    }
+
+    return $perlpath;
+}
+
+=item B<perl_lib>
+
+  perl_lib;
+
+Sets up environment variables so perl can find its libraries.
+
+=cut
+
+my $old5lib = $ENV{PERL5LIB};
+my $had5lib = exists $ENV{PERL5LIB};
+sub perl_lib {
+                               # perl-src/t/
+    my $lib =  $ENV{PERL_CORE} ? qq{../lib}
+                               # ExtUtils-MakeMaker/t/
+                               : qq{../blib/lib};
+    $lib = File::Spec->rel2abs($lib);
+    my @libs = ($lib);
+    push @libs, $ENV{PERL5LIB} if exists $ENV{PERL5LIB};
+    $ENV{PERL5LIB} = join($Config{path_sep}, @libs);
+    unshift @INC, $lib;
+}
+
+END { 
+    if( $had5lib ) {
+        $ENV{PERL5LIB} = $old5lib;
+    }
+    else {
+        delete $ENV{PERL5LIB};
+    }
+}
+
+
+=item B<makefile_name>
+
+  my $makefile = makefile_name;
+
+MakeMaker doesn't always generate 'Makefile'.  It returns what it
+should generate.
+
+=cut
+
+sub makefile_name {
+    return $Is_VMS ? 'Descrip.MMS' : 'Makefile';
+}   
+
+=item B<makefile_backup>
+
+  my $makefile_old = makefile_backup;
+
+Returns the name MakeMaker will use for a backup of the current
+Makefile.
+
+=cut
+
+sub makefile_backup {
+    my $makefile = makefile_name;
+    return $Is_VMS ? "$makefile".'_old' : "$makefile.old";
+}
+
+=item B<make>
+
+  my $make = make;
+
+Returns a good guess at the make to run.
+
+=cut
+
+sub make {
+    my $make = $Config{make};
+    $make = $ENV{MAKE} if exists $ENV{MAKE};
+
+    return $make;
+}
+
+=item B<make_run>
+
+  my $make_run = make_run;
+
+Returns the make to run as with make() plus any necessary switches.
+
+=cut
+
+sub make_run {
+    my $make = make;
+    $make .= ' -nologo' if $make eq 'nmake';
+
+    return $make;
+}
+
+=item B<make_macro>
+
+    my $make_cmd = make_macro($make, $target, %macros);
+
+Returns the command necessary to run $make on the given $target using
+the given %macros.
+
+  my $make_test_verbose = make_macro(make_run(), 'test', 
+                                     TEST_VERBOSE => 1);
+
+This is important because VMS's make utilities have a completely
+different calling convention than Unix or Windows.
+
+%macros is actually a list of tuples, so the order will be preserved.
+
+=cut
+
+sub make_macro {
+    my($make, $target) = (shift, shift);
+
+    my $is_mms = $make =~ /^MM(K|S)/i;
+
+    my $cmd = $make;
+    my $macros = '';
+    while( my($key,$val) = splice(@_, 0, 2) ) {
+        if( $is_mms ) {
+            $macros .= qq{/macro="$key=$val"};
+        }
+        else {
+            $macros .= qq{ $key=$val};
+        }
+    }
+
+    return $is_mms ? "$make$macros $target" : "$make $target $macros";
+}
+
+=item B<calibrate_mtime>
+
+  my $mtime = calibrate_mtime;
+
+When building on NFS, file modification times can often lose touch
+with reality.  This returns the mtime of a file which has just been
+touched.
+
+=cut
+
+sub calibrate_mtime {
+    open(FILE, ">calibrate_mtime.tmp") || die $!;
+    print FILE "foo";
+    close FILE;
+    my($mtime) = (stat('calibrate_mtime.tmp'))[9];
+    unlink 'calibrate_mtime.tmp';
+    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;
+
+    use ExtUtils::MM;
+
+    # Unix, modern Windows and OS/2 from 5.005_54 up can handle can handle 2>&1 
+    # This makes our failure diagnostics nicer to read.
+    if( MM->os_flavor_is('Unix')                                   or
+        (MM->os_flavor_is('Win32') and !MM->os_flavor_is('Win9x')) or
+        ($] > 5.00554 and MM->os_flavor_is('OS/2'))
+      ) {
+        return `$cmd 2>&1`;
+    }
+    else {
+        return `$cmd`;
+    }
+}
+
+
+=item B<run_ok>
+
+  my @out = run_ok($cmd);
+
+Like run() but it tests that the result exited normally.
+
+The output from run() will be used as a diagnostic if it fails.
+
+=cut
+
+sub run_ok {
+    my $tb = Test::Builder->new;
+
+    my @out = run(@_);
+
+    $tb->cmp_ok( $?, '==', 0, "run(@_)" ) || $tb->diag(@out);
+
+    return wantarray ? @out : join "", @out;
+}
+
+=item B<setup_mm_test_root>
+
+Creates a rooted logical to avoid the 8-level limit on older VMS systems.  
+No action taken on non-VMS systems.
+
+=cut
+
+sub setup_mm_test_root {
+    if( $Is_VMS ) {
+        # On older systems we might exceed the 8-level directory depth limit
+        # imposed by RMS.  We get around this with a rooted logical, but we
+        # can't create logical names with attributes in Perl, so we do it
+        # in a DCL subprocess and put it in the job table so the parent sees it.
+        open( MMTMP, '>mmtesttmp.com' ) || 
+          die "Error creating command file; $!";
+        print MMTMP <<'COMMAND';
+$ MM_TEST_ROOT = F$PARSE("SYS$DISK:[-]",,,,"NO_CONCEAL")-".][000000"-"]["-"].;"+".]"
+$ DEFINE/JOB/NOLOG/TRANSLATION=CONCEALED MM_TEST_ROOT 'MM_TEST_ROOT'
+COMMAND
+        close MMTMP;
+
+        system '@mmtesttmp.com';
+        1 while unlink 'mmtesttmp.com';
+    }
+}
+
+=item have_compiler
+
+  $have_compiler = have_compiler;
+
+Returns true if there is a compiler available for XS builds.
+
+=cut
+
+sub have_compiler {
+    my $have_compiler = 0;
+
+    # ExtUtils::CBuilder prints its compilation lines to the screen.
+    # Shut it up.
+    use TieOut;
+    local *STDOUT = *STDOUT;
+    local *STDERR = *STDERR;
+
+    tie *STDOUT, 'TieOut';
+    tie *STDERR, 'TieOut';
+
+    eval {
+       require ExtUtils::CBuilder;
+       my $cb = ExtUtils::CBuilder->new;
+
+       $have_compiler = $cb->have_compiler;
+    };
+
+    return $have_compiler;
+}
+
+=item slurp
+
+  $contents = slurp($filename);
+
+Returns the $contents of $filename.
+
+Will die if $filename cannot be opened.
+
+=cut
+
+sub slurp {
+    my $filename = shift;
+
+    local $/ = undef;
+    open my $fh, $filename or die "Can't open $filename for reading: $!";
+    my $text = <$fh>;
+    close $fh;
+
+    return $text;
+}
+
+=back
+
+=head1 AUTHOR
+
+Michael G Schwern <schwern@pobox.com>
+
+=cut
+
+1;
diff --git a/ext/ExtUtils-Install/t/lib/TieOut.pm b/ext/ExtUtils-Install/t/lib/TieOut.pm
new file mode 100644 (file)
index 0000000..0a0f5f9
--- /dev/null
@@ -0,0 +1,28 @@
+package TieOut;
+
+sub TIEHANDLE {
+    my $scalar = '';
+    bless( \$scalar, $_[0]);
+}
+
+sub PRINT {
+    my $self = shift;
+    $$self .= join('', @_);
+}
+
+sub PRINTF {
+    my $self = shift;
+    my $fmt  = shift;
+    $$self .= sprintf $fmt, @_;
+}
+
+sub FILENO {}
+
+sub read {
+    my $self = shift;
+    my $data = $$self;
+    $$self = '';
+    return $data;
+}
+
+1;
index 3817b3d..8ca857a 100644 (file)
 /Errno.pm
 /ExtUtils/Constant.pm
 /ExtUtils/Constant
+/ExtUtils/Installed.pm
+/ExtUtils/Install.pm
 /ExtUtils/Miniperl.pm
+/ExtUtils/Packlist.pm
 /Fatal.pm
 /Fcntl.pm
 /FileCache.pm
index 8f73a42..752fedd 100644 (file)
@@ -12,6 +12,7 @@ use Cwd;
 # allow miniperl to build everything else.
 
 my @toolchain = qw(ext/constant/lib ext/ExtUtils-Command/lib
+                  ext/ExtUtils-Install/lib
                   ext/Text-ParseWords/lib);
 
 # This script acts as a simple interface for building extensions.