Incomplete instructions $ pp `find lib/ -name \*pm |perl -ne '$_ =~ s/.pm$//;print "-M ". join("::",grep { ! /(?:lib|\-)/ } split("/",$_)) '` -I lib bin/jifty use warnings; use strict; use Cwd qw(cwd); use Module::CoreList; use File::Copy; use File::Path qw(mkpath); use File::Spec::Functions qw(splitdir catfile catdir); use CPAN; use CPAN::Config; use YAML; use Time::Local; @INC = grep {! /local/} @INC; # don't want cpan.pm to make decisions based locally installed modules; use vars qw/$INSTALLED $FAILED $SKIP_DEPS_FOR/; $INSTALLED = {}; $FAILED = {}; $SKIP_DEPS_FOR = { }; process_cpan(); sub process_cpan { # my $self = shift; my $path = cwd(); my @modules = @ARGV; # We install Scalar::Util first to break a scary dependency loop. mkdir "$path/.cpan"; mkdir "$path/.cpan/build"; print join "\n", @modules, "\n"; unshift @INC, '$path/lib'; $ENV{'PERL5LIB'} = "$path/lib"; $CPAN::Config->{build_dir} = "$path/.cpan/build"; $CPAN::Config->{cpan_home} = "$path/.cpan/build"; $CPAN::Config->{histfile} = "$path/.cpan/histfile;"; $CPAN::Config->{keep_source_where} = "$path/.cpan/sources"; $CPAN::Config->{prerequisites_policy} = "follow"; $CPAN::Config->{makepl_arg} = "PREFIX=$path PERL5LIB=$path/lib LIB=$path/lib INSTALLMAN1DIR=$path/man/man1 INSTALLMAN3DIR=$path/man/man3 INSTALLBIN=$path/bin INSTALLSCRIPT=$path/bin"; $CPAN::Config->{make_install_arg} =~ s/UNINST=1//; my @objs = map { CPAN::Shell->expand( 'Module', $_ ) } @modules; for my $i ( 0 .. $#objs ) { delete $objs[$i] if grep { $_->{RO}->{CPAN_FILE} eq $objs[$i]->{RO}->{CPAN_FILE} } @objs[ $i + 1 .. $#objs ]; } foreach my $mod (@modules) { #foreach my $mod ( grep { defined $_ } @objs ) { install_mod($mod); } print YAML::Dump($FAILED); } sub install_mod { my $mod_name = shift; my $version = shift; my $mod = CPAN::Shell->expand( 'Module', $mod_name ); my $first_in = Module::CoreList->first_release($mod_name => $version); if ( defined $first_in and $first_in <= 5.00803 ) { print "Skipping $mod_name. It's been core since $first_in\n"; return } if ( $mod->distribution->isa_perl ) { print "Skipping $mod_name. It's only in the core. OOPS\n";return} if ( $INSTALLED->{ $mod->cpan_file } ) { print "Skipping $mod_name. We've already installed it\n";return} if ( $FAILED->{ $mod->cpan_file } >= 3 ) { print YAML::Dump($INSTALLED); print YAML::Dump($FAILED); die "We've tried to install " . $mod->distribution->as_string . " twice"; } # Install to local unless ( $SKIP_DEPS_FOR->{$mod_name} ) { $mod->make; my $deps = $mod->distribution->prereq_pm; foreach my $dep ( keys %$deps ) { install_mod($dep => $deps->{$dep}); } } #$mod->force(); $mod->install; $INSTALLED->{ $mod->cpan_file } = 1; } 1;