Alien-Build
view release on metacpan or search on metacpan
lib/Alien/Base.pm view on Meta::CPAN
File::Find::find( $wanted, $self->dist_dir );
croak "No Alien::Base::PkgConfig objects are stored!"
unless keys %all;
# Run through all pkgconfig objects and ensure that their modules are loaded:
for my $pkg_obj (values %all) {
my $perl_module_name = blessed $pkg_obj;
my $pm = "$perl_module_name.pm";
$pm =~ s/::/\//g;
eval { require $pm };
}
return @all{@_} if @_;
my $manual = delete $all{_manual};
if (keys %all) {
return values %all;
} else {
return $manual;
}
}
# helper method to call Alien::MyLib::ConfigData->config(@_)
sub config {
my $class = shift;
$class = blessed $class || $class;
if(my $ab_config = $class->runtime_prop)
{
my $key = shift;
return $ab_config->{legacy}->{$key};
}
my $config = $class . '::ConfigData';
my $pm = "$class/ConfigData.pm";
$pm =~ s{::}{/}g;
eval { require $pm };
if($@)
{
warn "Cannot find either a share directory or a ConfigData module for $class.\n";
my $pm = "$class.pm";
$pm =~ s{::}{/}g;
warn "($class loaded from $INC{$pm})\n" if $INC{$pm};
warn "Please see https://metacpan.org/pod/distribution/Alien-Build/lib/Alien/Build/Manual/FAQ.pod#Cannot-find-either-a-share-directory-or-a-ConfigData-module\n";
die $@;
}
return $config->config(@_);
}
# helper method to split flags based on the OS
sub split_flags {
my ($class, $line) = @_;
if( $^O eq 'MSWin32' ) {
$class->split_flags_windows($line);
} else {
# $os eq 'Unix'
$class->split_flags_unix($line);
}
}
sub split_flags_unix {
my ($class, $line) = @_;
shellwords($line);
}
sub split_flags_windows {
# NOTE a better approach would be to write a function that understands cmd.exe metacharacters.
my ($class, $line) = @_;
# Double the backslashes so that when they are unescaped by shellwords(),
# they become a single backslash. This should be fine on Windows since
# backslashes are not used to escape metacharacters in cmd.exe.
$line =~ s,\\,\\\\,g;
shellwords($line);
}
sub dynamic_libs {
my ($class) = @_;
require FFI::CheckLib;
my @find_lib_flags;
if($class->install_type('system')) {
if(my $prop = $class->runtime_prop)
{
if($prop->{ffi_checklib}->{system})
{
push @find_lib_flags, @{ $prop->{ffi_checklib}->{system} };
}
return FFI::CheckLib::find_lib( lib => $prop->{ffi_name}, @find_lib_flags )
if defined $prop->{ffi_name};
}
my $name = $class->config('ffi_name');
unless(defined $name)
{
$name = $class->config('name');
$name = '' unless defined $name;
# strip leading lib from things like libarchive or libffi
$name =~ s/^lib//;
# strip trailing version numbers
$name =~ s/-[0-9\.]+$//;
}
my @libpath;
if(defined $class->libs)
{
foreach my $flag ($class->split_flags($class->libs))
{
if($flag =~ /^-L(.*)$/)
{
push @libpath, $1;
}
}
}
return FFI::CheckLib::find_lib(lib => $name, libpath => \@libpath, @find_lib_flags );
( run in 1.411 second using v1.01-cache-2.11-cpan-df04353d9ac )