# Slatec module
use ExtUtils::MakeMaker;
use Config;
PDL::Core::Dev->import();
# This mess sorts out the Fortran availability - KGB.
# Depends on ExtUtils::F77
BEGIN {
$donot = 0;
$msg = ""; $forcebuild=0;
if (defined $PDL::Config{WITH_SLATEC} && $PDL::Config{WITH_SLATEC}==0) {
$msg = "\n Will skip build of PDL::Slatec on this system \n";
goto skip;
}
if (defined $PDL::Config{WITH_SLATEC} && $PDL::Config{WITH_SLATEC}==1) {
print "\n Will forcibly try and build PDL::Slatec on this system \n\n";
$forcebuild=1;
}
if (exists $PDL::Config{F77CONF} && -f $PDL::Config{F77CONF}) {
print "loading F77 configuration from $PDL::Config{F77CONF}...\n";
eval "require '$PDL::Config{F77CONF}'";
if ($@ ne "") {
$msg = "\n".$@.
"\n\tF77CONF file not loaded. Ought not build PDL::Slatec\n" ;
goto skip unless $forcebuild;
}
$f77 = 'F77Conf';
} else {
eval "use ExtUtils::F77"; # Might want "use ExtUtils::F77 qw(generic f2c)"
if ($@ ne "") {
$msg = "\n".$@.
"\n\tExtUtils::F77 module not found. Ought not build PDL::Slatec\n" ;
goto skip unless $forcebuild;
} else {
$f77 = 'ExtUtils::F77';
print "(ExtUtils Version $ExtUtils::F77::VERSION)\n";
if ($ExtUtils::F77::VERSION < 1.03 ) {
$msg = "\n\tneed a version of ExtUtils::F77 >= 1.03. Ought not build PDL::Slatec\n" ;
goto skip unless $forcebuild;
}
} # end if ($@ ne "")
} # if (exists $PDL::Config{F77CONF}...
$compiler_available = $f77->testcompiler;
if (!$compiler_available) {
$msg = "\n No f77 compiler found. Ought to skip PDL::Slatec on this system \n";
$PDL::Config{WITH_SLATEC} = 0;
} else {
$PDL::Config{WITH_SLATEC} = 1;
}
skip:
if ($msg ne "" && $forcebuild==0) {
warn $msg . "\n";
$msg =~ s/\n//g;
write_dummy_make( $msg );
$donot = 1;
} else {
print "\n Building PDL::Slatec. Turn off WITH_SLATEC if there are any problems\n\n";
}
}
return if $donot;
@pack = (["slatec.pd",Slatec,PDL::Slatec]);
@slatecfiles = map {s/^slatec\///; s/\.f$//; $_} glob("slatec/*.f");
%hash = pdlpp_stdargs_int(@::pack);
$hash{OBJECT} .= join '', map {" slatec/$_.o "} @slatecfiles;
if($Config{cc} eq 'cl') {
# Link to MinGW's libg2c.a and libgcc.a, if appropriate
# First check that ExtUtils::F77 is available
eval{require ExtUtils::F77};
unless($@) {
my @f = ();
for(split ' ', ExtUtils::F77->runtime) {
if($_ =~ /^\-L/) {
$_ =~ s#^\-L##;
if(-e $_ . '/libg2c.a') {push @f, $_ . '/libg2c.a'}
if(-e $_ . '/libgcc.a') {push @f, $_ . '/libgcc.a'}
}
}
for(@f) {$hash{OBJECT} .= ' ' . $_}
}
}
$hash{LIBS}[0] .= $f77->runtime ;
$hash{clean}{FILES} .= " SlatecProtos.h f77_underscore" .
join '', map {" slatec/$_.o "} @slatecfiles;
# Handle multiple compilers
$f2cbased = ($f77->runtime =~ /-lf2c/);
$g2cbased = ($f77->runtime =~ /-lg2c/) unless $f2cbased;
$trail = $f77->trail_;
# no longer create the prototypes here - this is now handled
# by slatec.pd. In fact, with the current method, we no
# longer need the .P files
#
# Create flag file according to whether or not to use
# underscores (pretty hacky)
unlink("f77_underscore") if -e "f77_underscore";
if ($trail) {
open OUT, ">f77_underscore" or die "unable to write scratch file";
close OUT;
}
WriteMakefile(
%hash,
VERSION => "0.12", # This is overridden by VERSION_FROM in %hash
);
sub MY::postamble {
$mycompiler = $f77->compiler();
$mycflags = $f77->cflags();
my $orig = pdlpp_postamble_int(@::pack);
$hack_64bit = ($Config{archname}=~m/x86_64/ ?" -fPIC " : "");
$orig =~ s/:\s*slatec\.pd/: slatec.pd/;
$orig .join "\n",map {
("
slatec/$_\$(OBJ_EXT): slatec/$_.f
$mycompiler -c $hack_64bit -o slatec/$_\$(OBJ_EXT) $mycflags slatec/$_.f
" )} @slatecfiles;
}