summaryrefslogtreecommitdiff
path: root/lib/Module/Build/Compat.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Module/Build/Compat.pm')
-rw-r--r--lib/Module/Build/Compat.pm116
1 files changed, 98 insertions, 18 deletions
diff --git a/lib/Module/Build/Compat.pm b/lib/Module/Build/Compat.pm
index d1bc7250e2..92c2b5e272 100644
--- a/lib/Module/Build/Compat.pm
+++ b/lib/Module/Build/Compat.pm
@@ -2,7 +2,7 @@ package Module::Build::Compat;
use strict;
use vars qw($VERSION);
-$VERSION = '0.2808_01';
+$VERSION = '0.30';
use File::Spec;
use IO::File;
@@ -11,19 +11,50 @@ use Module::Build;
use Module::Build::ModuleInfo;
use Data::Dumper;
+my %convert_installdirs = (
+ PERL => 'core',
+ SITE => 'site',
+ VENDOR => 'vendor',
+);
+
my %makefile_to_build =
(
TEST_VERBOSE => 'verbose',
VERBINST => 'verbose',
- INC => sub { map {('--extra_compiler_flags', $_)} Module::Build->split_like_shell(shift) },
- POLLUTE => sub { ('--extra_compiler_flags', '-DPERL_POLLUTE') },
- INSTALLDIRS => sub {local $_ = shift; 'installdirs=' . (/^perl$/ ? 'core' : $_) },
- LIB => sub { ('--install_path', 'lib='.shift()) },
+ INC => sub { map {(extra_compiler_flags => $_)} Module::Build->split_like_shell(shift) },
+ POLLUTE => sub { (extra_compiler_flags => '-DPERL_POLLUTE') },
+ INSTALLDIRS => sub { (installdirs => $convert_installdirs{uc shift()}) },
+ LIB => sub {
+ my $lib = shift;
+ my %config = (
+ installprivlib => $lib,
+ installsitelib => $lib,
+ installarchlib => "$lib/$Config{archname}",
+ installsitearch => "$lib/$Config{archname}"
+ );
+ return map { (config => "$_=$config{$_}") } keys %config;
+ },
+
+ # Convert INSTALLVENDORLIB and friends.
+ (
+ map {
+ my $name = "INSTALL".$_."LIB";
+ $name => sub {
+ my @ret = (config => { lc $name => shift });
+ print STDERR "# Converted to @ret\n";
+
+ return @ret;
+ }
+ } keys %convert_installdirs
+ ),
# Some names they have in common
map {$_, lc($_)} qw(DESTDIR PREFIX INSTALL_BASE UNINST),
);
+my %macro_to_build = %makefile_to_build;
+# "LIB=foo make" is not the same as "perl Makefile.PL LIB=foo"
+delete $macro_to_build{LIB};
sub create_makefile_pl {
@@ -37,6 +68,8 @@ sub create_makefile_pl {
$fh = $args{fh};
} else {
$args{file} ||= 'Makefile.PL';
+ local $build->{properties}{quiet} = 1;
+ $build->delete_filetree($args{file});
$fh = IO::File->new("> $args{file}") or die "Can't write $args{file}: $!";
}
@@ -50,7 +83,7 @@ sub create_makefile_pl {
}
# If a *bundled* custom subclass is being used, make sure we add its
- # directory to @INC.
+ # directory to @INC. Also, lib.pm always needs paths in Unix format.
my $subclass_load = '';
if (ref($build) ne "Module::Build") {
my $subclass_dir = $package->subclass_dir($build);
@@ -60,10 +93,13 @@ sub create_makefile_pl {
if ($build->dir_contains($base_dir, $subclass_dir)) {
$subclass_dir = File::Spec->abs2rel($subclass_dir, $base_dir);
+ $subclass_dir = $package->unixify_dir($subclass_dir);
$subclass_load = "use lib '$subclass_dir';";
}
+ # Otherwise, leave it the empty string
} else {
+ $subclass_dir = $package->unixify_dir($subclass_dir);
$subclass_load = "use lib '$subclass_dir';";
}
}
@@ -161,8 +197,13 @@ sub subclass_dir {
|| File::Spec->catdir($build->config_dir, 'lib'));
}
+sub unixify_dir {
+ my ($self, $path) = @_;
+ return join '/', File::Spec->splitdir($path);
+}
+
sub makefile_to_build_args {
- shift;
+ my $class = shift;
my @out;
foreach my $arg (@_) {
next if $arg eq '';
@@ -171,24 +212,34 @@ sub makefile_to_build_args {
die "Malformed argument '$arg'");
# Do tilde-expansion if it looks like a tilde prefixed path
- ( $val ) = glob( $val ) if $val =~ /^~/;
+ ( $val ) = Module::Build->_detildefy( $val ) if $val =~ /^~/;
if (exists $makefile_to_build{$key}) {
my $trans = $makefile_to_build{$key};
- push @out, ref($trans) ? $trans->($val) : ("--$trans", $val);
+ push @out, $class->_argvify( ref($trans) ? $trans->($val) : ($trans => $val) );
} elsif (exists $Config{lc($key)}) {
- push @out, '--config', lc($key) . "=$val";
+ push @out, $class->_argvify( config => lc($key) . "=$val" );
} else {
# Assume M::B can handle it in lowercase form
- push @out, "--\L$key", $val;
+ push @out, $class->_argvify("\L$key" => $val);
}
}
return @out;
}
+sub _argvify {
+ my ($self, @pairs) = @_;
+ my @out;
+ while (@pairs) {
+ my ($k, $v) = splice @pairs, 0, 2;
+ push @out, ("--$k", $v);
+ }
+ return @out;
+}
+
sub makefile_to_build_macros {
my @out;
- while (my ($macro, $trans) = each %makefile_to_build) {
+ while (my ($macro, $trans) = each %macro_to_build) {
# On some platforms (e.g. Cygwin with 'make'), the mere presence
# of "EXPORT: FOO" in the Makefile will make $ENV{FOO} defined.
# Therefore we check length() too.
@@ -216,18 +267,26 @@ sub fake_makefile {
my $class = $args{build_class};
my $perl = $class->find_perl_interpreter;
+
+ # VMS MMS/MMK need to use MCR to run the Perl image.
+ $perl = 'MCR ' . $perl if $self->_is_vms_mms;
+
my $noop = ($class->is_windowsish ? 'rem>nul' :
- $class->is_vmsish ? 'Continue' :
+ $self->_is_vms_mms ? 'Continue' :
'true');
- my $Build = 'Build --makefile_env_macros 1';
- # Start with a couple special actions
+ my $filetype = $class->is_vmsish ? '.COM' : '';
+
+ my $Build = 'Build' . $filetype . ' --makefile_env_macros 1';
+ my $unlink = $class->oneliner('1 while unlink $ARGV[0]', [], [$args{makefile}]);
+ $unlink =~ s/\$/\$\$/g;
+
my $maketext = <<"EOF";
all : force_do_it
$perl $Build
realclean : force_do_it
$perl $Build realclean
- $perl -e unlink -e shift $args{makefile}
+ $unlink
force_do_it :
@ $noop
@@ -241,7 +300,17 @@ $action : force_do_it
EOF
}
- $maketext .= "\n.EXPORT : " . join(' ', keys %makefile_to_build) . "\n\n";
+ if ($self->_is_vms_mms) {
+ # Roll our own .EXPORT as MMS/MMK don't honor that directive.
+ $maketext .= "\n.FIRST\n\t\@ $noop\n";
+ for my $macro (keys %macro_to_build) {
+ $maketext .= ".IFDEF $macro\n\tDEFINE $macro \"\$($macro)\"\n.ENDIF\n";
+ }
+ $maketext .= "\n";
+ }
+ else {
+ $maketext .= "\n.EXPORT : " . join(' ', keys %macro_to_build) . "\n\n";
+ }
return $maketext;
}
@@ -267,13 +336,24 @@ sub fake_prereqs {
sub write_makefile {
my ($pack, %in) = @_;
- $in{makefile} ||= 'Makefile';
+
+ unless (exists $in{build_class}) {
+ warn "Unknown 'build_class', defaulting to 'Module::Build'\n";
+ $in{build_class} = 'Module::Build';
+ }
+ my $class = $in{build_class};
+ $in{makefile} ||= $pack->_is_vms_mms ? 'Descrip.MMS' : 'Makefile';
+
open MAKE, "> $in{makefile}" or die "Cannot write $in{makefile}: $!";
print MAKE $pack->fake_prereqs;
print MAKE $pack->fake_makefile(%in);
close MAKE;
}
+sub _is_vms_mms {
+ return Module::Build->is_vmsish && ($Config{make} =~ m/MM[SK]/i);
+}
+
1;
__END__