Alien-Libarchive-Installer
view release on metacpan or search on metacpan
lib/Alien/Libarchive/Installer.pm view on Meta::CPAN
package Alien::Libarchive::Installer;
use strict;
use warnings;
use File::ShareDir qw( dist_dir );
# ABSTRACT: Installer for libarchive
our $VERSION = '0.15'; # VERSION
sub versions_available
{
require HTTP::Tiny;
my $url = "http://www.libarchive.org/downloads/";
my $response = HTTP::Tiny->new->get($url);
die sprintf("%s %s %s", $response->{status}, $response->{reason}, $url)
unless $response->{success};
my @versions;
push @versions, [$1,$2,$3] while $response->{content} =~ /libarchive-([1-9][0-9]*)\.([0-9]+)\.([0-9]+)\.tar.gz/g;
@versions = map { join '.', @$_ } sort { $a->[0] <=> $b->[0] || $a->[1] <=> $b->[1] || $a->[2] <=> $b->[2] } @versions;
}
sub fetch
{
my($class, %options) = @_;
my $dir = $options{dir} || eval { require File::Temp; File::Temp::tempdir( CLEANUP => 1 ) };
require HTTP::Tiny;
my $version = $options{version} || do {
my @versions = $class->versions_available;
die "unable to determine latest version from listing"
unless @versions > 0;
$versions[-1];
};
if(defined $ENV{ALIEN_LIBARCHIVE_INSTALL_MIRROR})
{
my $fn = File::Spec->catfile($ENV{ALIEN_LIBARCHIVE_INSTALL_MIRROR}, "libarchive-$version.tar.gz");
return wantarray ? ($fn, $version) : $fn;
}
my $url = "http://www.libarchive.org/downloads/libarchive-$version.tar.gz";
my $response = HTTP::Tiny->new->get($url);
die sprintf("%s %s %s", $response->{status}, $response->{reason}, $url)
unless $response->{success};
require File::Spec;
my $fn = File::Spec->catfile($dir, "libarchive-$version.tar.gz");
open my $fh, '>', $fn;
binmode $fh;
print $fh $response->{content};
close $fh;
wantarray ? ($fn, $version) : $fn;
}
sub build_requires
{
my %prereqs = (
'HTTP::Tiny' => 0,
'Archive::Tar' => 0,
'Alien::patch' => '0.08',
);
if($^O eq 'MSWin32')
{
require Config;
if($Config::Config{cc} =~ /cl(\.exe)?$/i)
{
$prereqs{'Alien::CMake'} = '0.05';
}
else
{
$prereqs{'Alien::MSYS'} = '0.07';
$prereqs{'PkgConfig'} = '0.07620';
}
}
\%prereqs;
}
sub system_requires
{
my %prereqs = ();
\%prereqs;
}
sub system_install
{
my($class, %options) = @_;
$options{alien} = 1 unless defined $options{alien};
$options{test} ||= 'compile';
die "test must be one of compile, ffi or both"
unless $options{test} =~ /^(compile|ffi|both)$/;
if($options{alien} && eval q{ use Alien::Libarchive 0.21; 1 })
{
my $alien = Alien::Libarchive->new;
require File::Spec;
my $dir;
my(@dlls) = map {
my($v,$d,$f) = File::Spec->splitpath($_);
$dir = [$v,File::Spec->splitdir($d)];
$f;
} $alien->dlls;
( run in 2.066 seconds using v1.01-cache-2.11-cpan-524268b4103 )