Alien-Base-ModuleBuild
view release on metacpan or search on metacpan
lib/Alien/Base/ModuleBuild.pm view on Meta::CPAN
$self->config_data( install_type => 'system' );
$self->config_data( version => $version );
my %system_provides;
$system_provides{Cflags} = $self->alien_provides_cflags
if defined $self->alien_provides_cflags;
$system_provides{Libs} = $self->alien_provides_libs
if defined $self->alien_provides_libs;
$self->config_data( system_provides => \%system_provides );
return;
}
if ($self->config_data('ForceSystem')) {
die "Requested system install, but system package not detected."
}
my @repos = $self->alien_create_repositories;
my $cabinet = Alien::Base::ModuleBuild::Cabinet->new;
foreach my $repo (@repos) {
$cabinet->add_files( $repo->probe );
}
$cabinet->sort_files;
{
local $CWD = $self->alien_temp_dir;
my $file = $cabinet->files->[0];
unless (defined $file) {
die "no files found in repository";
}
$version = $file->version;
$self->config_data( alien_version => $version ); # Temporary setting, may be overridden later
print "Downloading File: " . $file->filename . " ... ";
my $filename = $file->get;
croak "Error downloading file" unless $filename;
print "Done\n";
my $extract_path = _catdir(File::Spec->rel2abs($self->alien_extract_archive($filename)));
$self->config_data( working_directory => $extract_path );
$CWD = $extract_path;
if ( $file->platform eq 'src' ) {
print "Building library ... ";
unless ($self->alien_do_commands('build')) {
print "Failed\n";
croak "Build not completed";
}
}
print "Done\n";
}
$self->config_data( install_type => 'share' );
$self->config_data( original_prefix => $self->alien_library_destination );
my $pc = $self->alien_load_pkgconfig;
my $pc_version = (
$pc->{$self->alien_name} || $pc->{_manual}
)->keyword('Version');
unless (defined $version) {
local $CWD = $self->config_data( 'working_directory' );
$version = $self->alien_check_built_version
}
if (! $version && ! $pc_version) {
print STDERR "If you are the author of this Alien dist, you may need to provide a an\n";
print STDERR "alien_check_built_version method for your Alien::Base::ModuleBuild\n";
print STDERR "class. See:\n";
print STDERR "https://metacpan.org/pod/Alien::Base::ModuleBuild#alien_check_built_version\n";
carp "Library looks like it installed, but no version was determined";
$self->config_data( version => 0 );
return
}
if ( $version and $pc_version and versioncmp($version, $pc_version)) {
carp "Version information extracted from the file name and pkgconfig data disagree";
}
$self->config_data( version => $pc_version || $version );
# prevent building multiple times (on M::B::dispatch)
$self->notes( 'ACTION_alien_completed' => 1 );
return;
}
sub ACTION_alien_test {
my $self = shift;
print "Testing library (if applicable) ... ";
if ($self->config_data( 'install_type' ) eq 'share') {
if (defined (my $wdir = $self->config_data( 'working_directory' ))) {
local $CWD = $wdir;
$self->alien_do_commands('test') or die "Failed\n";
}
}
print "Done\n";
}
sub ACTION_test {
my $self = shift;
$self->depends_on('alien_test');
$self->SUPER::ACTION_test;
}
sub ACTION_install {
my $self = shift;
$self->SUPER::ACTION_install;
if($self->alien_stage_install) {
$self->alien_relocation_fixup;
} else {
$self->depends_on('alien_install');
}
}
lib/Alien/Base/ModuleBuild.pm view on Meta::CPAN
push @lib_files, $file;
push @lib_paths, $path;
}
}
@lib_files = uniq @lib_files;
@lib_files = sort @lib_files;
@lib_paths = uniq @lib_paths;
@inc_paths = uniq @inc_paths;
return { lib => \@lib_paths, inc => \@inc_paths, lib_files => \@lib_files };
}
sub alien_refresh_packlist {
my $self = shift;
my $dir = shift || croak "Must specify a directory to include in packlist";
return unless $self->create_packlist;
my %installed_args;
$installed_args{extra_libs} = [map { File::Spec->catdir($self->destdir, $_) } @INC]
if defined $self->destdir;
my $inst = ExtUtils::Installed->new( %installed_args );
my $packlist = $inst->packlist( $self->module_name );
print "Using " . $packlist->packlist_file . "\n";
my $changed = 0;
my $files = $self->_rscan_destdir($dir);
# This is kind of strange, but MB puts the destdir paths in the
# packfile, when arguably it should not. Usually you will want
# to turn off packlists when you you are building an rpm anyway,
# but for the sake of maximum compat with MB we add the destdir
# back in after _rscan_destdir has stripped it out.
$files = [ map { File::Spec->catdir($self->destdir, $_) } @$files ]
if defined $self->destdir;
for my $file (@$files) {
next if $packlist->{$file};
print "Adding $file to packlist\n";
$changed++;
$packlist->{$file}++;
};
$packlist->write if $changed;
}
sub alien_relocation_fixup {
my($self) = @_;
# so far relocation fixup is only needed on OS X
return unless $^O eq 'darwin';
my $dist_name = $self->dist_name;
my $share = _catdir( $self->install_destination($self->alien_arch ? 'arch' : 'lib'), qw/auto share dist/, $dist_name );
require File::Find;
File::Find::find(sub {
if(/\.dylib$/)
{
# save the original mode and make it writable
my $mode = (stat $File::Find::name)[2];
chmod 0755, $File::Find::name unless -w $File::Find::name;
my @cmd = (
'install_name_tool',
'-id' => $File::Find::name,
$File::Find::name,
);
print "+ @cmd\n";
system @cmd;
# restore the original permission mode
chmod $mode, $File::Find::name;
}
}, $share);
}
sub _rscan_destdir {
my($self, $dir, $pattern) = @_;
my $destdir = $self->destdir;
$dir = _catdir($destdir, $dir) if defined $destdir;
my $files = $self->rscan_dir($dir, $pattern);
$files = [ map { my $dir = $_; $dir =~ s/^$destdir//; $dir } @$files ] if defined $destdir;
$files;
}
# File::Spec uses \ as the file separator on MSWin32, which makes sense
# since it is the default "native" file separator, but in practice / is
# supported everywhere that matters and is significantly less problematic
# in a number of common use cases (e.g. shell quoting). This is a short
# cut _catdir for this rather common pattern where you want catdir with
# / as the file separator on Windows.
sub _catdir {
my $dir = File::Spec->catdir(@_);
$dir =~ s{\\}{/}g if $^O eq 'MSWin32';
$dir;
}
sub alien_install_network {
defined $ENV{ALIEN_INSTALL_NETWORK} ? !!$ENV{ALIEN_INSTALL_NETWORK} : 1;
}
sub alien_download_rule {
if(defined $ENV{ALIEN_DOWNLOAD_RULE}) {
return 'warn' if $ENV{ALIEN_DOWNLOAD_RULE} eq 'default';
return $ENV{ALIEN_DOWNLOAD_RULE} if $ENV{ALIEN_DOWNLOAD_RULE} =~ /^(warn|digest|encrypt|digest_or_encrypt|digest_and_encrypt)$/;
warn "unknown ALIEN_DOWNLOAD_RULE \"ALIEN_DOWNLOAD_RULE\", using \"warn\" instead";
}
return 'warn';
}
1;
=pod
=encoding UTF-8
=head1 NAME
Alien::Base::ModuleBuild - A Module::Build subclass for building Alien:: modules and their libraries
=head1 VERSION
version 1.17
=head1 SYNOPSIS
In your Build.PL:
use Alien::Base::ModuleBuild;
( run in 0.701 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )