From: Nicholas Clark Date: Thu, 10 Sep 2009 10:08:39 +0000 (+0100) Subject: Move ExtUtils::Install from lib to ext. X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=fb78ba4be2872a911ecd409537deabc67447f706;p=p5sagit%2Fp5-mst-13.2.git Move ExtUtils::Install from lib to ext. --- diff --git a/MANIFEST b/MANIFEST index f56f40f..e11f57e 100644 --- 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 diff --git a/Porting/Maintainers.pl b/Porting/Maintainers.pl index f3b16b9..4e0e01e 100755 --- a/Porting/Maintainers.pl +++ b/Porting/Maintainers.pl @@ -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', }, diff --git a/ext/.gitignore b/ext/.gitignore index 1082a07..9dc488d 100644 --- a/ext/.gitignore +++ b/ext/.gitignore @@ -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 diff --git a/lib/ExtUtils/Changes_EU-Install b/ext/ExtUtils-Install/Changes similarity index 100% rename from lib/ExtUtils/Changes_EU-Install rename to ext/ExtUtils-Install/Changes diff --git a/lib/ExtUtils/Install.pm b/ext/ExtUtils-Install/lib/ExtUtils/Install.pm similarity index 100% rename from lib/ExtUtils/Install.pm rename to ext/ExtUtils-Install/lib/ExtUtils/Install.pm diff --git a/lib/ExtUtils/Installed.pm b/ext/ExtUtils-Install/lib/ExtUtils/Installed.pm similarity index 100% rename from lib/ExtUtils/Installed.pm rename to ext/ExtUtils-Install/lib/ExtUtils/Installed.pm diff --git a/lib/ExtUtils/Packlist.pm b/ext/ExtUtils-Install/lib/ExtUtils/Packlist.pm similarity index 100% rename from lib/ExtUtils/Packlist.pm rename to ext/ExtUtils-Install/lib/ExtUtils/Packlist.pm diff --git a/lib/ExtUtils/t/Install.t b/ext/ExtUtils-Install/t/Install.t similarity index 97% rename from lib/ExtUtils/t/Install.t rename to ext/ExtUtils-Install/t/Install.t index a30515e..cf3c67e 100644 --- a/lib/ExtUtils/t/Install.t +++ b/ext/ExtUtils-Install/t/Install.t @@ -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; diff --git a/lib/ExtUtils/t/InstallWithMM.t b/ext/ExtUtils-Install/t/InstallWithMM.t similarity index 93% rename from lib/ExtUtils/t/InstallWithMM.t rename to ext/ExtUtils-Install/t/InstallWithMM.t index 354b8f4..028c01a 100644 --- a/lib/ExtUtils/t/InstallWithMM.t +++ b/ext/ExtUtils-Install/t/InstallWithMM.t @@ -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; diff --git a/lib/ExtUtils/t/Installapi2.t b/ext/ExtUtils-Install/t/Installapi2.t similarity index 98% rename from lib/ExtUtils/t/Installapi2.t rename to ext/ExtUtils-Install/t/Installapi2.t index c59b8ab..1a59da2 100644 --- a/lib/ExtUtils/t/Installapi2.t +++ b/ext/ExtUtils-Install/t/Installapi2.t @@ -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; diff --git a/lib/ExtUtils/t/Installed.t b/ext/ExtUtils-Install/t/Installed.t similarity index 98% rename from lib/ExtUtils/t/Installed.t rename to ext/ExtUtils-Install/t/Installed.t index dd492c2..6e0be3d 100644 --- a/lib/ExtUtils/t/Installed.t +++ b/ext/ExtUtils-Install/t/Installed.t @@ -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'; diff --git a/lib/ExtUtils/t/Packlist.t b/ext/ExtUtils-Install/t/Packlist.t similarity index 96% rename from lib/ExtUtils/t/Packlist.t rename to ext/ExtUtils-Install/t/Packlist.t index cb73e00..8284bff 100644 --- a/lib/ExtUtils/t/Packlist.t +++ b/ext/ExtUtils-Install/t/Packlist.t @@ -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/lib/ExtUtils/t/can_write_dir.t b/ext/ExtUtils-Install/t/can_write_dir.t similarity index 100% rename from lib/ExtUtils/t/can_write_dir.t rename to ext/ExtUtils-Install/t/can_write_dir.t 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 index 0000000..9745656 --- /dev/null +++ b/ext/ExtUtils-Install/t/lib/MakeMaker/Test/Setup/BFD.pm @@ -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 ', +); +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 index 0000000..7e5d5fc --- /dev/null +++ b/ext/ExtUtils-Install/t/lib/MakeMaker/Test/Utils.pm @@ -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 + + 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; + +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 + + 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 + + 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 + + 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 + + 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 + + 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 + + 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 + + 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 + + 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 + +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 + +=cut + +1; diff --git a/ext/ExtUtils-Install/t/lib/TieOut.pm b/ext/ExtUtils-Install/t/lib/TieOut.pm new file mode 100644 index 0000000..0a0f5f9 --- /dev/null +++ b/ext/ExtUtils-Install/t/lib/TieOut.pm @@ -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; diff --git a/lib/.gitignore b/lib/.gitignore index 3817b3d..8ca857a 100644 --- a/lib/.gitignore +++ b/lib/.gitignore @@ -127,7 +127,10 @@ /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 diff --git a/make_ext.pl b/make_ext.pl index 8f73a42..752fedd 100644 --- a/make_ext.pl +++ b/make_ext.pl @@ -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.