App-MechaCPAN
view release on metacpan or search on metacpan
lib/App/MechaCPAN/Install.pm view on Meta::CPAN
local $ENV{PERL_USE_UNSAFE_INC} = $unsafe_inc;
local $ENV{PERL_MM_OPT} = "INSTALL_BASE=$dest_dir";
local $ENV{PERL_MB_OPT} = "--install_base $dest_dir";
local $ENV{PERL5LIB} = "$dest_lib";
# skip man page generation
if ( !$opts->{'install-man'} )
{
$ENV{PERL_MM_OPT}
.= " " . join( " ", "INSTALLMAN1DIR=none", "INSTALLMAN3DIR=none" );
$ENV{PERL_MB_OPT} .= " " . join(
" ", "--config installman1dir=",
"--config installsiteman1dir=", "--config installman3dir=",
"--config installsiteman3dir="
);
}
#if ( $self->{pure_perl} )
#{
# $ENV{PERL_MM_OPT} .= " PUREPERL_ONLY=1";
# $ENV{PERL_MB_OPT} .= " --pureperl-only";
#}
my $cache = { opts => $opts };
# Prepopulate all of the sources as targets
foreach my $source_key ( keys %{ $opts->{source} } )
{
my $source = $opts->{source}->{$source_key};
# If there is no source to translate to, continue
if ( !defined $source )
{
_create_target( $source_key, $cache );
next;
}
# If we can find a target, reuse it, otherwise create a new one
my $target = _find_target( $source, $cache );
if ( defined $target )
{
_alias_target( $target, $source_key, $cache );
}
else
{
$target = _create_target( $source_key, $cache );
_alias_target( $target, $source, $cache );
}
}
my @full_states = (
'Resolving' => \&_resolve,
'Configuring' => \&_meta,
'Configuring' => \&_config_prereq,
'Configuring' => \&_configure,
'Configuring' => \&_mymeta,
'Prerequisites' => \&_prereq,
'Prerequisites' => \&_test_prereq,
'Prerequisites' => \&_prereq_verify,
'Building' => \&_build,
'Testing' => \&_test,
'Installing' => \&_install,
'Installed' => \&_write_meta,
);
my @states = grep { ref $_ eq 'CODE' } @full_states;
my @state_desc = grep { ref $_ ne 'CODE' } @full_states;
@targets
= map { _create_inital_target( $_, $cache, $opts->{update} ) } @targets;
TARGET:
while ( my $target = shift @targets )
{
$target = _create_target( $target, $cache );
if ( $target->{state} eq $COMPLETE || $target->{state} eq $FAILED )
{
next;
}
chdir $orig_dir;
chdir $target->{dir}
if exists $target->{dir};
my $line = _target_line( $target, $state_desc[ $target->{state} ] );
info( $target->{key}, $line );
my $method = $states[ $target->{state} ];
{
local $@;
my $succ = eval { unshift @targets, $method->( $target, $cache ); 1; };
my $err = $@;
if ( !$succ )
{
my $line = sprintf(
'%-13s %s', 'Error',
"Could not install " . _name_target($target)
);
logmsg( $target->{key}, $err );
error( $target->{key}, $line );
_failed($target);
if ( $opts->{'stop-on-error'} )
{
croak $err;
}
next TARGET;
}
}
$target->{state}++
if $target->{state} ne $COMPLETE;
if ( $target->{state} eq scalar @states )
lib/App/MechaCPAN/Install.pm view on Meta::CPAN
sub _prereq
{
my $target = shift;
my $cache = shift;
my $meta = $target->{meta};
my @deps = map { _phase_prereq( $target, $cache, $_ ) } qw/runtime build/;
$target->{prereq} = [@deps];
return @deps, $target;
}
sub _test_prereq
{
my $target = shift;
my $cache = shift;
my $meta = $target->{meta};
my $opts = $cache->{opts};
my $skip_tests = $opts->{'skip-tests'};
if ( !$skip_tests )
{
my $skips = $opts->{'skip-tests-for'};
$skip_tests = exists $skips->{ $target->{src_name} };
if ( !$skip_tests && defined $target->{modules} )
{
foreach my $module ( %{ $target->{modules} } )
{
if ( $skips->{$module} )
{
$skip_tests = 1;
last;
}
}
}
if ( !$skip_tests && $opts->{'smart-tests'} )
{
$skip_tests = _target_prereqs_were_installed( $target, $cache );
}
}
$target->{skip_tests} = $skip_tests;
my @deps;
if ( !$skip_tests )
{
@deps = map { _phase_prereq( $target, $cache, $_ ) } qw/test/;
push @{ $target->{prereq} }, @deps;
}
return @deps, $target;
}
sub _prereq_verify
{
my $target = shift;
my $cache = shift;
my @deps = _target_prereqs( $target, $cache );
my @incomplete_deps = grep { $_->{state} ne $COMPLETE } @deps;
if ( @incomplete_deps > 0 )
{
my $line = 'Unmet dependencies for: ' . $target->{src_name};
error $target->{key}, $line;
logmsg "Missing requirements: "
. join( ", ", map { $_->{src_name} } @incomplete_deps );
croak 'Error with prerequisites';
}
return $target;
}
sub _build
{
my $target = shift;
my $cache = shift;
local $ENV{PERL_MM_USE_DEFAULT} = 0;
local $ENV{NONINTERACTIVE_TESTING} = 0;
state $make = $Config{make};
my $opts = $cache->{opts};
if ( $target->{maker} eq 'mb' )
{
run( $^X, './Build' );
return $target;
}
if ( $target->{maker} eq 'mm' )
{
run($make);
return $target;
}
croak 'Unable to determine how to install ' . $target->{meta}->name;
}
sub _test
{
my $target = shift;
my $cache = shift;
local $ENV{PERL_MM_USE_DEFAULT} = 0;
local $ENV{NONINTERACTIVE_TESTING} = 0;
state $make = $Config{make};
my $opts = $cache->{opts};
if ( $target->{skip_tests} )
{
return $target;
}
( run in 3.217 seconds using v1.01-cache-2.11-cpan-13bb782fe5a )