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
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
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
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
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
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
{
'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',
},
/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
# 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;
# 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;
# 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;
#!/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';
#!/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;
--- /dev/null
+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;
--- /dev/null
+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;
--- /dev/null
+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;
/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
# 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.