The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use ExtUtils::MakeMaker;
use Config;

our ($hdf_include_path, $hdf_lib_path, $hdf_libs, $szip);

my $msg = "";
my $forcebuild=0;  # Note: forcebuild not used

if (defined $PDL::Config{WITH_HDF} && $PDL::Config{WITH_HDF}==0) {
    $msg = "\n   Will skip build of PDL::IO::HDF on this system   \n";
    goto skip;
}

if (defined $PDL::Config{WITH_HDF} && $PDL::Config{WITH_HDF}==1) {
    print "\n   Will forcibly try and build PDL::IO::HDF on this system   \n\n";
    $forcebuild=1;
}

# Look for HDF4 includes/libs
# default locations:
my @HDF_lib_locations = (
    '/usr/lib64',
    '/usr/local/netcdf/lib',
    '/usr/local/lib',
    '/usr/local/lib64',
    '/usr/lib64/hdf',
    '/opt/local/lib',
    '/usr/lib',
    '/usr/lib/hdf',
    '/opt/lib',
    split(/ /, $Config{libpth}),
);
my @HDF_inc_locations = (
    '/usr/local/include',
    '/usr/local/netcdf/include',
    '/opt/local/include',
    '/usr/include',
    '/usr/include/hdf',
    '/opt/include',
    $Config{usrinc},
);

# get locations from perldl.conf, if specified there:
@HDF_lib_locations = @{$PDL::Config{HDF_LIBS}}
    if( defined $PDL::Config{HDF_LIBS} );
@HDF_inc_locations = @{$PDL::Config{HDF_INC}}
    if( defined $PDL::Config{HDF_INC} );

#
# Do the search:
#
my $found_df = 0;
my $found_sz = 0;

# Look for the libs:
foreach my $libdir ( @HDF_lib_locations ) {
    if (-e "$libdir/libdfalt.a" && !$found_df) {
        $found_df = 1;
        $hdf_lib_path = $libdir;
                    $hdf_libs = '-lmfhdfalt -ldfalt';
        print "Found libdfalt.a at $libdir/libdfalt.a\n";
    }

    if (-e "$libdir/libdf.a" && !$found_df) {
        $found_df = 1;
        $hdf_lib_path = $libdir;
                    $hdf_libs = '-lmfhdf -ldf';
        print "Found libdf.a at $libdir/libdf.a\n";
    }

    if (-e "$libdir/libhdf.a" && !$found_df) {
        $found_df = 1;
        $hdf_lib_path = $libdir;
        $hdf_libs = '-lmfhdf -lhdf -lxdr';
        print "Found libhdf.a at $libdir/libhdf.a\n";
    }

    # Look for the szip library, which HDF >= 4.2r0 needs, but older versions don't!

    if (-e "$libdir/libsz.$Config{so}" && !$found_sz) {
        $found_sz = 1;
        print "Found libsz.$Config{so} at $libdir/libsz.$Config{so}\n";
    }

    if (-e "$libdir/libsz$Config{lib_ext}" && !$found_sz) {
        $found_sz = 1;
        print "Found libsz.$Config{lib_ext} at $libdir/libsz.$Config{lib_ext}\n";
    }
} # foreach $libdir...

unless( defined( $hdf_lib_path ) ) {
    $msg .= "Cannot find hdf library, libdf.a.\n"
          . "Please add the correct library path to Makefile.PL or install HDF\n";
}

warn "Warning: Did not find libsz, necessary for HDF >= 4.2r0\n" unless $found_sz;
$szip = $found_sz ? "-lsz" : "";

# Look for the include files:
foreach my $incdir ( @HDF_inc_locations ) {
    if (-e "$incdir/hdf.h") {
        $hdf_include_path = ($incdir eq '/usr/local/include' ) ? "" : $incdir;
        print "Found hdf.h at $incdir/hdf.h\n";
        last;
    }
}

unless( defined( $hdf_include_path ) ) {
    $msg .= "Cannot find hdf header file, hdf.h.\n"
          . "Please add the correct library path to Makefile.PL or install HDF\n";
}

# Set up architecture dependent stuff:
# NOTE TO SELF: The main PDL developers may not like this...
my $cpu = `uname -m`;
chomp $cpu;
my $hdf_defs;
if ($cpu eq 'x86_64') {
    $hdf_defs = "-DSWAP -DNDEBUG -DHDF -DBIG_LONGS -DIA64 " .
                "-D_BSD_SOURCE -DLINUX -DGCC32";
} elsif ($cpu eq 'i686') {
    $hdf_defs = "-DNDEBUG -D_BSD_SOURCE -DLINUX -DGCC32";
} else {
    print "WARNING: Unknown cpu type $cpu! Not setting \$hdf_defs. (This may not be a bad thing)\n";
}
print "Final \$hdf_defs flags: \'$hdf_defs\'\n\n";

# Make sure everything we wanted is found:
my $donot = 1;
if( defined( $hdf_include_path ) && defined( $hdf_lib_path ) ) {
    $donot = 0;
}

if ( $donot ) {
    $msg .= "\n Skipping build of PDL::IO::HDF.\n";
}

skip:

if ($msg ne "" && $forcebuild==0) {
    write_dummy_make( $msg );
    $donot = 1;
    $PDL::Config{WITH_HDF}=0;
} else {
    $PDL::Config{WITH_HDF}=1;
    print "\n   Building PDL::IO::HDF. Turn off WITH_HDF if there are any problems\n\n";
}

return if $donot;

WriteMakefile(
    NAME => 'PDL::IO::HDF',
    DEFINE => $hdf_defs,
    #OPTIMIZE => "$hdf_defs",
    VERSION_FROM => 'HDF.pm',
    TYPEMAPS => [ &PDL_TYPEMAP() ],
    PM => {
        'HDF.pm' => '$(INST_LIBDIR)/HDF.pm',
    },
    INC => &PDL_INCLUDE() . " -I$hdf_include_path",
    LIBS => [ "-L$hdf_lib_path $hdf_libs -ljpeg -lz $szip" ],
    dist => {
        COMPRESS => 'gzip',
        SUFFIX => 'gz',
    },
    DIR => [ 'SD', 'VS' ],
    (eval ($ExtUtils::MakeMaker::VERSION) >= 6.57_02 ? ('NO_MYMETA' => 1) : ()),
);