2 use ExtUtils::MakeMaker;
6 $lext=$Config{'so'}; # Get extensions of libraries
10 # IM_INCPATH colon seperated list of paths to extra include paths
11 # IM_LIBPATH colon seperated list of paths to extra library paths
13 # IM_VERBOSE turns on verbose mode for the library finding and such
14 # IM_MANUAL to manually select which libraries are used and which not
15 # IM_ENABLE to programmatically select which libraries are used
17 # IM_NOLOG if true logging will not be compiled into the module
18 # IM_DEBUG_MALLOC if true malloc debbuging will be compiled into the module
19 # do not use IM_DEBUG_MALLOC in production - this slows
20 # everything down by alot
21 # IM_CFLAGS Extra flags to pass to the compiler
22 # IM_LFLAGS Extra flags to pass to the linker
23 # IM_DFLAGS Extra flags to pass to the preprocessor
24 # IM_SUPPRESS_PROMPT Suppress the prompt asking about gif support
27 getenv(); # get environment variables
28 init(); # initialize global data
29 pathcheck(); # Check if directories exist
31 # Pick what libraries are used
36 if (exists $ENV{IM_ENABLE}) {
37 my %en = map { $_, 1 } split ' ', $ENV{IM_ENABLE};
38 for my $key (keys %formats) {
39 delete $formats{$key} unless $en{$key};
44 # Make sure there isn't a clash between the gif libraries.
47 for $frm(values %formats) {
48 $F_DEFINE .= ' -D'.$frm->{def};
49 $F_LIBS .= ' ' .$frm->{libfiles};
50 $F_OBJECT .= ' ' .$frm->{objfiles};
53 $F_INC = join ' ', map "-I$_", map / / ? qq{"$_"} : $_,
54 grep !exists $definc{$_}, @incs;
55 $F_LIBS = join(' ',map "-L$_", map / / ? qq{"$_"} : $_, @libs) . $F_LIBS;
60 if ($^O eq 'hpux') { $OSLIBS .= ' -ldld'; }
61 if (defined $Config{'d_dlsymun'}) { $OSDEF .= ' -DDLSYMUN'; }
63 @objs = qw(Imager.o draw.o polygon.o image.o io.o iolayer.o
64 log.o gaussian.o conv.o pnm.o raw.o feat.o font.o
65 filters.o dynaload.o stackmach.o datatypes.o
66 regmach.o trans2.o quant.o error.o convert.o
67 map.o tags.o palimg.o maskimg.o img16.o rotate.o
68 bmp.o tga.o rgb.o color.o fills.o imgdouble.o);
72 'VERSION_FROM' => 'Imager.pm',
73 'LIBS' => "$LFLAGS -lm $OSLIBS $F_LIBS",
74 'DEFINE' => "$F_DEFINE $EXTDEF $OSDEF $CFLAGS",
75 'INC' => "$DFLAGS $F_INC",
76 'OBJECT' => join(' ', @objs, $F_OBJECT),
77 clean => { FILES=>'testout' },
82 $opts{AUTHOR} = 'Arnar M. Hrafnkelsson, addi@umich.edu';
83 $opts{ABSTRACT} = 'Perl extension for Generating 24 bit Images';
86 if ($VERBOSE) { print Dumper(\%opts); }
87 mkdir('testout',0777); # since we cannot include it in the archive.
95 dyntest.$(MYEXTLIB) : dynfilt/Makefile
96 cd dynfilt && $(MAKE) $(PASTHRU)
98 lib/Imager/Regops.pm : regmach.h regops.perl
99 $(PERL) regops.perl regmach.h lib/Imager/Regops.pm
103 # manual configuration of helper libraries
108 Please answer the following questions about
109 which formats are avaliable on your computer
111 press <return> to continue
114 <STDIN>; # eat one return
116 for $frm(sort { $formats{$b}{order} <=> $formats{$a}{order} } keys %formats) {
118 if ($formats{$frm}{docs}) { print "\n",$formats{$frm}{docs},"\n\n"; }
119 print "Enable $frm support: ";
122 if ($gz =~ m/^(y|yes|n|no)/i) {
123 $gz=substr(lc($gz),0,1);
125 delete $formats{$frm};
132 # automatic configuration of helper libraries
135 for $frm(keys %formats) {
136 delete $formats{$frm} if !checkformat($frm);
142 if ($formats{'gif'} and $formats{'ungif'}) {
143 print "ungif and gif can not coexist - removing ungif support\n";
144 delete $formats{'ungif'};
148 if (($formats{'gif'} or $formats{'ungif'}) && !$ENV{IM_SUPPRESS_PROMPT}) {
151 You have libgif or libungif installed. They are both known to have
152 bugs. Imager can crash or display other strange behaviour after
153 reading or writing gif images. Some of the gif tests can even fail
154 since they stress some parts of the buggy code.
156 libungif 4.1.2 and later is safe.
158 Do you want to remove gif support? [Y/n]
163 delete $formats{'gif'};
164 delete $formats{'ungif'};
169 for my $frm (qw(gif ungif)) {
170 checkformat($frm) if ($MANUAL and $formats{$frm});
174 for my $frm (grep $formats{$_}, qw(gif ungif)) {
175 push(@dirs, @{$formats{$frm}{incdir}}) if $formats{$frm}{incdir};
179 FILES: for my $dir (@dirs) {
180 my $h = "$dir/gif_lib.h";
181 open H, "< $h" or next;
183 if (/GIF_LIB_VERSION\s+"\s*version\s*(\d+)\.(\d+)/i) {
193 # we need the version in a #ifdefable form
195 $F_DEFINE .= "-DIM_GIFMAJOR=$major -DIM_GIFMINOR=$minor";
202 # print "checking path $path\n";
203 if ( !opendir(DH,$path) ) {
204 warn "Cannot open dir $path: $!\n";
207 my @l=grep { $chk->($_) } readdir(DH);
210 return map $path, @l;
216 my $libchk=$formats{$frm}{'libcheck'};
217 my $incchk=$formats{$frm}{'inccheck'};
221 push(@l, gd($lp,$libchk));
226 push(@i, gd($ip,$incchk));
229 printf("%10s: includes %s - libraries %s\n",$frm,(@i?'found':'not found'),(@l?'found':'not found'));
230 $formats{$frm}{incdir} = \@i;
231 $formats{$frm}{libdir} = \@l;
232 return scalar(@i && @l);
241 print " Include paths:\n";
242 for (@incs) { print $_,"\n"; }
244 @incs=grep { -d $_ && -r _ && -x _ or ( print(" $_ doesnt exist or is unaccessible - removed.\n"),0) } @incs;
247 print "\nLibrary paths:\n";
248 for (@incs) { print $_,"\n"; }
250 @libs=grep { -d $_ && -r _ && -x _ or ( print(" $_ doesnt exist or is unaccessible - removed.\n"),0) } @libs;
255 # Format data initialization
257 # format definition is:
259 # default include path
260 # files needed for include (boolean perl code)
263 # files needed for link (boolean perl code)
264 # object files needed for the format
269 @definc{'/usr/include'}=();
270 @incs=(split(/\Q$Config{path_sep}/, $INCPATH),
271 qw(/sw/include /usr/include/freetype2 /usr/local/include/freetype2
272 /usr/include /usr/local/include /usr/include/freetype
273 /usr/local/include/freetype));
274 @libs=(split(/\Q$Config{path_sep}/,$LIBPATH),
275 qw(/sw/lib), split(/ /, $Config{'libpth'}));
276 if ($^O =~ /win32/i && $Config{cc} =~ /\bcl\b/i) {
277 push(@incs, split /;/, $ENV{INCLUDE}) if exists $ENV{INCLUDE};
278 push(@libs, split /;/, $ENV{LIB}) if exists $ENV{LIB};
280 if ($^O eq 'cygwin') {
281 push(@libs, '/usr/lib/w32api') if -d '/usr/lib/w32api';
282 push(@incs, '/usr/include/w32api') if -d '/usr/lib/w32api';
288 inccheck=>sub { $_[0] eq 'jpeglib.h' },
289 libcheck=>sub { $_[0] eq "libjpeg$aext" or $_ eq "libjpeg.$lext" },
293 In order to use jpeg with this module you need to have libjpeg
294 installed on your computer}
300 inccheck=>sub { $_[0] eq 'tiffio.h' },
301 libcheck=>sub { $_[0] eq "libtiff$aext" or $_ eq "libtiff.$lext" },
305 In order to use tiff with this module you need to have libtiff
306 installed on your computer}
312 inccheck=>sub { $_[0] eq 'png.h' },
313 libcheck=>sub { $_[0] eq "libpng$aext" or $_[0] eq "libpng.$lext" },
314 libfiles=>'-lpng -lz',
317 Png stands for Portable Network Graphics and is intended as
318 a replacement for gif on the web. It is patent free and
319 is recommended by the w3c, you need libpng to use these formats}
325 inccheck=>sub { $_[0] eq 'gif_lib.h' },
326 libcheck=>sub { $_[0] eq "libgif$aext" or $_[0] eq "libgif.$lext" },
330 gif is the de facto standard for webgraphics at the moment,
331 it does have some patent problems. If you have giflib and
332 are not in violation with the unisys patent you should use
333 this instead of the 'ungif' option. Note that they cannot
334 be in use at the same time}
340 inccheck=>sub { $_[0] eq 'gif_lib.h' },
341 libcheck=>sub { $_[0] eq "libungif$aext" or $_[0] eq "libungif.$lext" },
345 gif is the de facto standard for webgraphics at the moment,
346 it does have some patent problems. If you have libungif and
347 want to create images free from LZW patented compression you
348 should use this option instead of the 'gif' option}
351 $formats{'T1-fonts'}={
354 inccheck=>sub { $_[0] eq 't1lib.h' },
355 libcheck=>sub { $_[0] eq "libt1$aext" or $_[0] eq "libt1.$lext" },
359 postscript t1 fonts are scalable fonts. They can include
360 ligatures and kerning information and generally yield good
361 visual quality. We depend on libt1 to rasterize the fonts
365 $formats{'TT-fonts'}={
368 inccheck=>sub { $_[0] eq 'freetype.h' },
369 libcheck=>sub { $_[0] eq "libttf$aext" or $_[0] eq "libttf.$lext" },
373 Truetype fonts are scalable fonts. They can include
374 kerning and hinting information and generally yield good
375 visual quality esp on low resultions. The freetype library is
376 used to rasterize for us. The only drawback is that there
377 are alot of badly designed fonts out there.}
382 inccheck=>sub { lc $_[0] eq 'windows.h' },
383 libcheck=>sub { lc $_[0] eq 'gdi32.lib'
384 || lc $_[0] eq 'libgdi32.a' },
385 libfiles=>$^O eq 'cygwin' ? '-lgdi32' : '',
388 Uses the Win32 GDI for rendering text.
390 This currently only works on under normal Win32 and cygwin.
393 $formats{'freetype2'} = {
396 inccheck=>sub { lc $_[0] eq 'ft2build.h' },
397 libcheck=>sub { $_[0] eq "libfreetype$aext" or $_[0] eq "libfreetype.$lext" },
398 libfiles=>'-lfreetype',
399 objfiles=>'freetyp2.o',
401 Freetype 2 supports both Truetype and Type 1 fonts, both of which are
406 for (keys %formats) { $formats{$_}->{docs} =~ s/^\s+/ /mg; }
413 defined($V) ? $V : "";
417 # Get information from environment variables
429 $DFLAGS) = map { gen $_ } qw(IM_VERBOSE
439 if ($VERBOSE) { print "Verbose mode\n"; require Data::Dumper; import Data::Dumper qw(Dumper);}
441 if ($NOLOG) { print "Logging not compiled into module\n"; }
442 else { $EXTDEF.=' -DIMAGER_LOG'; }
445 $EXTDEF.=' -DIMAGER_DEBUG_MALLOC';
446 print "Malloc debugging enabled\n";