The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package F77Conf;
# a minimal hardcoded config designed for win32
# using f2c
use Config;

BEGIN { $F77Conf::done = 0 }

print "Config   ",__PACKAGE__->config(),"\n";
print "Compiler ",__PACKAGE__->compiler(),"\n";
print "Runtime  ",__PACKAGE__->runtime(),"\n";
print "Trail_   ",__PACKAGE__->trail_() ? "yes" : "no", "\n";
print "Cflags   ",__PACKAGE__->cflags(),"\n";

$F77Conf::libs = "C:\\temp\\f2c\\libf77.lib C:\\temp\\f2c\\libi77.lib";
# include path and f2c location are buried in the __DATA__ section

__PACKAGE__->mkcompiler;

sub config {
  return 'win32_f2c';
}

# change location of f2c libs to match your installation
sub runtime {
  $F77Conf::libs;
}

sub trail_ {
  return 1;
}

sub compiler {
  $myf77 = &mkcompiler;
  return "$Config{perl} $myf77";
}

sub cflags {
  return '';
}

sub testcompiler {
  my ($this) = @_;
  return 1;  # for the moment bypass this
    my $file = "/tmp/testf77$$";
    my $ret;
    open(OUT,">$file.f");
    print OUT "      print *, 'Hello World'\n";
    print OUT "      end\n";
    close(OUT);
    print "Compiling the test Fortran program...\n";
    my ($compiler,$cflags) = ($this->compiler,$this->cflags);
    system "$compiler $cflags $file.f -o ${file}_exe";
    print "Executing the test program...\n";
    if (`${file}_exe` ne " Hello World\n") {
       print "Test of Fortran Compiler FAILED. \n";
       print "Do not know how to compile Fortran on your system\n";
       $ret=0;
    }
    else{
       print "Congratulations you seem to have a working f77!\n";
       $ret=1;
    }
    unlink("${file}_exe"); unlink("$file.f"); unlink("$file.o") if -e "$file.o";
    return $ret;
}

sub tmpdir {
  use Cwd;
  my $dir = exists $ENV{TEMP} ? $ENV{TEMP} : exists $ENV{TMP} ? $ENV{TMP} :
    cwd; # current working directory as last resort
}

sub mkcompiler {
  my $myf77 = tmpdir().'\myf77';
  unless ($F77Conf::done) {
    open my $fi, ">$myf77" or
      die "couldn't open $myf77";
    use Config;
    
    print $fi "$Config{startperl}\n";
    print $fi join('',<DATA>);
    close $fi;
  }
  $F77Conf::done = 1;
  return $myf77;
}

1;


__DATA__

use Getopt::Std;
use File::Basename;

getopts('co:');
$cflags = '/nologo /MD /W3 /GX /O2 /D "WIN32" /D "_CONSOLE" /D "_MBCS" /YX /c /I"c:/temp/f2c"'; # this must include the include path for your f2c.h !

$out = '';
$out = $opt_o if defined $opt_o;

$fort = $ARGV[0];
$fort =~ s|/|\\|g;

$out =~ s|/|\\|g;
$out = "/Fo\"$out\"";

$c = $fort;
$c =~ s/\.f$/.c/;
$cdir = '-d' . dirname $c;
$obj = $fort;
$obj =~ s/\.f$/.obj/;
$obj = $opt_o if defined $opt_o;
$f2c = 'c:\\temp\\f2c\\f2c';
print "$f2c $cdir $fort\n";
system "$f2c $cdir $fort";
die "error during f2c execution, no $c\n" unless -f $c;

# now compile
print "cl.exe $out $cflags $c\n";
system "cl.exe $out $cflags $c";
die "error during cl execution\n" unless -f $obj;