diff --git a/cpanfile b/cpanfile index 574150bca..76f8e9223 100644 --- a/cpanfile +++ b/cpanfile @@ -14,12 +14,14 @@ on develop => sub { requires 'CPAN::Meta::YAML'; requires 'Digest::SHA'; requires 'Exporter', '5.63'; + requires 'File::Copy::Recursive'; requires 'File::Temp'; requires 'File::pushd'; requires 'Getopt::Long'; requires 'HTTP::Tiny'; requires 'JSON'; requires 'JSON::PP'; + requires 'LWP::Protocol::https'; requires 'LWP::Simple'; requires 'LWP::UserAgent', '5.802'; requires 'Module::Install'; diff --git a/lib/App/cpanminus/script.pm b/lib/App/cpanminus/script.pm index 5eb09919a..315d33978 100644 --- a/lib/App/cpanminus/script.pm +++ b/lib/App/cpanminus/script.pm @@ -67,6 +67,7 @@ sub new { interactive => undef, log => undef, mirrors => [], + mirrors_default => [ 'http://www.cpan.org' ], mirror_only => undef, mirror_index => undef, cpanmetadb => "http://cpanmetadb.plackperl.org/v1.0/", @@ -91,6 +92,7 @@ sub new { installed_dists => 0, install_types => ['requires'], with_develop => 0, + with_configure => undef, showdeps => 0, scandeps => 0, scandeps_tree => [], @@ -216,6 +218,8 @@ sub parse_options { 'test-timeout=i' => \$self->{test_timeout}, 'with-develop' => \$self->{with_develop}, 'without-develop' => sub { $self->{with_develop} = 0 }, + 'with-configure' => \$self->{with_configure}, + 'without-configure' => sub { $self->{with_configure} = 0 }, 'with-feature=s' => sub { $self->{features}{$_[1]} = 1 }, 'without-feature=s' => sub { $self->{features}{$_[1]} = 0 }, 'with-all-features' => sub { $self->{features}{__all} = 1 }, @@ -1879,6 +1883,9 @@ sub cpan_dist { my $fn = substr($id, 0, 1) . "/" . substr($id, 0, 2) . "/" . $id . "/" . $d->filename; my @mirrors = @{$self->{mirrors}}; + unless (@mirrors) { + @mirrors = @{$self->{mirrors_default}}; + } my @urls = map "$_/authors/id/$fn", @mirrors; $url = \@urls, @@ -2162,25 +2169,30 @@ sub build_stuff { $dist->{meta} = $dist->{cpanmeta} ? $dist->{cpanmeta}->as_struct : {}; my @config_deps; - if ($dist->{cpanmeta}) { - push @config_deps, App::cpanminus::Dependency->from_prereqs( - $dist->{cpanmeta}->effective_prereqs, ['configure'], $self->{install_types}, - ); - } - if (-e 'Build.PL' && !$self->should_use_mm($dist->{dist}) && !@config_deps) { - push @config_deps, App::cpanminus::Dependency->from_versions( - { 'Module::Build' => '0.38' }, 'configure', - ); - } + my $target = $dist->{meta}{name} ? "$dist->{meta}{name}-$dist->{meta}{version}" : $dist->{dir}; - $self->upgrade_toolchain(\@config_deps); + if ( !defined $self->{with_configure} or $depth > 0 ) { + if ($dist->{cpanmeta}) { + push @config_deps, App::cpanminus::Dependency->from_prereqs( + $dist->{cpanmeta}->effective_prereqs, ['configure'], $self->{install_types}, + ); + } + + if (-e 'Build.PL' && !$self->should_use_mm($dist->{dist}) && !@config_deps) { + push @config_deps, App::cpanminus::Dependency->from_versions( + { 'Module::Build' => '0.38' }, 'configure', + ); + } + + $self->upgrade_toolchain(\@config_deps); + + { + local $self->{notest} = 1; + $self->install_deps_bailout($target, $dist->{dir}, $depth, @config_deps) + or return; + } - my $target = $dist->{meta}{name} ? "$dist->{meta}{name}-$dist->{meta}{version}" : $dist->{dir}; - { - local $self->{notest} = 1; - $self->install_deps_bailout($target, $dist->{dir}, $depth, @config_deps) - or return; } $self->diag_progress("Configuring $target"); @@ -2198,8 +2210,9 @@ sub build_stuff { ? [qw( build runtime )] : [qw( build test runtime )]; push @{$dist->{want_phases}}, 'develop' if $self->{with_develop} && $depth == 0; + push @{$dist->{want_phases}}, 'configure' if $self->{with_configure} && $depth == 0; - my @deps = $self->find_prereqs($dist); + my @deps = $self->find_prereqs($dist, $depth); my $module_name = $self->find_module_name($configure_state) || $dist->{meta}{name}; $module_name =~ s/-/::/g; @@ -2330,6 +2343,10 @@ sub configure_this { require Module::CPANfile; $dist->{cpanfile} = eval { Module::CPANfile->load($self->{cpanfile_path}) }; $self->diag_fail($@, 1) if $@; + if ($dist->{cpanfile} && $dist->{cpanfile}->mirrors) { + unshift(@{$self->{mirrors}}, @{$dist->{cpanfile}->mirrors}); + } + return { configured => 1, configured_ok => !!$dist->{cpanfile}, @@ -2583,7 +2600,7 @@ sub effective_feature { } sub find_prereqs { - my($self, $dist) = @_; + my($self, $dist, $depth) = @_; my @deps = $self->extract_meta_prereqs($dist); @@ -2591,7 +2608,7 @@ sub find_prereqs { push @deps, $self->bundle_deps($dist); } - if ($self->{cpanfile_requirements} && !$dist->{cpanfile}) { + if ($self->{cpanfile_requirements} && $depth) { for my $dep (@deps) { $dep->merge_with($self->{cpanfile_requirements}); } @@ -2884,6 +2901,10 @@ sub file_mirror { sub has_working_lwp { my($self, $mirrors) = @_; + + unless (@{$mirrors}) { + $mirrors = $self->{mirrors_default}; + } my $https = grep /^https:/, @$mirrors; eval { require LWP::UserAgent; # no fatpack diff --git a/script/cpanm.PL b/script/cpanm.PL index 16d2ad932..59d414617 100755 --- a/script/cpanm.PL +++ b/script/cpanm.PL @@ -341,6 +341,15 @@ Defaults to false for both. B: Installs develop phase dependencies in META files or C when used with C<--installdeps>. Defaults to false. +=item --with-configure + +B: Installs configure phase dependencies in META files or +C when used with C<--installdeps>. Defaults to false. + +Default behaviour is with configure dependencies for dependencies from +MYMETA.yaml/META.yaml and without configure dependencies for dependencies +from cpanfile. + =item --with-feature, --without-feature, --with-all-features B: Specifies the feature to enable, if a module supports diff --git a/testdist/cpanfile_app/cpanfile b/testdist/cpanfile_app/cpanfile index 1662cd6fa..90f8e605a 100644 --- a/testdist/cpanfile_app/cpanfile +++ b/testdist/cpanfile_app/cpanfile @@ -1,6 +1,10 @@ requires 'Hash::MultiValue', '== 0.10'; requires 'Try::Tiny', '>= 0.07, < 0.12'; +on configure => sub { + requires 'Module::Build::Tiny'; +}; + on test => sub { requires 'Test::Warn'; }; diff --git a/testdist/local-mirror/authors/00whois.xml b/testdist/local-mirror/authors/00whois.xml new file mode 100644 index 000000000..026c4cba5 --- /dev/null +++ b/testdist/local-mirror/authors/00whois.xml @@ -0,0 +1,8 @@ + + + + ARISTOTLE + author + 1 + + diff --git a/testdist/local-mirror/authors/id/A/AR/ARISTOTLE/Hash-MultiValue-0.16.tar.gz b/testdist/local-mirror/authors/id/A/AR/ARISTOTLE/Hash-MultiValue-0.16.tar.gz new file mode 100644 index 000000000..fb520f45e Binary files /dev/null and b/testdist/local-mirror/authors/id/A/AR/ARISTOTLE/Hash-MultiValue-0.16.tar.gz differ diff --git a/testdist/local-mirror/modules/02packages.details.txt.gz b/testdist/local-mirror/modules/02packages.details.txt.gz new file mode 100644 index 000000000..947ba7700 Binary files /dev/null and b/testdist/local-mirror/modules/02packages.details.txt.gz differ diff --git a/xt/cpanfile.t b/xt/cpanfile.t index d8a35d9c5..9f46acef1 100644 --- a/xt/cpanfile.t +++ b/xt/cpanfile.t @@ -3,15 +3,43 @@ use Test::More; use JSON; use Config; use xt::Run; +use File::Temp; +use File::Copy::Recursive qw(dircopy); + +{ + my $dir = File::Temp::tempdir; + + dircopy("testdist/local-mirror","$dir/local-mirror"); + + open my $cpanfile, ">", "$dir/cpanfile"; + print $cpanfile <