# routines to conditionally install a bundled submodule
# expect this file to be required'd from a submodule's Makefile.PL
# expect the submodule to use Module::Build and Build.PL
# expect the caller to define:
#
# &run_auto_generated_Makefile_PL
# (from default Makefile.PL created by Build.PL)
#
# this script automatically cleans up after itself (calls 'Build clean'),
# whether or not the installation was successful. To debug a submodule
# installation, change into the submodule's directory and run
# "perl Build.PL", "./Build", etc. yourself.
#
use ExtUtils::MakeMaker;
use strict;
use warnings;
my ($SuperModule, $TargetModule, $TargetModuleVersion,
$TargetModuleMinVersion, $TargetModulePitch, $TargetModulePrompt,
$TargetModulePromptDefault, $TargetModuleDeclineMessage,
$forceInstall, $reinstallOk);
sub conditionally_install_submodule {
my %params = @_;
print "@_" if $ENV{BUILD_DEBUG};
$SuperModule = $params{"superModule"} || "the super module";
$TargetModule = $params{"targetModule"} || die "targetModule required";
$TargetModuleMinVersion = $params{"minVersion"} || undef;
$TargetModulePitch = $params{"pitch"}
|| "$TargetModule is available for installation.\n";
$TargetModulePrompt = $params{"prompt"}
|| "Do you want to install $TargetModule? ";
$TargetModulePromptDefault = $params{"promptDefault"} || 'n';
$TargetModuleDeclineMessage = $params{"declineMessage"} || "";
$forceInstall = $params{"force"} || 0;
$reinstallOk = $params{"reinstall"} || 0;
if (!check_install_is_necessary()) {
print "Installation of $TargetModule is not necessary.\n";
return 1;
}
if (!check_install_is_desired()) {
print "$TargetModule will not be installed.\n";
print $TargetModuleDeclineMessage, "\n";
return 1;
}
&build_and_install_submodule;
return;
}
1;
sub check_install_is_necessary {
local $@;
eval {
eval "require $TargetModule"; die $@ if $@;
$TargetModuleVersion = eval '$' . $TargetModule . '::VERSION';
$TargetModulePromptDefault = 'yes';
die if $TargetModuleMinVersion
&& $TargetModuleVersion lt $TargetModuleMinVersion;
$TargetModulePromptDefault = 'no';
if (defined $TargetModuleVersion) {
print "$TargetModule v$TargetModuleVersion is already installed.\n";
}
};
if ($forceInstall) {
print "Forcing install/reinstall of $TargetModule.\n";
$TargetModulePromptDefault = 'always';
return 1;
} elsif (!$@ && $reinstallOk == 0) {
return 0;
}
return 1;
}
sub check_install_is_desired {
print $TargetModulePitch;
my $answer;
while (1) {
print "\n";
$answer = $TargetModulePromptDefault eq 'always'
? 'yes' : prompt($TargetModulePrompt, $TargetModulePromptDefault);
last if $answer =~ /^[ynq]/i;
}
print "\n";
if ($answer =~ /^n/i || $answer =~ /^q/i) {
return 0;
}
return 1;
}
sub build_and_install_submodule {
my $Build_cmd = $^O eq 'MSWin32' ? "$^X Build" : './Build';
unlink "Build", "Build.bat";
local $@ = undef;
eval {
&run_auto_generated_Makefile_PL;
};
if ($@) { print $@; }
return 0 if $@;
$ENV{BUILD_EVEN_IF_AUTOMATED_TESTING} = 1;
if (system("$Build_cmd")
|| system("$Build_cmd test")
|| system("$Build_cmd install")) {
clean($Build_cmd);
unlink "Makefile", "./Build", "./Build.bat";
print "\n$TargetModule installation failed. ",
"Continuing with $SuperModule build.\n";
return 0;
} else {
clean($Build_cmd);
unlink "Makefile", "./Build", "./Build.bat";
print "\n$TargetModule successfully installed. ",
"Continuing with $SuperModule build.\n";
return 1;
}
}
sub clean {
my ($Build_cmd) = @_;
system("$Build_cmd clean");
}