# Makefile.PL for PDL::Primitive module. # Use this as a template for the Makefile.PL for # any external PDL module. use ExtUtils::MakeMaker; use File::Basename; use Config; require File::Spec; $fs = 'File::Spec'; sub cdir { return $fs->catdir(@_)} sub cfile { return $fs->catfile(@_)} sub is_sys_func { my ( $code, $libs ) = @_; trylink( '', qq{#include "$dir/mconf.h"}, $code, $libs ); } PDL::Core::Dev->import(); # Files for each routine (.c assumed) %source = qw( acosh acosh asinh asinh atanh atanh erf ndtr erfc ndtr j0 j0 j1 j1 jn jn y0 j0 y1 j1 yn yn erfi ndtri ndtri ndtri rint rint nan quiet_nan infinity infinity polyroots cpoly ); @keys = sort keys %source; %included = (); # test for library features my (@sfuncs) = qw(nan infinity); my (@ufuncs2) = qw(acosh asinh atanh erf erfc rint); my (@besufuncs) = qw(j0 j1 y0 y1); my (@besbifuncs) = qw(jn yn); my ($libs) = $^O =~ /MSWin/ ? '' : $^O =~ /cygwin/ ? getcyglib('m') : '-lm'; if ($^O eq 'solaris' or $^O eq 'sunos') { # try to guess where sunmath is my @d = split /:+/, $ENV{LD_LIBRARY_PATH}; my $ok = 0; for my $d (@d) { if (-e "$d/libsunmath.so" or -e "$d/libsunmath.a" ) { $libs = "-lsunmath $libs"; $ok = 1; last; } } if (!$ok) { print "libsunmath not found in LD_LIBRARY_PATH: looking elsewhere\n"; # get root directory of compiler; may be off of there my @dirs = (); foreach my $p ( split(':', $ENV{'PATH'} ) ) { next unless -e "$p/$Config{cc}"; push @dirs, dirname($p) . '/lib'; last; } push @dirs, '/opt/SUNWspro/lib'; # default location if all else fails for my $d ( @dirs ) { if (-e "$d/libsunmath.so") { $libs = "-R$d -L$d -lsunmath $libs"; $ok = 1; last; } if (-e "$d/libsunmath.a") { $libs = "-L$d -lsunmath $libs"; $ok = 1; last; } } } if (!$ok) { print "Couldn't find sunmath library in standard places\n\n"; print "If you can find libsunmath.a or libsunmath.so\n"; print "please let us know at pdl-porters\@jach.hawaii.edu\n\n"; } } # Test for absence of unary functions use Cwd; $mmdir = $mdir = cdir 'Basic','Math'; $mmdir =~ s/\\/\\\\/g; $dir = $fs->canonpath(cwd); $dir = cdir $dir, $mdir unless $dir =~ /$mmdir$/; my $tempd = $PDL::Config{TEMPDIR} || die "TEMPDIR not found in %PDL::Config"; foreach (@sfuncs) { $source{$_} = 'system' if is_sys_func( "$_();", $libs ); } foreach (@ufuncs2) { $source{$_} = 'system' if is_sys_func( "$_(1.);", $libs ); } # Test for absence of besfuncs foreach (@besufuncs) { if ( is_sys_func( "$_(1.);", $libs ) ) { $source{$_} = 'system'; next if $_ ne 'y0'; # Need to test for buggy glibc open (RES,"$te |"); my ($n) = ; close RES; # print "Done y0 test, received $n\n"; $n /= 0.088257; # This _should_ be the answer $n -= 1.; if ($n*$n > 1e-3) { delete $source{$_}; delete $source{'yn'}; $source{'fixy0'} = 'j0'; $source{'fixyn'} = 'yn'; @keys = sort keys %source; } } } foreach (@besbifuncs) { next if ! exists $source{$_}; # May have been deleted in buggy case $source{$_} = 'system' if is_sys_func( "$_(1,1.);", $libs ); } print "Source of functions\nSystem: "; foreach (@keys) { print " $_" if $source{$_} eq 'system'; } print "\nDistribution:"; foreach (@keys) { print " $_" if $source{$_} ne 'system'; } print "\n\n"; @pack = (["math.pd",Math,PDL::Math]); %hash = pdlpp_stdargs_int(@::pack); %seen = (); # Build object file list foreach $func (@keys) { $file = $source{$func}; next if $file eq 'system'; die "File for function $func not found\n" if $file eq ''; $hash{OBJECT} .= " $file\$(OBJ_EXT)" unless $seen{$file}++; $hash{DEFINE} .= ' -DMY_'.uc($func); } # Add support routines $hash{OBJECT} .= " const\$(OBJ_EXT) mtherr\$(OBJ_EXT) polevl\$(OBJ_EXT)"; $hash{LIBS}->[0] .= " $libs"; WriteMakefile(%hash); sub MY::postamble { pdlpp_postamble_int(@::pack); } # Add genpp rule