Alien-FFTW3
view release on metacpan or search on metacpan
lib/Alien/FFTW3.pm view on Meta::CPAN
logic to place it in a best guess for where system libraries "should"
go on your system: we examine the path searched by pkg-config and
place the fftw library in a suitable spot that can be located.
=head1 SEE ALSO
Alien::Base, PDL::FFTW3, http://fftw.org
=head1 METHODS
=cut
package Alien::FFTW3;
use strict;
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 {
( run in 0.879 second using v1.01-cache-2.11-cpan-9bca49b1385 )