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
26 getenv(); # get environment variables
27 init(); # initialize global data
28 pathcheck(); # Check if directories exist
30 # Pick what libraries are used
35 if (exists $ENV{IM_ENABLE}) {
36 my %en = map { $_, 1 } split ' ', $ENV{IM_ENABLE};
37 for my $key (keys %formats) {
38 delete $formats{$key} unless $en{$key};
43 # Make sure there isn't a clash between the gif libraries.
46 for $frm(values %formats) {
47 $F_DEFINE .= ' -D'.$frm->{def};
48 $F_LIBS .= ' ' .$frm->{libfiles};
49 $F_OBJECT .= ' ' .$frm->{objfiles};
52 $F_INC = join(" ",map { (exists $definc{$_})?'':'-I'.$_ } @incs);
53 $F_LIBS = join(" ",map { '-L'.$_ } @libs).' '.$F_LIBS;
58 if ($^O eq 'hpux') { $OSLIBS .= ' -ldld'; }
59 if (defined $Config{'d_dlsymun'}) { $OSDEF .= ' -DDLSYMUN'; }
61 @objs = qw(Imager.o draw.o image.o io.o iolayer.o log.o
62 gaussian.o conv.o pnm.o raw.o feat.o font.o
63 filters.o dynaload.o stackmach.o datatypes.o
64 regmach.o trans2.o quant.o error.o convert.o
65 map.o tags.o palimg.o maskimg.o img16.o rotate.o
66 bmp.o color.o fills.o);
70 'VERSION_FROM' => 'Imager.pm',
71 'LIBS' => "$LFLAGS -lm $OSLIBS $F_LIBS",
72 'DEFINE' => "$F_DEFINE $EXTDEF $OSDEF $CFLAGS",
73 'INC' => "$DFLAGS $F_INC",
74 'OBJECT' => join(' ', @objs, $F_OBJECT),
75 clean => { FILES=>'testout' },
79 $opts{AUTHOR} = 'Arnar M. Hrafnkelsson, addi@umich.edu';
80 $opts{ABSTRACT} = 'Perl extension for Generating 24 bit Images';
83 if ($VERBOSE) { print Dumper(\%opts); }
84 mkdir('testout',0777); # since we cannot include it in the archive.
92 dyntest.$(MYEXTLIB) : dynfilt/Makefile
93 cd dynfilt && $(MAKE) $(PASTHRU)
95 lib/Imager/Regops.pm : regmach.h regops.perl
96 $(PERL) regops.perl regmach.h lib/Imager/Regops.pm
100 # manual configuration of helper libraries
105 Please answer the following questions about
106 which formats are avaliable on your computer
108 press <return> to continue
111 <STDIN>; # eat one return
113 for $frm(sort { $formats{$b}{order} <=> $formats{$a}{order} } keys %formats) {
115 if ($formats{$frm}{docs}) { print "\n",$formats{$frm}{docs},"\n\n"; }
116 print "Enable $frm support: ";
119 if ($gz =~ m/^(y|yes|n|no)/i) {
120 $gz=substr(lc($gz),0,1);
122 delete $formats{$frm};
129 # automatic configuration of helper libraries
132 for $frm(keys %formats) {
133 delete $formats{$frm} if !checkformat($frm);
139 if ($formats{'gif'} and $formats{'ungif'}) {
140 print "ungif and gif can not coexist - removing ungif support\n";
141 delete $formats{'ungif'};
145 if ($formats{'gif'} or $formats{'ungif'}) {
148 You have libgif or libungif installed. They are both known to have
149 bugs. Imager can crash or display other strange behaviour after
150 reading or writing gif images. Some of the gif tests can even fail
151 since they stress some parts of the buggy code.
153 Do you want to remove gif support? [Y/n]
158 delete $formats{'gif'};
159 delete $formats{'ungif'};
164 for my $frm (qw(gif ungif)) {
165 checkformat($frm) if ($MANUAL and $formats{$frm});
169 for my $frm (grep $formats{$_}, qw(gif ungif)) {
170 push(@dirs, @{$formats{$frm}{incdir}}) if $formats{$frm}{incdir};
174 FILES: for my $dir (@dirs) {
175 my $h = "$dir/gif_lib.h";
176 open H, "< $h" or next;
178 if (/GIF_LIB_VERSION\s+"\s*version\s*(\d+)\.(\d+)/i) {
188 # we need the version in a #ifdefable form
190 $F_DEFINE .= "-DIM_GIFMAJOR=$major -DIM_GIFMINOR=$minor";
197 # print "checking path $path\n";
198 if ( !opendir(DH,$path) ) {
199 warn "Cannot open dir $path: $!\n";
202 my @l=grep { $chk->($_) } readdir(DH);
205 return map $path, @l;
211 my $libchk=$formats{$frm}{'libcheck'};
212 my $incchk=$formats{$frm}{'inccheck'};
216 push(@l, gd($lp,$libchk));
221 push(@i, gd($ip,$incchk));
224 printf("%10s: includes %s - libraries %s\n",$frm,(@i?'found':'not found'),(@l?'found':'not found'));
225 $formats{$frm}{incdir} = \@i;
226 $formats{$frm}{libdir} = \@l;
227 return scalar(@i && @l);
236 print " Include paths:\n";
237 for (@incs) { print $_,"\n"; }
239 @incs=grep { -d $_ && -r _ && -x _ or ( print(" $_ doesnt exist or is unaccessible - removed."),0) } @incs;
242 print "\nLibrary paths:\n";
243 for (@incs) { print $_,"\n"; }
245 @libs=grep { -d $_ && -r _ && -x _ or ( print(" $_ doesnt exist or is unaccessible - removed."),0) } @libs;
250 # Format data initialization
252 # format definition is:
254 # default include path
255 # files needed for include (boolean perl code)
258 # files needed for link (boolean perl code)
259 # object files needed for the format
264 @definc{'/usr/include'}=();
265 @incs=(qw(/usr/include /usr/local/include /usr/include/freetype /usr/local/include/freetype /usr/include/freetype2 /usr/local/include/freetype2), split /:/, $INCPATH );
266 @libs=(split(/ /, $Config{'libpth'}), split(/:/, $LIBPATH) );
267 if ($^O =~ /win32/i && $Config{cc} =~ /\bcl\b/i) {
268 push(@incs, split /;/, $ENV{INCLUDE}) if exists $ENV{INCLUDE};
269 push(@libs, split /;/, $ENV{LIB}) if exists $ENV{LIB};
271 if ($^O eq 'cygwin') {
272 push(@libs, '/usr/lib/w32api') if -d '/usr/lib/w32api';
273 push(@incs, '/usr/include/w32api') if -d '/usr/lib/w32api';
279 inccheck=>sub { $_[0] eq 'jpeglib.h' },
280 libcheck=>sub { $_[0] eq "libjpeg$aext" or $_ eq "libjpeg.$lext" },
284 In order to use jpeg with this module you need to have libjpeg
285 installed on your computer}
291 inccheck=>sub { $_[0] eq 'tiffio.h' },
292 libcheck=>sub { $_[0] eq "libtiff$aext" or $_ eq "libtiff.$lext" },
296 In order to use tiff with this module you need to have libtiff
297 installed on your computer}
303 inccheck=>sub { $_[0] eq 'png.h' },
304 libcheck=>sub { $_[0] eq "libpng$aext" or $_[0] eq "libpng.$lext" },
305 libfiles=>'-lpng -lz',
308 Png stands for Portable Network Graphics and is intended as
309 a replacement for gif on the web. It is patent free and
310 is recommended by the w3c, you need libpng to use these formats}
316 inccheck=>sub { $_[0] eq 'gif_lib.h' },
317 libcheck=>sub { $_[0] eq "libgif$aext" or $_[0] eq "libgif.$lext" },
321 gif is the de facto standard for webgraphics at the moment,
322 it does have some patent problems. If you have giflib and
323 are not in violation with the unisys patent you should use
324 this instead of the 'ungif' option. Note that they cannot
325 be in use at the same time}
331 inccheck=>sub { $_[0] eq 'gif_lib.h' },
332 libcheck=>sub { $_[0] eq "libungif$aext" or $_[0] eq "libungif.$lext" },
336 gif is the de facto standard for webgraphics at the moment,
337 it does have some patent problems. If you have libungif and
338 want to create images free from LZW patented compression you
339 should use this option instead of the 'gif' option}
342 $formats{'T1-fonts'}={
345 inccheck=>sub { $_[0] eq 't1lib.h' },
346 libcheck=>sub { $_[0] eq "libt1$aext" or $_[0] eq "libt1.$lext" },
350 postscript t1 fonts are scalable fonts. They can include
351 ligatures and kerning information and generally yield good
352 visual quality. We depend on libt1 to rasterize the fonts
356 $formats{'TT-fonts'}={
359 inccheck=>sub { $_[0] eq 'freetype.h' },
360 libcheck=>sub { $_[0] eq "libttf$aext" or $_[0] eq "libttf.$lext" },
364 Truetype fonts are scalable fonts. They can include
365 kerning and hinting information and generally yield good
366 visual quality esp on low resultions. The freetype library is
367 used to rasterize for us. The only drawback is that there
368 are alot of badly designed fonts out there.}
373 inccheck=>sub { lc $_[0] eq 'windows.h' },
374 libcheck=>sub { lc $_[0] eq 'gdi32.lib'
375 || lc $_[0] eq 'libgdi32.a' },
376 libfiles=>$^O eq 'cygwin' ? '-lgdi32' : '',
379 Uses the Win32 GDI for rendering text.
381 This currently only works on under normal Win32 and cygwin.
384 $formats{'freetype2'} = {
387 inccheck=>sub { lc $_[0] eq 'ft2build.h' },
388 libcheck=>sub { $_[0] eq "libfreetype$aext" or $_[0] eq "libfreetype.$lext" },
389 libfiles=>'-lfreetype',
390 objfiles=>'freetyp2.o',
392 Freetype 2 supports both Truetype and Type 1 fonts, both of which are
397 for (keys %formats) { $formats{$_}->{docs} =~ s/^\s+/ /mg; }
404 defined($V) ? $V : "";
408 # Get information from environment variables
420 $DFLAGS) = map { gen $_ } qw(IM_VERBOSE
430 if ($VERBOSE) { print "Verbose mode\n"; require Data::Dumper; import Data::Dumper qw(Dumper);}
432 if ($NOLOG) { print "Logging not compiled into module\n"; }
433 else { $EXTDEF.=' -DIMAGER_LOG'; }
436 $EXTDEF.=' -DIMAGER_DEBUG_MALLOC';
437 print "Malloc debugging enabled\n";