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