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