CPANPLUS
view release on metacpan or search on metacpan
lib/CPANPLUS/Dist.pm view on Meta::CPAN
sub _resolve_prereqs {
my $dist = shift;
my $self = $dist->parent;
my $cb = $self->parent;
my $conf = $cb->configure_object;
my %hash = @_;
my ($prereqs, $format, $verbose, $target, $force, $prereq_build,$tolerant);
my $tmpl = {
### XXX perhaps this should not be required, since it may not be
### packaged, just installed...
### Let it be empty as well -- that means the $modobj->install
### routine will figure it out, which is fine if we didn't have any
### very specific wishes (it will even detect the favourite
### dist_type).
format => { required => 1, store => \$format,
allow => ['',__PACKAGE__->dist_types], },
prereqs => { required => 1, default => { },
strict_type => 1, store => \$prereqs },
verbose => { default => $conf->get_conf('verbose'),
store => \$verbose },
force => { default => $conf->get_conf('force'),
store => \$force },
### make sure allow matches with $mod->install's list
target => { default => '', store => \$target,
allow => ['',qw[create ignore install]] },
prereq_build => { default => 0, store => \$prereq_build },
tolerant => { default => $conf->get_conf('allow_unknown_prereqs'),
store => \$tolerant },
};
check( $tmpl, \%hash ) or return;
### so there are no prereqs? then don't even bother
return 1 unless keys %$prereqs;
### Make sure we wound up where we started.
my $original_wd = Cwd::cwd;
### so you didn't provide an explicit target.
### maybe your config can tell us what to do.
$target ||= {
PREREQ_ASK, TARGET_INSTALL, # we'll bail out if the user says no
PREREQ_BUILD, TARGET_CREATE,
PREREQ_IGNORE, TARGET_IGNORE,
PREREQ_INSTALL, TARGET_INSTALL,
}->{ $conf->get_conf('prereqs') } || '';
### XXX BIG NASTY HACK XXX FIXME at some point.
### when installing Bundle::CPANPLUS::Dependencies, we want to
### install all packages matching 'cpanplus' to be installed last,
### as all CPANPLUS' prereqs are being installed as well, but are
### being loaded for bootstrapping purposes. This means CPANPLUS
### can find them, but for example cpanplus::dist::build won't,
### which gets messy FAST. So, here we sort our prereqs only IF
### the parent module is Bundle::CPANPLUS::Dependencies.
### Really, we would want some sort of sorted prereq mechanism,
### but Bundle:: doesn't support it, and we flatten everything
### to a hash internally. A sorted hash *might* do the trick if
### we got a transparent implementation.. that would mean we would
### just have to remove the 'sort' here, and all will be well
my @sorted_prereqs;
### use regex, could either be a module name, or a package name
if( $self->module =~ /^Bundle(::|-)CPANPLUS(::|-)Dependencies/ ) {
my (@first, @last);
for my $mod ( sort keys %$prereqs ) {
$mod =~ /CPANPLUS/
? push @last, $mod
: push @first, $mod;
}
@sorted_prereqs = (@first, @last);
} else {
@sorted_prereqs = sort keys %$prereqs;
}
### first, transfer this key/value pairing into a
### list of module objects + desired versions
my @install_me;
my $flag;
for my $mod ( @sorted_prereqs ) {
( my $version = $prereqs->{$mod} ) =~ s#[^0-9\._]+##g;
### 'perl' is a special case, there's no mod object for it
if( $mod eq PERL_CORE ) {
unless( $cb->_vcmp( sprintf('v%vd',$^V), $version ) >= 0 ) {
error(loc( "Module '%1' needs perl version '%2', but you ".
"only have version '%3' -- can not proceed",
$self->module, $version,
$cb->_perl_version( perl => $^X ) ) );
return;
}
next;
}
my $modobj = $cb->module_tree($mod);
#### XXX we ignore the version, and just assume that the latest
#### version from cpan will meet your requirements... dodgy =/
unless( $modobj ) {
# Check if it is a core module
my $sub = CPANPLUS::Module->can(
'module_is_supplied_with_perl_core' );
my $core = $sub->( $mod );
unless ( defined $core ) {
error( loc( "No such module '%1' found on CPAN", $mod ) );
$flag++ unless $tolerant;
next;
}
if ( $cb->_vcmp( $version, $core ) > 0 ) {
error(loc( "Version of core module '%1' ('%2') is too low for ".
"'%3' (needs '%4') -- carrying on but this may be a problem",
$mod, $core,
$self->module, $version ));
}
next;
( run in 2.120 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )