Affix
view release on metacpan or search on metacpan
lib/Affix/Platform/Unix.pm view on Meta::CPAN
package Affix::Platform::Unix v0.12.0 {
use v5.40;
use Path::Tiny qw[path];
use Config qw[%Config];
use DynaLoader;
use parent 'Exporter';
our @EXPORT_OK = qw[find_library];
our %EXPORT_TAGS = ( all => \@EXPORT_OK );
my $so = $Config{so};
sub is_elf ($filename) {
my $elf_header = "\x7fELF"; # ELF header in binary format
open( my $fh, '<:raw', $filename ) or return 0; # Open in binary mode
sysread( $fh, my $header, 4 ) || return;
close($fh);
return $header eq $elf_header;
}
sub _findLib_ldconfig ($name) {
# Get the first part of the architecture name (e.g., "x86_64" from "x86_64-linux-gnu")
my ($arch_part) = split /-/, $Config{archname};
my $architecture = {
'x86_64' => 'x86_64',
'amd64' => 'x86_64', # A common alias
'aarch64' => 'ARM64',
'ppc64' => 'PPC64',
'sparc64' => 'SPARC64',
'ia64' => 'Itanium',
}->{$arch_part};
$architecture // die "Unsupported architecture for ldconfig lookup: $arch_part";
# Use the portable $Config{longsize} which gives the size of a C long in bytes.
my $lookup_key = $architecture . ( $Config{longsize} == 8 ? '-64' : '-32' );
my $machine = {
'x86_64-64' => 'libc6,x86-64',
'PPC64-64' => 'libc6,64bit',
'SPARC64-64' => 'libc6,64bit',
'Itanium-64' => 'libc6,IA-64',
'ARM64-64' => 'libc6,AArch64'
}->{$lookup_key};
# If this specific architecture/bitness combination isn't in our list, return nothing.
$machine // return;
# XXX assuming GLIBC's ldconfig (with option -p)
grep { is_elf($_) } map {
/^(?:lib)?${name}(?:\-\S+)?\.\s*.*\(${machine}.*\)\s+=>\s+(.+)$/;
defined $1 ? path($1)->realpath : ()
} split /\R\s*/, `export LC_ALL 'C'; export LANG 'C'; /sbin/ldconfig -p 2>&1`;
}
sub _findLib_dynaloader($name) {
DynaLoader::dl_findfile( '-l' . $name );
}
sub _findLib_ld($name) {
`export LC_ALL 'C'; export LANG 'C'; ld -t -o /dev/null -l$name 2>&1`;
}
sub _findLib_gcc($name) {
$name =~ s[^lib][];
CORE::state $compiler;
$compiler //= sub {
my $ret = `which gcc 2>&1`;
chomp($ret);
( run in 0.687 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )