1use strict;
2
3use 5.008;
4
5use Config;
6use ExtUtils::MakeMaker qw(WriteMakefile);
7use File::Spec::Functions;
8use Getopt::Long;
9
10my (@INC, @LIBPATH, @LIBS);
11my ($JPEG, $PNG, $GIF, $MYEXTLIB);
12my ($JPEG_VERSION, $PNG_VERSION, $GIF_VERSION);
13
14my ($help, $jpeg_inc, $jpeg_lib, $png_inc, $png_lib, $gif_inc, $gif_lib);
15my ($jpeg_static, $png_static, $gif_static);
16
17my $DEFINES = '-O2';
18$DEFINES .= ' -Wall' unless $^O =~ /sun|solaris/i;
19$DEFINES .= ' -Wno-unused-value -Wno-format-security -Winline -ffast-math' unless $^O =~ /Win32|sun|solaris/i;
20
21if ( $^O !~ /Win32/i ) {
22    # Check for Sparc ReadyNAS to enable ASM code
23    if ( -e '/etc/raidiator_version' ) {
24        if ( $Config{archname} eq 'sparc-linux' ) {
25            $DEFINES .= ' -DPADRE';
26        }
27    }
28
29    push @LIBPATH, '-L/usr/local/lib';
30}
31
32my $result = GetOptions(
33    "help|h"               => \$help,
34    "with-jpeg-includes=s" => \$jpeg_inc,
35    "with-jpeg-libs=s"     => \$jpeg_lib,
36    "with-jpeg-static"     => \$jpeg_static,
37    "with-png-includes=s"  => \$png_inc,
38    "with-png-libs=s"      => \$png_lib,
39    "with-png-static"      => \$png_static,
40    "with-gif-includes=s"  => \$gif_inc,
41    "with-gif-libs=s"      => \$gif_lib,
42    "with-gif-static"      => \$gif_static,
43);
44
45if ($help || !$result) {
46    print STDERR <<END;
47Usage: perl Makefile.PL [options]
48
49Configure Image::Scale module.
50
51Options:
52    --with-jpeg-includes    Path to directory containing jpeglib.h
53    --with-jpeg-libs        Path to directory containing libjpeg
54    --with-jpeg-static      Statically link libjpeg
55    --with-png-includes     Path to directory containing png.h
56    --with-png-libs         Path to directory containing libpng
57    --with-png-static       Statically link libpng
58    --with-gif-includes     Path to directory containing gif_lib.h
59    --with-gif-libs         Path to directory containing libgif
60    --with-gif-static       Statically link libgif
61
62END
63
64    exit 0;
65}
66
67my @check = qw(/usr/include /usr/local/include /opt/local/include);
68
69# Check in environment-supplied locations before standard ones
70unshift @check, split /:/, $ENV{INCLUDE};
71
72if ( $^O =~ /Win32/i ) {
73    push @check, '../libjpeg-turbo-1.1.1';
74    push @check, '../lpng143';
75    push @check, '../giflib-4.1.6/lib';
76}
77
78# Look for libjpeg
79for my $incdir ( $jpeg_inc, @check ) {
80    if ( $incdir && -e catfile($incdir, 'jpeglib.h') ) {
81        $JPEG = 1;
82        $jpeg_inc = $incdir;
83
84        unshift @INC, '-I' . $jpeg_inc;
85        if ($jpeg_lib) {
86            unshift @LIBPATH, '-L' . $jpeg_lib;
87        }
88
89        if ($jpeg_static) {
90            if ($jpeg_lib) {
91                $MYEXTLIB .= $jpeg_lib . '/' . 'libjpeg$(LIB_EXT) ';
92            }
93            else {
94                $MYEXTLIB .= $jpeg_inc . '/../lib/libjpeg$(LIB_EXT) ';
95            }
96        }
97        else {
98            push @LIBS, '-ljpeg';
99        }
100
101        if ( $^O =~ /Win32/i ) {
102            $JPEG_VERSION = _re_find( catfile($incdir, 'build', 'jconfig.h'), qr/JPEG_LIB_VERSION\s+(\d+)/ ) || 'unknown';
103        }
104        else {
105            $JPEG_VERSION = _re_find( catfile($incdir, 'jpeglib.h'), qr/JPEG_LIB_VERSION\s+(\d+)/ ) || 'unknown';
106            if ( $JPEG_VERSION eq 'unknown' ) {
107                # Also check jconfig.h as it contains the version when using libjpeg-turbo
108                if ( -d catdir($incdir, 'x86_64-linux-gnu') ) { # jconfig.h header is sometimes installed in a subdir
109                    $JPEG_VERSION = _re_find( catfile($incdir, 'x86_64-linux-gnu', 'jconfig.h'), qr/JPEG_LIB_VERSION\s+(\d+)/ ) || 'unknown';
110                }
111                else {
112                    $JPEG_VERSION = _re_find( catfile($incdir, 'jconfig.h'), qr/JPEG_LIB_VERSION\s+(\d+)/ ) || 'unknown';
113                }
114            }
115        }
116
117        $DEFINES .= " -DHAVE_JPEG -DJPEG_VERSION=$JPEG_VERSION";
118
119        last;
120    }
121}
122
123# Look for libpng
124for my $incdir ( $png_inc, @check ) {
125    if ( $incdir && -e catfile($incdir, 'png.h') ) {
126        $PNG = 1;
127        $png_inc = $incdir;
128
129        unshift @INC, '-I' . $png_inc;
130        if ($png_lib) {
131            unshift @LIBPATH, '-L' . $png_lib;
132        }
133
134        if ($png_static) {
135            if ($png_lib) {
136                $MYEXTLIB .= $png_lib . '/' . 'libpng$(LIB_EXT) ';
137            }
138            else {
139                $MYEXTLIB .= $png_inc . '/../lib/libpng$(LIB_EXT) ';
140            }
141
142            push @LIBS, '-lz';
143        }
144        else {
145            push @LIBS, '-lpng -lz';
146        }
147
148        $PNG_VERSION = _re_find( catfile($incdir, 'png.h'), qr/PNG_LIBPNG_VER_STRING\s+"([\d\.]+)"/ ) || 'unknown';
149
150        $DEFINES .= " -DHAVE_PNG -DPNG_VERSION=$PNG_VERSION";
151
152        last;
153    }
154}
155
156# Look for giflib
157for my $incdir ( $gif_inc, @check ) {
158    if ( $incdir && -e catfile($incdir, 'gif_lib.h') ) {
159        $gif_inc = $incdir;
160
161        unshift @INC, '-I' . $gif_inc;
162        if ($gif_lib) {
163            unshift @LIBPATH, '-L' . $gif_lib;
164        }
165
166        if ($gif_static) {
167            if ($gif_lib) {
168                $MYEXTLIB .= $gif_lib . '/' . "libgif\$(LIB_EXT) ";
169            }
170            else {
171                $MYEXTLIB .= $gif_inc . "/../lib/libgif\$(LIB_EXT) ";
172            }
173        }
174        else {
175            push @LIBS, "-lgif";
176        }
177
178        my $GIF_MAJOR = _re_find( catfile($incdir, 'gif_lib.h'), qr/GIFLIB_MAJOR (\d+)/ );
179        my $GIF_MINOR = _re_find( catfile($incdir, 'gif_lib.h'), qr/GIFLIB_MINOR (\d+)/ );
180
181        if ( $GIF_MAJOR ) {
182            $GIF_VERSION = "${GIF_MAJOR}.${GIF_MINOR}";
183            if ( $GIF_VERSION >= 4.2 ) {
184                $GIF = 1;
185                $DEFINES .= " -DHAVE_GIF -DGIF_VERSION=$GIF_VERSION";
186
187                # giflib >= 5.1 changes DGifClose()
188                if ( $GIF_VERSION >= 5.1 ) {
189                    $DEFINES .= " -DGIFLIB_API_51";
190                }
191
192                # giflib >= 5.0 change DGifOpen(), GifErrorString(), GifAddExtensionBlock() and struct SavedImage
193                if ( $GIF_VERSION >= 5.0 ) {
194                    $DEFINES .= " -DGIFLIB_API_50";
195                }
196            }
197        }
198
199        last;
200    }
201}
202
203# Require at least one of jpeg or png
204if ( !$JPEG && !$PNG ) {
205    my $err = "Image::Scale requires at least one of libjpeg or libpng, please install one or both and try again.\n";
206
207    if ( $^O =~ /Win32/i ) {
208        $err .= "\nPlease read the README.win32 file for build instructions on Windows.\n";
209    }
210
211    warn $err;
212
213    exit 0;
214}
215
216unshift @INC, '-I. -I.. -Isrc -Iinclude';
217
218print "\n";
219print "Image::Scale will be built with:\n\n";
220print "  JPEG support:     " . ( $JPEG ? "yes ($jpeg_inc, libjpeg version $JPEG_VERSION)" : "no, install libjpeg (v8 recommended)" ) . "\n";
221print "  PNG support:      " . ( $PNG ? "yes ($png_inc, libpng version $PNG_VERSION)" : "no, install libpng (v1.4.x recommended)" ) . "\n";
222print "  GIF support:      " . ( $GIF ? "yes ($gif_inc, giflib version $GIF_VERSION)" : "no, install giflib 4.2 or higher" ) . "\n";
223print "\n";
224
225if ( $^O =~ /Win32/i ) {
226    *MY::postamble = sub {};
227
228    if ($JPEG) {
229        push @INC, '-I../libjpeg-turbo-1.1.1/build'; # for jconfig.h
230        $MYEXTLIB .= '../libjpeg-turbo-1.1.1/build/jpeg-static.lib ';
231    }
232
233    if ($PNG) {
234        push @INC, '-I../zlib';
235        $MYEXTLIB .= '../lpng143/libpng.lib ../zlib/zlib.lib ';
236    }
237
238    if ($GIF) {
239        $MYEXTLIB .= '../giflib-4.1.6/windows/Release/giflib.lib ';
240    }
241}
242
243my $inc_files = join(' ', glob 'include/*.h');
244my $src_files = join(' ', glob 'src/*.c');
245
246WriteMakefile(
247    NAME              => 'Image::Scale',
248    VERSION_FROM      => 'lib/Image/Scale.pm',
249    PREREQ_PM         => { 'Test::NoWarnings' => 0 },
250    ABSTRACT_FROM     => 'lib/Image/Scale.pm',
251    AUTHOR            => 'Andy Grundman <andy@hybridized.org>',
252    INC               => join(' ', @INC),
253    LIBS              => [ join(' ', @LIBPATH, @LIBS) ],
254    DEFINE            => $DEFINES,
255    MYEXTLIB          => $MYEXTLIB,
256    depend            => { 'Scale.c' => "$inc_files $src_files" },
257    META_MERGE => {
258        'meta-spec' => { version => 2 },
259        resources => {
260            repository => {
261                type => 'git',
262                url  => 'https://github.com/andygrundman/Image-Scale.git',
263                web  => 'https://github.com/andygrundman/Image-Scale',
264            },
265        },
266    },
267);
268
269sub _re_find {
270    my ( $file, $re ) = @_;
271
272    my $result;
273
274    open my $fh, '<', $file or die "Unable to read $file\n";
275    while ( my $line = <$fh> ) {
276        if ( $line =~ $re ) {
277            $result = $1;
278            last;
279        }
280    }
281    close $fh;
282
283    return $result;
284}
285