The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

use strict;
use warnings;
use lib qw(inc);
use File::Spec;
use Module::Build;

# A makefile can be generated for either the C or Fortran version of
# SLALIB. It does not yet determine the C/Fortran-ness of your library
# automatically.

# Change this flag to control the behaviour of the build.
# This controls whether we are using the Fortran version (1),
# the C version (0) or the Starlink Fortran version (-1)
my $use_fortran = -1;

# Default location for the library. This is used if we fail to find
# starlink fortran (in which case it is assumed to be a C library)
# or use_fortran is set to 0 or 1

# Can be set externally with the SLA_ROOT environment variable
my $sla_root = "/usr/local/lib";

if (exists $ENV{SLA_ROOT} && defined $ENV{SLA_ROOT} && -d $ENV{SLA_ROOT}) {
  $sla_root = $ENV{SLA_ROOT};
}

my $sla_lib = "-L$sla_root/lib -lsla ";

# Same for include files [only relevant for C version] [use -I]
my $sla_inc = "-I$sla_root/include";

# Check valid range for the fortran switch
if ($use_fortran != 0 && $use_fortran != -1 && $use_fortran != 1) {
  print "use_fortran variable set to strange value. Assuming -1 [Starlink]\n";
}

# Starlink
if ($use_fortran == -1) {
  use vars qw/ %StarConfig /;

  # We first see if we can find Starlink::Config
  my $has_star_conf = eval "use Starlink::Config; 1;";

  if (!$has_star_conf) {
    # Look for Starlink via the environment else use /star
    my $root;
    for my $testdir ($ENV{STARLINK_DIR}, "/star", "/stardev") {
      if (defined $testdir && -d $testdir) {
        $root = $testdir;
        last;
      }
    }

    if (defined $root) {
      %StarConfig = (
                     Star_Inc => File::Spec->catdir($root, "include"),
                     Star_Lib => File::Spec->catdir($root,"lib"),
                     Star_Bin => File::Spec->catdir($root, "bin"),
                    );
    } else {
      print "Unable to locate Starlink system. Switching to C library.\n";
      $use_fortran = 0;
    }
  } else {
    print "Found Starlink configuration. Using $StarConfig{Star}\n";
  }

  # Work out the library full path
  my $lib = File::Spec->catfile($StarConfig{Star_Lib}, "libsla.a" );

  if (-e $lib) {
    print "Located Starlink SLALIB library in $StarConfig{Star_Lib}\n";

    # Sometimes we have to use CNF
    my $slalibs = qx/ sla_link /;
    $slalibs = "-lsla" unless defined $slalibs;

    $sla_lib = " -L$StarConfig{Star_Lib} $slalibs ";

    # See if we can find the version
    eval { require Starlink::Versions; };
    if (!$@) {
      my $ver = Starlink::Versions::starversion_string('sla');
      $ver = ( defined $ver ? $ver : "****** undefined ******" );
      print "It seems to be SLA version $ver\n";
    }

  } else {
    # Assume the C fallback
    $use_fortran = 0;
  }


}



# The #defines, libraries and any additional prerequisites
my (@defines, $libs, %build_prereqs);
if ($use_fortran) {
  print "Attempting to build against a Fortran SLALIB: $sla_lib\n";

  # Must switch modes
  push(@defines, "-DUSE_FORTRAN");

  # Must include fortran libraries but we do not want to force
  # ExtUtils::F77 on an unsuspecting C user
  $build_prereqs{'ExtUtils::F77'} = 0;

  # use eval here since we are listing ExtUtils as a prerequisite
  # anyway and so if this does not work we'll still get a message
  # later
  my $flibs = '';
  eval { require ExtUtils::F77; ExtUtils::F77->import };
  if ($@) {
    print "Error determining Fortran library requirements\n";
  } else {
    $flibs = ExtUtils::F77->runtime;
    push(@defines, "-DHAS_UNDERSCORE")
      if ExtUtils::F77->trail_;
  }

  $libs = "$sla_lib $flibs";

} else {
  print "Attempting to build against a C SLALIB library: $sla_lib\n";

  use Devel::CheckLib;
  unless (check_lib(LIBS => $sla_lib,INC=>$sla_inc)) {
    print "You need either Fortan or C version of slalib. See README\n";
    exit 0;
  }

  # no special defines for the C version

  # Just need the math library
  $libs = "$sla_lib -lm";
}

my $file = File::Spec->catfile( "lib", "Astro", "SLA.pm" );

my $build = Module::Build->new
  (
   module_name => "Astro::SLA",
   abstract_from => $file,
   license => "gpl",
   author => [
              'Tim Jenness <tjenness@cpan.org>',
             ],
   version_from => $file,
   meta_merge => {
               resources =>  {
                              repository => "git://github.com/timj/perl-Astro-SLA.git",
                              homepage => "http://github.com/timj/perl-Astro-SLA/tree/master",
                             },
                },
   script_files => [ qw/
                         stime
                       /],
   requires => {
                "Pod::Usage" => 0,
                "Getopt::Long" => 0,
               },
   build_requires => {
                      "Test::More" => 0,
                      "Test::Number::Delta" => 1.0,
                      %build_prereqs,
                     },
   configure_requires => {
                          "Module::Build" => 0.30,
                          %build_prereqs,
                         },
   c_source => "src",  # Only one option so use single string
   extra_compiler_flags => [$sla_inc, @defines],
   extra_linker_flags => $libs,
  );

$build->create_build_script;