1b39c5158Smillert#!/usr/bin/perl -w
2b39c5158Smillert
3b39c5158Smillert# Wherein we ensure the INST_* and INSTALL* variables are set correctly
4b39c5158Smillert# when various PREFIX variables are set.
5b39c5158Smillert#
6b39c5158Smillert# Essentially, this test is a Makefile.PL.
7b39c5158Smillert
8b39c5158SmillertBEGIN {
9b39c5158Smillert    unshift @INC, 't/lib';
10b39c5158Smillert}
11b39c5158Smillert
12b39c5158Smillertuse strict;
13256a93a4Safresh1use warnings;
14b39c5158Smillertuse Test::More tests => 52;
15b39c5158Smillertuse MakeMaker::Test::Utils;
16b39c5158Smillertuse MakeMaker::Test::Setup::BFD;
17b39c5158Smillertuse ExtUtils::MakeMaker;
18b39c5158Smillertuse File::Spec;
19b39c5158Smillertuse TieOut;
20b39c5158Smillertuse ExtUtils::MakeMaker::Config;
21b39c5158Smillert
22b39c5158Smillertmy $Is_VMS = $^O eq 'VMS';
23b39c5158Smillert
245759b3d2Safresh1chdir 't';
255759b3d2Safresh1perl_lib; # sets $ENV{PERL5LIB} relative to t/
26b39c5158Smillert
275759b3d2Safresh1use File::Temp qw[tempdir];
285759b3d2Safresh1my $tmpdir = tempdir( DIR => '../t', CLEANUP => 1 );
295759b3d2Safresh1use Cwd; my $cwd = getcwd; END { chdir $cwd } # so File::Temp can cleanup
305759b3d2Safresh1chdir $tmpdir;
31b39c5158Smillert
32b39c5158Smillert$| = 1;
33b39c5158Smillert
34b39c5158Smillertmy $Makefile = makefile_name;
35b39c5158Smillertmy $Curdir = File::Spec->curdir;
36b39c5158Smillertmy $Updir  = File::Spec->updir;
37b39c5158Smillert
38b39c5158Smillertok( setup_recurs(), 'setup' );
39b39c5158SmillertEND {
40b39c5158Smillert    ok( chdir File::Spec->updir );
41b39c5158Smillert    ok( teardown_recurs(), 'teardown' );
42b39c5158Smillert}
43b39c5158Smillert
44b39c5158Smillertok( chdir 'Big-Dummy', "chdir'd to Big-Dummy" ) ||
45b39c5158Smillert  diag("chdir failed: $!");
46b39c5158Smillert
47b39c5158Smillertmy $stdout = tie *STDOUT, 'TieOut' or die;
48b39c5158Smillert
49b39c5158Smillertmy $mm = WriteMakefile(
50b39c5158Smillert    NAME          => 'Big::Dummy',
51b39c5158Smillert    VERSION_FROM  => 'lib/Big/Dummy.pm',
52b39c5158Smillert    PREREQ_PM     => {},
53b39c5158Smillert    PERL_CORE     => $ENV{PERL_CORE},
54b39c5158Smillert);
55b39c5158Smillert
56b39c5158Smillertlike( $stdout->read, qr{
575759b3d2Safresh1                        (?:Generating\ a\ \w+?-style\ $Makefile\n)?
585759b3d2Safresh1                        (?:Writing\ $Makefile\ for\ Big::Liar\n)?
59898184e3Ssthen                        (?:Writing\ MYMETA.yml\ and\ MYMETA.json\n)?
60b39c5158Smillert                        Big::Liar's\ vars\n
61b39c5158Smillert                        INST_LIB\ =\ \S+\n
62b39c5158Smillert                        INST_ARCHLIB\ =\ \S+\n
636fb12b70Safresh1                        Generating\ a\ \w+?-style\ $Makefile\n
64b39c5158Smillert                        Writing\ $Makefile\ for\ Big::Dummy\n
65898184e3Ssthen                        (?:Writing\ MYMETA.yml\ and\ MYMETA.json\n)?
66b39c5158Smillert}x );
67b39c5158Smillert
68b39c5158Smillertis( $mm->{PREFIX}, '$(SITEPREFIX)', 'PREFIX set based on INSTALLDIRS' );
69b39c5158Smillert
70b39c5158Smillertisa_ok( $mm, 'ExtUtils::MakeMaker' );
71b39c5158Smillert
72b39c5158Smillertis( $mm->{NAME}, 'Big::Dummy',  'NAME' );
73b39c5158Smillertis( $mm->{VERSION}, 0.01,            'VERSION' );
74b39c5158Smillert
75b39c5158Smillertforeach my $prefix (qw(PREFIX PERLPREFIX SITEPREFIX VENDORPREFIX)) {
76b39c5158Smillert    unlike( $mm->{$prefix}, qr/\$\(PREFIX\)/ );
77b39c5158Smillert}
78b39c5158Smillert
79b39c5158Smillert
80b39c5158Smillertmy $PREFIX = File::Spec->catdir('foo', 'bar');
81b39c5158Smillert$mm = WriteMakefile(
82b39c5158Smillert    NAME          => 'Big::Dummy',
83b39c5158Smillert    VERSION_FROM  => 'lib/Big/Dummy.pm',
84b39c5158Smillert    PREREQ_PM     => {},
85b39c5158Smillert    PERL_CORE     => $ENV{PERL_CORE},
86b39c5158Smillert    PREFIX        => $PREFIX,
87b39c5158Smillert);
88b39c5158Smillertlike( $stdout->read, qr{
895759b3d2Safresh1                        (?:Generating\ a\ \w+?-style\ $Makefile\n)?
905759b3d2Safresh1                        (?:Writing\ $Makefile\ for\ Big::Liar\n)?
91898184e3Ssthen                        (?:Writing\ MYMETA.yml\ and\ MYMETA.json\n)?
92b39c5158Smillert                        Big::Liar's\ vars\n
93b39c5158Smillert                        INST_LIB\ =\ \S+\n
94b39c5158Smillert                        INST_ARCHLIB\ =\ \S+\n
956fb12b70Safresh1                        Generating\ a\ \w+?-style\ $Makefile\n
96b39c5158Smillert                        Writing\ $Makefile\ for\ Big::Dummy\n
97898184e3Ssthen                        (?:Writing\ MYMETA.yml\ and\ MYMETA.json\n)?
98b39c5158Smillert}x );
99b39c5158Smillertundef $stdout;
100b39c5158Smillertuntie *STDOUT;
101b39c5158Smillert
102b39c5158Smillertis( $mm->{PREFIX}, $PREFIX,   'PREFIX' );
103b39c5158Smillert
104b39c5158Smillertforeach my $prefix (qw(PERLPREFIX SITEPREFIX VENDORPREFIX)) {
105b39c5158Smillert    is( $mm->{$prefix}, '$(PREFIX)', "\$(PREFIX) overrides $prefix" );
106b39c5158Smillert}
107b39c5158Smillert
108b39c5158Smillertis( !!$mm->{PERL_CORE}, !!$ENV{PERL_CORE}, 'PERL_CORE' );
109b39c5158Smillert
110b39c5158Smillertmy($perl_src, $mm_perl_src);
111b39c5158Smillertif( $ENV{PERL_CORE} ) {
112*f2a19305Safresh1    $perl_src = File::Spec->catdir($Updir, $Updir, $Updir, $Updir, $Updir, $Updir);
113b39c5158Smillert    $perl_src = File::Spec->canonpath($perl_src);
114b39c5158Smillert    $mm_perl_src = File::Spec->canonpath($mm->{PERL_SRC});
115b39c5158Smillert}
116b39c5158Smillertelse {
117b39c5158Smillert    $mm_perl_src = $mm->{PERL_SRC};
118b39c5158Smillert}
119b39c5158Smillert
120b39c5158Smillertis( $mm_perl_src, $perl_src,     'PERL_SRC' );
121b39c5158Smillert
122b39c5158Smillert
123b39c5158Smillert# Every INSTALL* variable must start with some PREFIX.
124b39c5158Smillertmy %Install_Vars = (
125b39c5158Smillert PERL   => [qw(archlib    privlib   bin       man1dir       man3dir   script)],
126b39c5158Smillert SITE   => [qw(sitearch   sitelib   sitebin   siteman1dir   siteman3dir)],
127b39c5158Smillert VENDOR => [qw(vendorarch vendorlib vendorbin vendorman1dir vendorman3dir)]
128b39c5158Smillert);
129b39c5158Smillert
130b39c5158Smillertwhile( my($type, $vars) = each %Install_Vars) {
131b39c5158Smillert    SKIP: {
132b39c5158Smillert        skip "VMS must expand macros in INSTALL* vars", scalar @$vars
133b39c5158Smillert          if $Is_VMS;
134b39c5158Smillert        skip '$Config{usevendorprefix} not set', scalar @$vars
135b39c5158Smillert          if $type eq 'VENDOR' and !$Config{usevendorprefix};
136b39c5158Smillert
137b39c5158Smillert        foreach my $var (@$vars) {
138b39c5158Smillert            my $installvar = "install$var";
139b39c5158Smillert            my $prefix = '$('.$type.'PREFIX)';
140b39c5158Smillert
141b39c5158Smillert            SKIP: {
142b39c5158Smillert                skip uc($installvar).' set to another INSTALL variable', 1
143b39c5158Smillert                  if $mm->{uc $installvar} =~ /^\$\(INSTALL.*\)$/;
144b39c5158Smillert
145b39c5158Smillert                # support for man page skipping
146b39c5158Smillert                $prefix = 'none' if $type eq 'PERL' &&
147b39c5158Smillert                                    $var =~ /man/ &&
148b39c5158Smillert                                    !$Config{$installvar};
149b39c5158Smillert                like( $mm->{uc $installvar}, qr/^\Q$prefix\E/,
150b39c5158Smillert                      "$prefix + $var" );
151b39c5158Smillert            }
152b39c5158Smillert        }
153b39c5158Smillert    }
154b39c5158Smillert}
155b39c5158Smillert
156b39c5158Smillert# Check that when installman*dir isn't set in Config no man pages
157b39c5158Smillert# are generated.
158b39c5158Smillert{
159b39c5158Smillert    _set_config(installman1dir => '');
160b39c5158Smillert    _set_config(installman3dir => '');
161b39c5158Smillert
162b39c5158Smillert    my $wibble = File::Spec->catdir(qw(wibble and such));
163b39c5158Smillert    my $stdout = tie *STDOUT, 'TieOut' or die;
164b39c5158Smillert    my $mm = WriteMakefile(
165b39c5158Smillert                           NAME          => 'Big::Dummy',
166b39c5158Smillert                           VERSION_FROM  => 'lib/Big/Dummy.pm',
167b39c5158Smillert                           PREREQ_PM     => {},
168b39c5158Smillert                           PERL_CORE     => $ENV{PERL_CORE},
169b39c5158Smillert                           PREFIX        => $PREFIX,
170b39c5158Smillert                           INSTALLMAN1DIR=> $wibble,
171b39c5158Smillert                          );
172b39c5158Smillert
173b39c5158Smillert    is( $mm->{INSTALLMAN1DIR}, $wibble );
174b39c5158Smillert    is( $mm->{INSTALLMAN3DIR}, 'none'  );
175b39c5158Smillert}
176b39c5158Smillert
177b39c5158Smillert# Check that when installvendorman*dir is set in Config it is honored
178b39c5158Smillert# [rt.cpan.org 2949]
179b39c5158Smillert{
180b39c5158Smillert    _set_config(installvendorman1dir => File::Spec->catdir('foo','bar') );
181b39c5158Smillert    _set_config(installvendorman3dir => '' );
182b39c5158Smillert    _set_config(usevendorprefix => 1 );
183b39c5158Smillert    _set_config(vendorprefixexp => 'something' );
184b39c5158Smillert
185b39c5158Smillert    my $stdout = tie *STDOUT, 'TieOut' or die;
186b39c5158Smillert    my $mm = WriteMakefile(
187b39c5158Smillert                   NAME          => 'Big::Dummy',
188b39c5158Smillert                   VERSION_FROM  => 'lib/Big/Dummy.pm',
189b39c5158Smillert                   PREREQ_PM     => {},
190b39c5158Smillert                   PERL_CORE     => $ENV{PERL_CORE},
191b39c5158Smillert
192b39c5158Smillert                   # In case the local installation doesn't have man pages.
193b39c5158Smillert                   INSTALLMAN1DIR=> 'foo/bar/baz',
194b39c5158Smillert                   INSTALLMAN3DIR=> 'foo/bar/baz',
195b39c5158Smillert                  );
196b39c5158Smillert
197b39c5158Smillert    is( $mm->{INSTALLVENDORMAN1DIR}, File::Spec->catdir('foo','bar'),
198b39c5158Smillert                      'installvendorman1dir (in %Config) not modified' );
199b39c5158Smillert    isnt( $mm->{INSTALLVENDORMAN3DIR}, '',
200b39c5158Smillert                      'installvendorman3dir (not in %Config) set'  );
201b39c5158Smillert}
202b39c5158Smillert
203b39c5158Smillert# Check that when installsiteman*dir isn't set in Config it falls back
204b39c5158Smillert# to installman*dir
205b39c5158Smillert{
206b39c5158Smillert    _set_config(installman1dir => File::Spec->catdir('foo', 'bar') );
207b39c5158Smillert    _set_config(installman3dir => File::Spec->catdir('foo', 'baz') );
208b39c5158Smillert    _set_config(installsiteman1dir => '' );
209b39c5158Smillert    _set_config(installsiteman3dir => '' );
210b39c5158Smillert    _set_config(installvendorman1dir => '' );
211b39c5158Smillert    _set_config(installvendorman3dir => '' );
212b39c5158Smillert    _set_config(usevendorprefix => 'define' );
213b39c5158Smillert    _set_config(vendorprefixexp => 'something' );
214b39c5158Smillert
215b39c5158Smillert    my $wibble = File::Spec->catdir(qw(wibble and such));
216b39c5158Smillert    my $stdout = tie *STDOUT, 'TieOut' or die;
217b39c5158Smillert    my $mm = WriteMakefile(
218b39c5158Smillert                           NAME          => 'Big::Dummy',
219b39c5158Smillert                           VERSION_FROM  => 'lib/Big/Dummy.pm',
220b39c5158Smillert                           PERL_CORE     => $ENV{PERL_CORE},
221b39c5158Smillert                          );
222b39c5158Smillert
223b39c5158Smillert    is( $mm->{INSTALLMAN1DIR}, File::Spec->catdir('foo', 'bar') );
224b39c5158Smillert    is( $mm->{INSTALLMAN3DIR}, File::Spec->catdir('foo', 'baz') );
225b39c5158Smillert    SKIP: {
226b39c5158Smillert        skip "VMS must expand macros in INSTALL* vars", 4 if $Is_VMS;
227b39c5158Smillert
228b39c5158Smillert        is( $mm->{INSTALLSITEMAN1DIR},   '$(INSTALLMAN1DIR)' );
229b39c5158Smillert        is( $mm->{INSTALLSITEMAN3DIR},   '$(INSTALLMAN3DIR)' );
230b39c5158Smillert        is( $mm->{INSTALLVENDORMAN1DIR}, '$(INSTALLMAN1DIR)' );
231b39c5158Smillert        is( $mm->{INSTALLVENDORMAN3DIR}, '$(INSTALLMAN3DIR)' );
232b39c5158Smillert    }
233b39c5158Smillert}
234b39c5158Smillert
235b39c5158Smillert
236b39c5158Smillert# Check that when usevendoprefix and installvendorman*dir aren't set in
237b39c5158Smillert# Config it leaves them unset.
238b39c5158Smillert{
239b39c5158Smillert    _set_config(installman1dir => File::Spec->catdir('foo', 'bar') );
240b39c5158Smillert    _set_config(installman3dir => File::Spec->catdir('foo', 'baz') );
241b39c5158Smillert    _set_config(installsiteman1dir => '' );
242b39c5158Smillert    _set_config(installsiteman3dir => '' );
243b39c5158Smillert    _set_config(installvendorman1dir => '' );
244b39c5158Smillert    _set_config(installvendorman3dir => '' );
245b39c5158Smillert    _set_config(usevendorprefix => '' );
246b39c5158Smillert    _set_config(vendorprefixexp => '' );
247b39c5158Smillert
248b39c5158Smillert    my $wibble = File::Spec->catdir(qw(wibble and such));
249b39c5158Smillert    my $stdout = tie *STDOUT, 'TieOut' or die;
250b39c5158Smillert    my $mm = WriteMakefile(
251b39c5158Smillert                           NAME          => 'Big::Dummy',
252b39c5158Smillert                           VERSION_FROM  => 'lib/Big/Dummy.pm',
253b39c5158Smillert                           PERL_CORE     => $ENV{PERL_CORE},
254b39c5158Smillert                          );
255b39c5158Smillert
256b39c5158Smillert    is( $mm->{INSTALLMAN1DIR}, File::Spec->catdir('foo', 'bar') );
257b39c5158Smillert    is( $mm->{INSTALLMAN3DIR}, File::Spec->catdir('foo', 'baz') );
258b39c5158Smillert    SKIP: {
259b39c5158Smillert        skip "VMS must expand macros in INSTALL* vars", 2 if $Is_VMS;
260b39c5158Smillert        is( $mm->{INSTALLSITEMAN1DIR},   '$(INSTALLMAN1DIR)' );
261b39c5158Smillert        is( $mm->{INSTALLSITEMAN3DIR},   '$(INSTALLMAN3DIR)' );
262b39c5158Smillert    }
263b39c5158Smillert    is( $mm->{INSTALLVENDORMAN1DIR}, '' );
264b39c5158Smillert    is( $mm->{INSTALLVENDORMAN3DIR}, '' );
265b39c5158Smillert}
266b39c5158Smillert
267b39c5158Smillert
268b39c5158Smillertsub _set_config {
269b39c5158Smillert    my($k,$v) = @_;
270b39c5158Smillert    (my $k_no_install = $k) =~ s/^install//i;
271b39c5158Smillert    $Config{$k} = $v;
272b39c5158Smillert
273b39c5158Smillert    # Because VMS's config has traditionally been underpopulated, it will
274b39c5158Smillert    # fall back to the install-less versions in desperation.
275b39c5158Smillert    $Config{$k_no_install} = $v if $Is_VMS;
276b39c5158Smillert    return;
277b39c5158Smillert}
278