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