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

use 5.008;

use Config;
use ExtUtils::MakeMaker qw(WriteMakefile);
use File::Spec::Functions;
use Getopt::Long;

my (@INC, @LIBPATH, @LIBS);
my ($JPEG, $PNG, $GIF, $MYEXTLIB);
my ($JPEG_VERSION, $PNG_VERSION, $GIF_VERSION);

my ($help, $jpeg_inc, $jpeg_lib, $png_inc, $png_lib, $gif_inc, $gif_lib);
my ($jpeg_static, $png_static, $gif_static);

my $DEFINES = '-O2';
$DEFINES .= ' -Wall' unless $^O =~ /sun|solaris/i;
$DEFINES .= ' -Wno-unused-value -Wno-format-security -Winline -ffast-math' unless $^O =~ /Win32|sun|solaris/i;

if ( $^O !~ /Win32/i ) { 
    # Check for Sparc ReadyNAS to enable ASM code
    if ( -e '/etc/raidiator_version' ) {
        if ( $Config{archname} eq 'sparc-linux' ) {
            $DEFINES .= ' -DPADRE';
        }
    }
}

my $result = GetOptions(
    "help|h"               => \$help,
    "with-jpeg-includes=s" => \$jpeg_inc,
    "with-jpeg-libs=s"     => \$jpeg_lib,
    "with-jpeg-static"     => \$jpeg_static,
    "with-png-includes=s"  => \$png_inc,
    "with-png-libs=s"      => \$png_lib,
    "with-png-static"      => \$png_static,
    "with-gif-includes=s"  => \$gif_inc,
    "with-gif-libs=s"      => \$gif_lib,
    "with-gif-static"      => \$gif_static,
);

if ($help || !$result) {
    print STDERR <<END;
Usage: perl Makefile.PL [options]

Configure Image::Scale module.

Options:
    --with-jpeg-includes    Path to directory containing jpeglib.h
    --with-jpeg-libs        Path to directory containing libjpeg
    --with-jpeg-static      Statically link libjpeg
    --with-png-includes     Path to directory containing png.h
    --with-png-libs         Path to directory containing libpng
    --with-png-static       Statically link libpng
    --with-gif-includes     Path to directory containing gif_lib.h
    --with-gif-libs         Path to directory containing libgif
    --with-gif-static       Statically link libgif

END

    exit 0;
}

my @check = qw(/usr/include /usr/local/include /opt/local/include);

# Check in environment-supplied locations before standard ones
unshift @check, split /:/, $ENV{INCLUDE};

if ( $^O =~ /Win32/i ) {
    push @check, '../libjpeg-turbo-1.0.0';
    push @check, '../lpng143';
    push @check, '../giflib-4.1.6/lib';
}

# Look for libjpeg
for my $incdir ( $jpeg_inc, @check ) {
    if ( $incdir && -e catfile($incdir, 'jpeglib.h') ) {
        $JPEG = 1;
        $jpeg_inc = $incdir;
        
        push @INC, '-I' . $jpeg_inc;
        if ($jpeg_lib) {
            push @LIBPATH, '-L' . $jpeg_lib;
        }
        
        if ($jpeg_static) {
            if ($jpeg_lib) {
                $MYEXTLIB .= $jpeg_lib . '/' . 'libjpeg$(LIB_EXT) ';
            }
            else {
                $MYEXTLIB .= $jpeg_inc . '/../lib/libjpeg$(LIB_EXT) ';
            }
        }
        else {
            push @LIBS, '-ljpeg';
        }
        
        $JPEG_VERSION = _re_find( catfile($incdir, 'jpeglib.h'), qr/JPEG_LIB_VERSION\s+(\d+)/ ) || 'unknown';
        
        $DEFINES .= " -DHAVE_JPEG -DJPEG_VERSION=$JPEG_VERSION";
        
        last;
    }
}

# Look for libpng
for my $incdir ( $png_inc, @check ) {
    if ( $incdir && -e catfile($incdir, 'png.h') ) {
        $PNG = 1;
        $png_inc = $incdir;
        
        push @INC, '-I' . $png_inc;
        if ($png_lib) {
            push @LIBPATH, '-L' . $png_lib;
        }
        
        if ($png_static) {
            if ($png_lib) {
                $MYEXTLIB .= $png_lib . '/' . 'libpng$(LIB_EXT) ';
            }
            else {
                $MYEXTLIB .= $png_inc . '/../lib/libpng$(LIB_EXT) ';
            }
            
            push @LIBS, '-lz';
        }
        else {
            push @LIBS, '-lpng -lz';
        }
        
        $PNG_VERSION = _re_find( catfile($incdir, 'png.h'), qr/PNG_LIBPNG_VER_STRING\s+"([\d\.]+)"/ ) || 'unknown';
        
        $DEFINES .= " -DHAVE_PNG -DPNG_VERSION=$PNG_VERSION";
        
        last;
    }
}

# Look for libgif
for my $incdir ( $gif_inc, @check ) {
    if ( $incdir && -e catfile($incdir, 'gif_lib.h') ) {
        $GIF = 1;
        $gif_inc = $incdir;
        
        push @INC, '-I' . $gif_inc;
        if ($gif_lib) {
            push @LIBPATH, '-L' . $gif_lib;
        }
        
        if ($gif_static) {
            if ($gif_lib) {
                $MYEXTLIB .= $gif_lib . '/' . 'libgif$(LIB_EXT) ';
            }
            else {
                $MYEXTLIB .= $gif_inc . '/../lib/libgif$(LIB_EXT) ';
            }
        }
        else {
            push @LIBS, '-lgif';
        }
        
        $GIF_VERSION = _re_find( catfile($incdir, 'gif_lib.h'), qr/GIF_LIB_VERSION\s+" Version ([\d\.]+)/ ) || 'unknown';
        
        $DEFINES .= " -DHAVE_GIF -DGIF_VERSION=$GIF_VERSION";
        
        last;
    }
}

# Require at least one of jpeg or png
if ( !$JPEG && !$PNG ) {
    my $err = "Image::Scale requires at least one of libjpeg or libpng, please install one or both and try again.\n";
    
    if ( $^O =~ /Win32/i ) {
        $err .= "\nPlease read the README.win32 file for build instructions on Windows.\n";
    }
    
    warn $err;
    
    exit 0;
}

unshift @INC, '-I. -I.. -Isrc -Iinclude';

print "\n";
print "Image::Scale will be built with:\n\n";
print "  JPEG support:     " . ( $JPEG ? "yes ($jpeg_inc, version $JPEG_VERSION)" : "no, install libjpeg (v8 recommended)" ) . "\n";
print "  PNG support:      " . ( $PNG ? "yes ($png_inc, version $PNG_VERSION)" : "no, install libpng (v1.4.x recommended)" ) . "\n";
print "  GIF support:      " . ( $GIF ? "yes ($gif_inc, version $GIF_VERSION)" : "no, install giflib" ) . "\n";
print "\n";

if ( $^O =~ /Win32/i ) {
    *MY::postamble = sub {};

    if ($JPEG) {
        push @INC, '-I../libjpeg-turbo-1.0.0/win'; # for jconfig.h
        $MYEXTLIB .= '../libjpeg-turbo-1.0.0/windows/jpeg-static.lib ';
    }
    
    if ($PNG) {
        push @INC, '-I../zlib';
        $MYEXTLIB .= '../lpng143/libpng.lib ../zlib/zlib.lib ';
    }
    
    if ($GIF) {
        $MYEXTLIB .= '../giflib-4.1.6/windows/Release/giflib.lib ';
    }
}

my $inc_files = join(' ', glob 'include/*.h');
my $src_files = join(' ', glob 'src/*.c');

WriteMakefile(
    NAME              => 'Image::Scale',
    VERSION_FROM      => 'lib/Image/Scale.pm',
    PREREQ_PM         => { 'Test::NoWarnings' => 0 },
    ABSTRACT_FROM     => 'lib/Image/Scale.pm',
    AUTHOR            => 'Andy Grundman <andy@hybridized.org>',
    INC               => join(' ', @INC),
    LIBS              => [ join(' ', @LIBPATH, @LIBS) ],
    DEFINE            => $DEFINES,
    MYEXTLIB          => $MYEXTLIB,
    depend            => { 'Scale.c' => "$inc_files $src_files" },
);

sub _re_find {
    my ( $file, $re ) = @_;
    
    my $result;
    
    open my $fh, '<', $file or die "Unable to read $file\n";
    while ( my $line = <$fh> ) {
        if ( $line =~ $re ) {
            $result = $1;
            last;
        }
    }
    close $fh;
    
    return $result;
}