Alien-FFTW3
view release on metacpan or search on metacpan
lib/Alien/FFTW3.pm view on Meta::CPAN
use warnings;
# $VERSION is here for CPAN to parse -- but there is a sub below to pull the fftw library version.
our $VERSION = '0.04';
use parent 'Alien::Base';
our $pkgconfig;
BEGIN {
if ($^O eq 'MSWin32') {
# no 'which' on MS Windows but 'pkg-config' might be installed
$pkgconfig = 'pkg-config' if `pkg-config --version`;
}
else {
$pkgconfig = `which pkg-config`;
chomp $pkgconfig;
$pkgconfig = undef unless -e $pkgconfig and -x $pkgconfig;
}
die "pkg-config not found, required for Alien::FFTW3 to work" unless $pkgconfig;
}
=head2 precision
=for ref
Test presence of fftw3 libs with different precisions. Returns a hash ref
with keys set to TRUE for each library queried, or undef if none of the
queried libraries exist. If you pass in no arguments, all precisions
are tested.
The allowed precisions are 'f','d','l', and 'q'.
You can pass them in as an array ref or as a single packed string.
=cut
our $_valid_precisions = {f=>['f'],d=>[''],l=>['l'],q=>['q']};
our $_our_precisions = join(", ",sort keys %$_valid_precisions);
sub precision {
shift if(($_[0]//"") =~ m/Alien/ ); # discard package name or blessed ref on call
my $precision = shift || 'fdlq';
unless(ref($precision)) {
$precision = [ split m//, $precision ];
}
unless(ref($precision) eq 'ARRAY') {
die "precision: requires a scalar or an ARRAY ref";
}
my $out = {};
for my $p(@$precision) {
die "precision: $p is not a valid fftw precision ($_our_precisions allowed)"
unless( $_valid_precisions->{$p} );
my $pp = $_valid_precisions->{$p}->[0];
my $s;
chomp( $s = `$pkgconfig --silence-errors --libs fftw3$pp` );
if($s) {
$out->{$p} = "fftw3$pp";
}
}
if(keys %$out) {
return $out;
} else {
return undef;
}
}
=head2 cflags
=for ref
Returns the cflags compiler flags required for the specified precision, or for all of 'em.
=cut
sub cflags {
shift if(($_[0]//"") =~ m/Alien/ ); # discard package name or blessed ref on call
my $precision = shift;
my $h = precision($precision);
die "No fftw package found!" unless($h);
my $pkgs = join(" ",sort values %$h);
my $s = `$pkgconfig --cflags $pkgs`;
chomp $s;
return $s;
}
=head2 libs
=for ref
Returns the libs linker flags required for the specified precision, or for all of 'em.
=cut
sub libs {
shift if(($_[0]//"") =~ m/Alien/); # discard package name on call
my $precision = shift;
my $h =precision($precision);
die "No fftw package found!" unless($h);
my $pkgs = join(" ",sort values %$h);
my $s = `$pkgconfig --libs $pkgs`;
chomp $s;
return $s;
}
##############################
# version checker
( run in 0.652 second using v1.01-cache-2.11-cpan-acebb50784d )