Alien-Base-ModuleBuild
view release on metacpan or search on metacpan
lib/Alien/Base/ModuleBuild.pm view on Meta::CPAN
my %result = $self->do_system($command, {verbose => 0});
my $version = ($result{success} && $result{stdout}) || 0;
return $version;
}
sub alien_create_repositories {
my $self = shift;
## get repository specs
my $repo_default = $self->alien_repository_default;
my $repo_specs = $self->alien_repository;
# upconvert to arrayref if a single hashref is passed
if (ref $repo_specs eq 'HASH') {
$repo_specs = [ $repo_specs ];
}
my $module_env_part = uc $self->module_name;
$module_env_part =~ s/^ALIEN:://;
$module_env_part =~ s/::/_/g;
my $env_prefix = 'ALIEN_'.$module_env_part.'_REPO_';
# Catch e.g. 'ALIEN_MYMODULE_REPO_HTTP_HOST' variables to override repo config
my @env_overrides =
grep { index($_, $env_prefix) == 0 }
keys %ENV;
unless(@$repo_specs)
{
print STDERR "If you are the author of this Alien dist, you need to provide at least\n";
print STDERR "one repository in your Build.PL. See:\n";
print STDERR "https://metacpan.org/pod/Alien::Base::ModuleBuild::API#alien_repository\n";
croak "No repositories specified.";
}
my @repos;
foreach my $repo ( @$repo_specs ) {
#merge defaults into spec
foreach my $key ( keys %$repo_default ) {
next if defined $repo->{$key};
$repo->{$key} = $repo_default->{$key};
}
$repo->{platform} = 'src' unless defined $repo->{platform};
foreach my $var (@env_overrides) {
my $var_tail = lc substr($var, length($env_prefix));
my ($var_protocol, $var_key) = split /_/, $var_tail, 2;
if ($repo->{protocol} eq $var_protocol) {
$repo->{$var_key} = $ENV{$var};
}
}
push @repos, $self->alien_repository_class($repo->{protocol} || 'default')->new( $repo );
}
# check validation, including c compiler for src type
@repos =
grep { $self->alien_validate_repo($_) }
@repos;
unless (@repos) {
croak "No valid repositories available";
}
return @repos;
}
sub alien_validate_repo {
my $self = shift;
my ($repo) = @_;
my $platform = $repo->{platform};
# return true if platform is undefined
return 1 unless defined $platform;
# if $valid is src, check for c compiler
if ($platform eq 'src') {
return !$repo->{c_compiler_required} || $self->have_c_compiler;
}
# $valid is a string (OS) to match against
return $self->os_type eq $platform;
}
sub alien_library_destination {
my $self = shift;
# send the library into the blib if running under the blib scheme
my $lib_dir =
$self->notes('alien_blib_scheme') || $self->alien_stage_install
? File::Spec->catdir( $self->base_dir, $self->blib, 'lib' )
: $self->install_destination($self->alien_arch ? 'arch' : 'lib');
my $dist_name = $self->dist_name;
my $dest = _catdir( $lib_dir, qw/auto share dist/, $dist_name );
return $dest;
}
# CPAN testers often run tests without installing modules, but rather add
# blib dirs to @INC, this is a problem, so here we try to deal with it
sub alien_detect_blib_scheme {
my $self = shift;
return 0 if $self->alien_stage_install;
return $ENV{ALIEN_BLIB} if defined $ENV{ALIEN_BLIB};
# check to see if Alien::Base::ModuleBuild is running from blib.
# if so it is likely that this is the blib scheme
(undef, my $dir, undef) = File::Spec->splitpath( __FILE__ );
my @dirs = File::Spec->splitdir($dir);
shift @dirs while @dirs && $dirs[0] ne 'blib';
return unless @dirs;
if ( $dirs[1] && $dirs[1] eq 'lib' ) {
print qq{'blib' scheme is detected. Setting ALIEN_BLIB=1. If this has been done in error, please set ALIEN_BLIB and restart build process to disambiguate.\n};
return 1;
}
carp q{'blib' scheme is suspected, but uncertain. Please set ALIEN_BLIB and restart build process to disambiguate. Setting ALIEN_BLIB=1 for now.};
return 1;
}
###################
# Build Methods #
###################
( run in 2.031 seconds using v1.01-cache-2.11-cpan-98e64b0badf )