App-BundleDeps

 view release on metacpan or  search on metacpan

lib/App/BundleDeps.pm  view on Meta::CPAN

package App::BundleDeps;
use strict;
use warnings;
use local::lib ();
use Cwd ();
use ExtUtils::MakeMaker;
use File::Spec;

our $VERSION = '0.00006';

sub new {
    my ($class, @args) = @_;
    return bless { 
        extlib => File::Spec->catdir(File::Spec->curdir, 'extlib'),
        notest => 1,
        @args
    }, $class;
}

# XXX - accessors inlined for minimal setup
sub extlib {
    my $self = shift;
    $self->{extlib} = shift if @_;
    return $self->{extlib};
}

sub notest {
    my $self = shift;
    $self->{notest} = shift if @_;
    return $self->{notest};
}

sub deps {
    my $self = shift;
    $self->{deps} = shift if @_;
    return $self->{deps};
}

# given a META.yml file (if no arguments, looks for a META.yml in the current
# directory), does the proper dep bundling
sub bundle_from_meta {
    my ($self, $file) = @_;
    $file ||= 'META.yml';

    require YAML;
    require YAML::Dumper; # yeah, really, wtf
    my $meta = eval {
        YAML::LoadFile($file) 
    };
    if (! $meta || $@) {
        $@ ||= 'Unknown reason';
        die "Failed to load file $file: $@."
    }

    my $requires = $meta->{requires} || {};
    my $build_requires = $meta->{build_requires} || {};
    my %deps = (%{ $requires }, %{ $build_requires });
    $self->setup_deps(keys %deps);

    $self->bundle();
}

sub bundle_modules {
    my($self, @modules) = @_;

    $self->setup_deps(@modules);
    $self->bundle();
}

sub setup_deps {
    my ($self, @deps) = @_;

    @deps = grep { $_ ne 'perl' } sort @deps;
    $self->deps(\@deps);
}

sub bundle {
    my $self = shift;
    $self->bundle_deps();
}

sub bundle_deps {
    my $self = shift;

    $ENV{PERL5LIB} = ''; # detach existent local::lib
    local::lib->setup_local_lib_for( Cwd::abs_path( $self->extlib ) );

    # wtf: ExtUtils::MakeMaker shipped with Leopard is old
    if ($ExtUtils::MakeMaker::VERSION < 6.31) {
        $ENV{PERL_MM_OPT} =~ s/INSTALL_BASE=(.*)/$& INSTALLBASE=$1/;
    }

    # no man pages TODO: do the same with Module::Build
    $ENV{PERL_MM_OPT} .= " INSTALLMAN1DIR=none INSTALLMAN3DIR=none";
    $ENV{PERL_MM_USE_DEFAULT} = 1;

    # Remove /opt from PATH: end users won't have ports
    $ENV{PATH} = join ":", grep !/^\/opt/, split /:/, $ENV{PATH};



( run in 2.212 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )