1#!/usr/bin/perl -w 2 3BEGIN { 4 unshift @INC, 't/lib'; 5} 6 7use strict; 8use warnings; 9 10use MakeMaker::Test::Utils; 11use Config; 12use ExtUtils::MM; 13use Test::More 14 !MM->can_run(make()) && $ENV{PERL_CORE} && $Config{'usecrosscompile'} 15 ? (skip_all => "cross-compiling and make not available") 16 : (tests => 12); 17use File::Spec; 18use File::Temp qw[tempdir]; 19use File::Path; 20 21my $perl = which_perl(); 22my $make = make_run(); 23chdir 't'; 24perl_lib; # sets $ENV{PERL5LIB} relative to t/ 25 26my $tmpdir = tempdir( DIR => '../t', CLEANUP => 1 ); 27use Cwd; my $cwd = getcwd; END { chdir $cwd } # so File::Temp can cleanup 28chdir $tmpdir; 29 30my $DIRNAME = 'PL-Module'; 31my %FILES = ( 32 'Makefile.PL' => <<'END', 33use ExtUtils::MakeMaker; 34# A module for testing PL_FILES 35WriteMakefile( 36 NAME => 'PL::Module', 37 PL_FILES => { 'single.PL' => 'single.out', 38 'multi.PL' => [qw(1.out 2.out)], 39 'single-in.PL' => { 'single-in.out' => 'single.in' }, 40 'multi-in.PL' => { 'multi-in.out' => [qw(1.in 2.in)] }, 41 'Bar_pm.PL' => '$(INST_LIB)/PL/Bar.pm', 42 'Bar2.pm.PL' => 'Bar2.pm', 43 }, 44); 45 46package MY; 47sub init_PM { 48 my ($self) = @_; 49 $self->SUPER::init_PM; 50 $self->{PM}{'Bar2.pm'} = '$(INST_LIBDIR)/Bar2.pm'; # PDL does this in WM args 51} 52END 53 54 'single.PL' => _gen_pl_files(), 55 'multi.PL' => _gen_pl_files(), 56 'Bar_pm.PL' => _gen_pm_files(), 57 'Bar2.pm.PL' => _gen_pm_files(), 58 'single-in.PL' => _gen_pm_files(1), 59 'multi-in.PL' => _gen_pm_files(2), 60 'single.in' => '', 61 '1.in' => '', 62 '2.in' => '', 63 'lib/PL/Foo.pm' => <<'END', 64# Module to load to ensure PL_FILES have blib in @INC. 65package PL::Foo; 66sub bar { 42 } 671; 68END 69 70); 71 72hash2files($DIRNAME, \%FILES); 73END { 74 ok( chdir File::Spec->updir ); 75 ok( rmtree($DIRNAME) ); 76} 77 78ok chdir($DIRNAME); 79 80run(qq{$perl Makefile.PL}); 81cmp_ok( $?, '==', 0 ); 82 83my $make_out = run("$make"); 84is( $?, 0 ) || diag $make_out; 85 86foreach my $file (qw( 87 single.out 1.out 2.out 88 single-in.out multi-in.out 89 blib/lib/PL/Bar.pm blib/lib/PL/Bar2.pm 90)) { 91 ok( -e $file, "$file was created" ); 92} 93 94sub _gen_pl_files { 95 my $test = <<'END'; 96#!/usr/bin/perl -w 97 98# Ensure we have blib in @INC 99use PL::Foo; 100die unless PL::Foo::bar() == 42; 101 102# Had a bug where PL_FILES weren't sent the file to generate 103die "argv empty\n" unless @ARGV; 104die "too many in argv: @ARGV\n" unless @ARGV == 1; 105 106my $file = $ARGV[0]; 107open OUT, ">$file" or die $!; 108 109print OUT "Testing\n"; 110close OUT 111END 112 113 $test =~ s/^\n//; 114 115 return $test; 116} 117 118sub _gen_pm_files { 119 my $inputs = (shift || 0) + 1; 120 my $test = sprintf <<'END', $inputs; 121#!/usr/bin/perl -w 122 123# Ensure we do NOT have blib in @INC when building a module 124eval { require PL::Foo; }; 125#die $@ unless $@ =~ m{^Can't locate PL/Foo.pm in \@INC }; 126 127# Had a bug where PL_FILES weren't sent the file to generate 128die "argv empty\n" unless @ARGV; 129die "wrong number in argv: @ARGV\n" unless @ARGV == %d; 130 131my $file = $ARGV[0]; 132open OUT, ">$file" or die $!; 133 134print OUT "Testing\n"; 135close OUT 136END 137 138 $test =~ s/^\n//; 139 140 return $test; 141} 142