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