App-MechaCPAN
view release on metacpan or search on metacpan
lib/App/MechaCPAN/Perl.pm view on Meta::CPAN
run "$perl_bin", @check;
return 1;
}
sub build_reusable
{
my $version = shift;
my $perl_dir = shift;
my $src_tz = shift;
my $opts = shift;
# Determine what to compress it with
my $compress
= eval { run(qw/xz --version/); 'xz' }
// eval { run(qw/bzip2 --version/); 'bzip2' }
// eval { run(qw/gzip --version/); 'gzip' }
// die 'Cannot find anything to compress with';
# Make sure we can call tar before we get too far
die 'Cannot find tar to create an archive'
if !( eval { run(qw/tar --version/) } );
$perl_dir = humane_tmpdir("perl-$version");
my $verstr = "perl $version";
info $verstr, "Fetching $verstr";
my $src_dir = inflate_archive($src_tz);
my @src_dirs = File::Spec->splitdir("$src_dir");
chdir $src_dir;
if ( !-e 'Configure' )
{
my @files = glob('*');
if ( @files != 1 )
{
die qq{Could not find perl to configure.}
. qq{Inflated to "$src_dir" extracted from $src_tz};
}
chdir $files[0];
}
my $local_dir = File::Spec->catdir(qw/... .. .. lib perl5/);
my $lib_dir = File::Spec->catdir(qw/... .. .. .. lib/);
my @otherlib = (
!$opts->{'skip-local'} ? $local_dir : (),
!$opts->{'skip-lib'} ? $lib_dir : (),
);
my @config = (
_build_configure( $perl_dir, $opts ),
q[-Accflags=-DAPPLLIB_EXP=\"] . join( ":", @otherlib ) . q[\"],
q{-Dstartperl='#!/usr/bin/env\ perl'},
q{-Dperlpath='/usr/bin/env\ perl'},
qq{-Dinstallprefix=/v$version},
qq{-Dprefix=/v$version},
q{-Dman1dir=.../../man/man1},
q{-Dman3dir=.../../man/man3},
q{-Duserelocatableinc},
);
if ( $opts->{threads} )
{
push @config, '-Dusethreads';
}
local %ENV = %ENV;
delete @ENV{qw(PERL5LIB PERL5OPT)};
$ENV{DESTDIR} = $perl_dir;
# Make sure no tomfoolery is happening with perl, like plenv shims
$ENV{PATH} = $Config{binexp} . ":$ENV{PATH}";
eval {
require Devel::PatchPerl;
info $verstr, "Patching $verstr";
Devel::PatchPerl->patch_source();
};
info $verstr, "Configuring $verstr";
_run_configure(@config);
info $verstr, "Building $verstr";
_run_make();
my $skip_tests = $opts->{'skip-tests'} // $opts->{'smart-tests'};
if ( !$skip_tests )
{
info $verstr, "Testing $verstr";
_run_make('test_harness');
}
info $verstr, "Installing $verstr";
_run_make('install');
# Verify that the relocatable bits worked
local $@;
eval { _check_perl_binary("$perl_dir/v$version/bin/perl") };
my $error = $@;
if ($error)
{
die "The built relocatable binary appears broken: $error\n";
}
my $slugline = slugline("$perl_dir/v$version/bin/perl", undef, $opts->{threads});
my $orig_dir = &get_project_dir;
my $output = "$slugline.tar.$compress";
chdir $perl_dir;
run("tar cf - v$version/ | $compress > $orig_dir/$output");
success $verstr, "Created $verstr: $output";
return 0;
}
sub _handle_bin_tz
{
my $bin_tz = shift;
my $version = shift;
info "Binary URL: $bin_tz";
local $@;
my $src_dir = eval { inflate_archive($bin_tz) };
if ( !$src_dir )
{
info "Could not find binary $version: $@";
return;
}
my @src_dirs = File::Spec->splitdir("$src_dir");
chdir $src_dir;
if ( -e -x File::Spec->catdir( @src_dirs, qw/bin perl/ ) )
{
local $@;
my $success
= eval { _install_binary( File::Spec->catdir(@src_dirs), $version ) };
my $error = $@;
if ($error)
{
info "Binary in $bin_tz does not appear to be usable: $error";
}
return $success;
}
logmsg "$bin_tz did not have a perl binary";
return 1;
}
sub _install_binary
{
my $src_dir = shift;
my $version = shift;
my @src_dirs = File::Spec->splitdir("$src_dir");
my $dest_dir = &dest_dir;
my $perl_dir = File::Spec->catdir( $dest_dir, 'perl' );
info $version, "Installing $version";
( run in 0.873 second using v1.01-cache-2.11-cpan-71847e10f99 )