Alien-Base-ModuleBuild
view release on metacpan or search on metacpan
lib/Alien/Base/ModuleBuild.pm view on Meta::CPAN
our $Verbose;
$Verbose = $ENV{ALIEN_VERBOSE} if defined $ENV{ALIEN_VERBOSE};
our $Force;
our $ForceSystem;
_compute_force();
sub _compute_force
{
undef $Force;
undef $ForceSystem;
if(defined $ENV{ALIEN_INSTALL_TYPE})
{
if($ENV{ALIEN_INSTALL_TYPE} eq 'share')
{
$Force = 1;
$ForceSystem = 0;
}
elsif($ENV{ALIEN_INSTALL_TYPE} eq 'system')
{
$Force = 0;
$ForceSystem = 1;
}
else # anything else, including 'default'
{
$Force = 0;
$ForceSystem = 0;
}
}
elsif(defined $ENV{ALIEN_FORCE})
{
$Force = $ENV{ALIEN_FORCE};
}
}
################
# Parameters #
################
## Extra parameters in A::B::MB objects (all (toplevel) should start with 'alien_')
# alien_name: name of library (pkg-config)
__PACKAGE__->add_property('alien_name');
# alien_ffi_name: name of library (the "foo" in libfoo)
__PACKAGE__->add_property('alien_ffi_name');
# alien_temp_dir: folder name for download/build
__PACKAGE__->add_property( alien_temp_dir => '_alien' );
# alien_install_type: allow to override alien install type
__PACKAGE__->add_property( alien_install_type => undef );
# alien_share_dir: folder name for the "install" of the library
# this is added (unshifted) to the @{share_dir->{dist}}
# N.B. is reset during constructor to be full folder name
__PACKAGE__->add_property('alien_share_dir' => '_share' );
# alien_selection_method: name of method for selecting file: (todo: newest, manual)
# default is specified later, when this is undef (see alien_check_installed_version)
__PACKAGE__->add_property( alien_selection_method => 'newest' );
# alien_build_commands: arrayref of commands for building
__PACKAGE__->add_property(
alien_build_commands =>
default => [ '%c --prefix=%s', 'make' ],
);
# alien_test_commands: arrayref of commands for testing the library
# note that this might be better tacked onto the build-time commands
__PACKAGE__->add_property(
alien_test_commands =>
default => [ ],
);
# alien_build_commands: arrayref of commands for installing the library
__PACKAGE__->add_property(
alien_install_commands =>
default => [ 'make install' ],
);
# alien_version_check: command to execute to check if install/version
__PACKAGE__->add_property( alien_version_check => '%{pkg_config} --modversion %n' );
# pkgconfig-esque info, author provides these by hand for now, will parse .pc file eventually
__PACKAGE__->add_property( 'alien_provides_cflags' );
__PACKAGE__->add_property( 'alien_provides_libs' );
# alien_repository: hash (or arrayref of hashes) of information about source repo on ftp
# |-- protocol: ftp or http
# |-- protocol_class: holder for class type (defaults to 'Net::FTP' or 'HTTP::Tiny')
# |-- host: ftp server for source
# |-- location: ftp folder containing source, http addr to page with links
# |-- pattern: qr regex matching acceptable files, if has capture group those are version numbers
# |-- platform: src or platform, matching os_type M::B method
# |
# |-- (non-api) connection: holder for Net::FTP-like object (needs cwd, ls, and get methods)
__PACKAGE__->add_property( 'alien_repository' => [] );
__PACKAGE__->add_property( 'alien_repository_default' => {} );
__PACKAGE__->add_property( 'alien_repository_class' => {} );
# alien_isolate_dynamic
__PACKAGE__->add_property( 'alien_isolate_dynamic' => 0 );
__PACKAGE__->add_property( 'alien_autoconf_with_pic' => 1 );
# alien_inline_auto_include
__PACKAGE__->add_property( 'alien_inline_auto_include' => [] );
# use MSYS even if %c isn't found
__PACKAGE__->add_property( 'alien_msys' => 0 );
# Alien packages that provide build dependencies
__PACKAGE__->add_property( 'alien_bin_requires' => {} );
# Do a staged install to blib instead of trying to install to the final location.
__PACKAGE__->add_property( 'alien_stage_install' => 1 );
# Should modules be installed into arch specific directory?
# Most alien dists will have arch specific files in their share so it makes sense to install
# the module in the arch specific location. If you are alienizing something that isn't arch
# specific, like javascript source or java byte code, then you'd want to set this to 0.
lib/Alien/Base/ModuleBuild.pm view on Meta::CPAN
$self->config_data("ForceSystem" => $ForceSystem);
$self->alien_helper->{pkg_config} = 'Alien::Base::PkgConfig->pkg_config_command'
unless defined $self->alien_helper->{pkg_config};
my $ab_version = eval {
require Alien::Base;
Alien::Base->VERSION;
};
$ab_version ||= 0;
# setup additional temporary directories, and yes we have to add File::ShareDir manually
if($ab_version < 0.77) {
$self->_add_prereq( 'requires', 'File::ShareDir', '1.00' );
}
# this just gets passed from the Build.PL to the config so that it can
# be used by the auto_include method
$self->config_data( 'inline_auto_include' => $self->alien_inline_auto_include );
if($Force || !$self->alien_check_installed_version) {
if (any { /(?<!\%)\%c/ } map { ref($_) ? @{$_} : $_ } @{ $self->alien_build_commands }) {
$self->config_data( 'autoconf' => 1 );
}
if ($^O eq 'MSWin32' && ($self->config_data( 'autoconf') || $self->alien_msys)) {
$self->_add_prereq( 'build_requires', 'Alien::MSYS', '0' );
$self->config_data( 'msys' => 1 );
} else {
$self->config_data( 'msys' => 0 );
}
foreach my $tool (keys %{ $self->alien_bin_requires }) {
my $version = $self->alien_bin_requires->{$tool};
if($tool eq 'Alien::CMake' && $version < 0.07) {
$version = '0.07';
}
$self->_add_prereq( 'build_requires', $tool, $version );
}
my @repos = ref $args{alien_repository} eq 'ARRAY'
? @{ $args{alien_repository} }
: ( $args{alien_repository} );
foreach my $repo (@repos)
{
next unless defined $repo;
if(($repo->{protocol}||'') eq 'https')
{
$self->_add_prereq( 'build_requires', 'IO::Socket::SSL', '1.56' );
$self->_add_prereq( 'build_requires', 'Net::SSLeay', '1.49' );
}
}
}
# force newest for all automated testing
#TODO (this probably should be checked for "input needed" rather than blindly assigned)
if ($ENV{AUTOMATED_TESTING}) {
$self->alien_selection_method('newest');
}
$self->config_data( 'finished_installing' => 0 );
if(any { /(?<!\%)\%p/ } map { ref($_) ? @{$_} : $_ } @{ $self->alien_build_commands }) {
carp "%p is deprecated, See https://metacpan.org/pod/Alien::Base::ModuleBuild::API#p";
}
return $self;
}
sub alien_init_temp_dir {
my $self = shift;
my $temp_dir = $self->alien_temp_dir;
my $share_dir = $self->alien_share_dir;
# make sure we are in base_dir
local $CWD = $self->base_dir;
unless ( -d $temp_dir ) {
mkdir $temp_dir or croak "Could not create temporary directory $temp_dir";
}
$self->add_to_cleanup( $temp_dir );
unless ( -d $share_dir ) {
mkdir $share_dir or croak "Could not create temporary directory $share_dir";
}
$self->add_to_cleanup( $share_dir );
# add share dir to share dir list
my $share_dirs = $self->share_dir;
unshift @{ $share_dirs->{dist} }, $share_dir;
$self->share_dir( $share_dirs );
{
local $CWD = $share_dir;
open my $fh, '>', 'README' or die "Could not open README for writing (in directory $share_dir)\n";
print $fh <<'END';
This README file is autogenerated by Alien::Base.
Currently it exists for testing purposes, but it might eventually contain information about the file(s) installed.
END
}
}
####################
# ACTION methods #
####################
sub ACTION_alien_fakebuild {
my $self = shift;
# needed for any helpers provided by alien_bin_requires
$self->_alien_bin_require($_) for keys %{ $self->alien_bin_requires };
print "# Build\n";
foreach my $cmd (@{ $self->alien_build_commands })
{
my @cmd = map { $self->alien_interpolate($_) } ref($cmd) ? @$cmd : ($cmd);
print "+ @cmd\n";
}
( run in 0.631 second using v1.01-cache-2.11-cpan-acebb50784d )