Perl6-Build

 view release on metacpan or  search on metacpan

lib/Perl6/Build/CLI.pm  view on Meta::CPAN

package Perl6::Build::CLI;
use strict;
use warnings;

use 5.10.1; # rakudo's Configure.pl requires 5.10.1. We follow that.
use Cwd ();
use File::Path ();
use File::Spec;
use File::Temp ();
use Getopt::Long ();
use Perl6::Build::Builder::RakudoStar;
use Perl6::Build::Builder::Source;
use Perl6::Build::Builder;
use Perl6::Build::Helper;
use Perl6::Build;
use Pod::Usage ();

sub new {
    my ($class, %args) = @_;
    my $workdir = $args{workdir} || File::Spec->catdir($ENV{HOME}, ".perl6-build");
    my $id = time . ".$$";
    bless { workdir => $workdir, id => $id }, $class;
}

sub cache_dir {
    my $self = shift;
    File::Spec->catdir($self->{workdir}, "cache");
}

sub git_reference_dir {
    my $self = shift;
    File::Spec->catdir($self->{workdir}, "git_reference");
}

sub build_base_dir {
    my $self = shift;
    File::Spec->catdir($self->{workdir}, "build");
}

sub build_dir {
    my $self = shift;
    File::Spec->catdir($self->build_base_dir, $self->{id});
}

sub log_file {
    my $self = shift;
    File::Spec->catfile($self->build_dir, "build.log");
}

sub run {
    my ($self, @argv) = @_;

    my @configure_option;
    my ($index) = grep { $argv[$_] eq '--' } 0..$#argv;
    if (defined $index) {
        (undef, @configure_option) = splice @argv, $index, @argv - $index;
    }

    local @ARGV = @argv;
    Getopt::Long::Configure(qw(default no_auto_abbrev no_ignore_case));
    Getopt::Long::GetOptions
        "l|list"      => \my $list,
        "L|list-all"  => \my $list_all,
        "h|help"      => \my $show_help,
        "version"     => \my $show_version,
        "jvm"         => \my $jvm,
        "w|workdir=s" => \$self->{workdir},
        'ensure-latest-version=s' => \my $ensure_latest_version,
    or exit 1;

    if (@configure_option and $jvm) {
        die "--jvm option may conflict with configure options after --; "
          . "please specify either.\n";
    }

    if ($show_help) {
        $self->show_help;
        return 1;
    }
    if ($show_version) {
        say Perl6::Build->VERSION;
        return 0;
    }
    if (my $base_dir = $ensure_latest_version) {
        my $ok = $self->ensure_latest_version($base_dir);
        return $ok ? 0 : 1;
    }

    if ($list || $list_all) {
        my $msg = $list_all ? "" : " (latest 20 versions)";
        print "Available versions$msg:\n";
        my @star = Perl6::Build::Builder::RakudoStar->available;
        my @source = Perl6::Build::Builder::Source->available;
        if ($list_all) {
            print " $_\n" for @star, @source;
        } else {
            print " $_\n" for @star[0..9], @source[0..9];
        }
        return 0;
    }

    my ($version, $prefix) = @ARGV;
    die "Invalid arguments; try `perl6-build --help` for help.\n" if !$prefix;
    if (!File::Spec->file_name_is_absolute($prefix)) {
        $prefix = File::Spec->canonpath(File::Spec->catdir(Cwd::cwd(), $prefix));
    }

    File::Path::mkpath($_) for grep !-d, $self->cache_dir, $self->build_dir, $self->git_reference_dir;

    if ($version =~ /^rakudo-star-/) {
        my $star = Perl6::Build::Builder::RakudoStar->new(
            backend => $jvm ? 'jvm' : 'moar',
            version => $version,
            cache_dir => $self->cache_dir,
            build_dir => $self->build_dir,
            log_file  => $self->log_file,
        );
        $star->fetch;
        $star->build($prefix, @configure_option);



( run in 0.586 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )