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