Alien-Build
view release on metacpan or search on metacpan
lib/Alien/Build.pm view on Meta::CPAN
sub _path { goto \&Path::Tiny::path }
sub new
{
my($class, %args) = @_;
my $self = bless {
install_prop => {
root => _path($args{root} || "_alien")->absolute->stringify,
patch => (defined $args{patch}) ? _path($args{patch})->absolute->stringify : undef,
},
runtime_prop => {
alien_build_version => $Alien::Build::VERSION || 'dev',
},
plugin_instance_prop => {},
bin_dir => [],
pkg_config_path => [],
aclocal_path => [],
}, $class;
# force computing this as soon as possible
$self->download_rule;
$self->meta->filename(
$args{filename} || do {
my(undef, $filename) = caller;
_path($filename)->absolute->stringify;
}
);
if($args{meta_prop})
{
$self->meta->prop->{$_} = $args{meta_prop}->{$_} for keys %{ $args{meta_prop} };
}
$self;
}
my $count = 0;
sub load
{
my(undef, $alienfile, @args) = @_;
my $rcfile = Path::Tiny->new($ENV{ALIEN_BUILD_RC} || '~/.alienbuild/rc.pl')->absolute;
if(-r $rcfile)
{
require Alien::Build::rc;
package Alien::Build::rc;
require $rcfile;
}
unless(-r $alienfile)
{
Carp::croak "Unable to read alienfile: $alienfile";
}
my $file = _path $alienfile;
my $name = $file->parent->basename;
$name =~ s/^alien-//i;
$name =~ s/[^a-z]//g;
$name = 'x' if $name eq '';
$name = ucfirst $name;
my $class = "Alien::Build::Auto::$name@{[ $count++ ]}";
{ no strict 'refs';
@{ "${class}::ISA" } = ('Alien::Build');
*{ "${class}::Alienfile::meta" } = sub {
$class =~ s{::Alienfile$}{};
$class->meta;
}};
my @preload = qw( Core::Setup Core::Download Core::FFI Core::Override Core::CleanInstall );
push @preload, @Alien::Build::rc::PRELOAD;
push @preload, split /;/, $ENV{ALIEN_BUILD_PRELOAD}
if defined $ENV{ALIEN_BUILD_PRELOAD};
my @postload = qw( Core::Legacy Core::Gather Core::Tail );
push @postload, @Alien::Build::rc::POSTLOAD;
push @postload, split /;/, $ENV{ALIEN_BUILD_POSTLOAD}
if defined $ENV{ALIEN_BUILD_POSTLOAD};
my $self = $class->new(
filename => $file->absolute->stringify,
@args,
);
require alienfile;
foreach my $preload (@preload)
{
ref $preload eq 'CODE' ? $preload->($self->meta) : $self->meta->apply_plugin($preload);
}
# TODO: do this without a string eval ?
## no critic
eval '# line '. __LINE__ . ' "' . __FILE__ . qq("\n) . qq{
package ${class}::Alienfile;
do '@{[ $file->absolute->stringify ]}';
die \$\@ if \$\@;
};
die $@ if $@;
## use critic
foreach my $postload (@postload)
{
ref $postload eq 'CODE' ? $postload->($self->meta) : $self->meta->apply_plugin($postload);
}
$self->{args} = \@args;
unless(defined $self->meta->prop->{arch})
{
$self->meta->prop->{arch} = 1;
}
unless(defined $self->meta->prop->{network})
{
$self->meta->prop->{network} = 1;
( run in 0.453 second using v1.01-cache-2.11-cpan-524268b4103 )