]> git.imager.perl.org - imager.git/blob - Makefile.PL
- there would be a link or load time error on m_init_log() if
[imager.git] / Makefile.PL
1
2 use ExtUtils::MakeMaker;
3 use Cwd;
4 use Config;
5
6 $lext=$Config{'so'};   # Get extensions of libraries
7 $aext=$Config{'_a'};
8
9 #
10 # IM_INCPATH      colon seperated list of paths to extra include paths
11 # IM_LIBPATH      colon seperated list of paths to extra library paths
12 #
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
16 #                 and which are not
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
25
26
27 getenv();     # get environment variables
28 init();       # initialize global data
29 pathcheck();  # Check if directories exist
30
31 # Pick what libraries are used
32 if ($MANUAL) {
33   manual();
34 } else {
35   automatic();
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};
40     }
41   }
42 }
43
44 # Make sure there isn't a clash between the gif libraries.
45 gifcheck();
46
47 for $frm(values %formats) {
48   $F_DEFINE .= ' -D'.$frm->{def};
49   $F_LIBS   .= ' '  .$frm->{libfiles};
50   $F_OBJECT .= ' '  .$frm->{objfiles};
51 }
52
53 $F_INC  = join(" ",map { (exists $definc{$_})?'':'-I'.$_ } @incs);
54 $F_LIBS = join(" ",map { '-L'.$_ } @libs).' '.$F_LIBS;
55
56 $OSLIBS = '';
57 $OSDEF  = "-DOS_$^O";
58
59 if ($^O eq 'hpux')                { $OSLIBS .= ' -ldld'; }
60 if (defined $Config{'d_dlsymun'}) { $OSDEF  .= ' -DDLSYMUN'; }
61
62 @objs = qw(Imager.o draw.o polygon.o image.o io.o iolayer.o
63            log.o gaussian.o conv.o pnm.o raw.o feat.o font.o
64            filters.o dynaload.o stackmach.o datatypes.o
65            regmach.o trans2.o quant.o error.o convert.o
66            map.o tags.o palimg.o maskimg.o img16.o rotate.o
67            bmp.o tga.o rgb.o color.o fills.o imgdouble.o);
68
69 %opts=(
70        'NAME'         => 'Imager',
71        'VERSION_FROM' => 'Imager.pm',
72        'LIBS'         => "$LFLAGS -lm $OSLIBS $F_LIBS",
73        'DEFINE'       => "$F_DEFINE $EXTDEF $OSDEF $CFLAGS",
74        'INC'          => "$DFLAGS $F_INC",
75        'OBJECT'       => join(' ', @objs, $F_OBJECT),
76        clean          => { FILES=>'testout' },
77       );
78
79 if ($] ge '5.005') {
80   $opts{AUTHOR} = 'Arnar M. Hrafnkelsson, addi@umich.edu';
81   $opts{ABSTRACT} = 'Perl extension for Generating 24 bit Images';
82 }
83
84 if ($VERBOSE) { print Dumper(\%opts); }
85 mkdir('testout',0777); # since we cannot include it in the archive.
86 WriteMakefile(%opts);
87
88 exit;
89
90
91 sub MY::postamble {
92 '
93 dyntest.$(MYEXTLIB) : dynfilt/Makefile
94         cd dynfilt && $(MAKE) $(PASTHRU)
95
96 lib/Imager/Regops.pm : regmach.h regops.perl
97         $(PERL) regops.perl regmach.h lib/Imager/Regops.pm
98 ';
99 }
100
101 # manual configuration of helper libraries
102
103 sub manual {
104   print <<EOF;
105
106       Please answer the following questions about
107       which formats are avaliable on your computer
108
109 press <return> to continue
110 EOF
111
112   <STDIN>; # eat one return
113
114   for $frm(sort { $formats{$b}{order} <=> $formats{$a}{order} } keys %formats) {
115   SWX:
116     if ($formats{$frm}{docs}) { print "\n",$formats{$frm}{docs},"\n\n"; }
117     print "Enable $frm support: ";
118     $gz = <STDIN>;
119     chomp($gz);
120     if ($gz =~ m/^(y|yes|n|no)/i) {
121       $gz=substr(lc($gz),0,1);
122       if ($gz eq 'n') {
123         delete $formats{$frm};
124       }
125     } else { goto SWX; }
126   }
127 }
128
129
130 # automatic configuration of helper libraries
131
132 sub automatic {
133   for $frm(keys %formats) {
134     delete $formats{$frm} if !checkformat($frm);        
135   }
136 }
137
138
139 sub gifcheck {
140   if ($formats{'gif'} and $formats{'ungif'}) {
141     print "ungif and gif can not coexist - removing ungif support\n";
142     delete $formats{'ungif'};
143   }
144
145  RETR:
146   if (($formats{'gif'} or $formats{'ungif'}) && !$ENV{IM_SUPPRESS_PROMPT}) {
147     print <<EOFF;
148
149 You have libgif or libungif installed.  They are both known to have
150 bugs.  Imager can crash or display other strange behaviour after
151 reading or writing gif images.  Some of the gif tests can even fail
152 since they stress some parts of the buggy code.
153
154 Do you want to remove gif support? [Y/n]
155 EOFF
156     my $resp = <STDIN>;
157     chomp($resp);
158     if ($resp ne "n") {
159       delete $formats{'gif'};
160       delete $formats{'ungif'};
161       return;
162     }
163   }
164
165   for my $frm (qw(gif ungif)) {
166     checkformat($frm) if ($MANUAL and $formats{$frm});
167   }
168
169   my @dirs;
170   for my $frm (grep $formats{$_}, qw(gif ungif)) {
171     push(@dirs, @{$formats{$frm}{incdir}}) if $formats{$frm}{incdir};
172   }
173   my $minor = 0;
174   my $major = 0;
175   FILES: for my $dir (@dirs) {
176     my $h = "$dir/gif_lib.h";
177     open H, "< $h" or next;
178     while (<H>) {
179       if (/GIF_LIB_VERSION\s+"\s*version\s*(\d+)\.(\d+)/i) {
180         $major = $1;
181         $minor = $2;
182         close H;
183         last FILES;
184       }
185     }
186     close H;
187   }
188
189   # we need the version in a #ifdefable form
190
191   $F_DEFINE .= "-DIM_GIFMAJOR=$major -DIM_GIFMINOR=$minor";
192 }
193
194
195 sub gd {
196   my($path,$chk)=@_;
197
198 #    print "checking path $path\n";
199   if ( !opendir(DH,$path) ) {
200     warn "Cannot open dir $path: $!\n";
201     return;
202   }
203   my @l=grep { $chk->($_) } readdir(DH);
204   #    print @l;
205   close(DH);
206   return map $path, @l;
207 }
208
209
210 sub checkformat {
211   my $frm=shift;
212   my $libchk=$formats{$frm}{'libcheck'};
213   my $incchk=$formats{$frm}{'inccheck'};
214
215   my @l;
216   for my $lp (@libs) {
217     push(@l, gd($lp,$libchk));
218   }
219
220   my @i;
221   for my $ip (@incs) {
222     push(@i, gd($ip,$incchk));
223   }
224
225   printf("%10s: includes %s - libraries %s\n",$frm,(@i?'found':'not found'),(@l?'found':'not found'));
226   $formats{$frm}{incdir} = \@i;
227   $formats{$frm}{libdir} = \@l;
228   return scalar(@i && @l);
229 }
230
231
232
233
234 sub pathcheck {
235   if ($VERBOSE) {
236     print "pathcheck\n";
237     print "  Include paths:\n";
238     for (@incs) { print $_,"\n"; }
239   }
240   @incs=grep { -d $_ && -r _ && -x _ or ( print("  $_ doesnt exist or is unaccessible - removed.\n"),0) } @incs;
241
242   if ($VERBOSE) {
243     print "\nLibrary paths:\n";
244     for (@incs) { print $_,"\n"; }
245   }
246   @libs=grep { -d $_ && -r _ && -x _ or ( print("  $_ doesnt exist or is unaccessible - removed.\n"),0) } @libs;
247   print "\ndone.\n";
248 }
249
250
251 # Format data initialization
252
253 # format definition is:
254 # defines needed
255 # default include path
256 # files needed for include (boolean perl code)
257 # default lib path
258 # libs needed
259 # files needed for link (boolean perl code)
260 # object files needed for the format
261
262
263 sub init {
264
265   @definc{'/usr/include'}=();
266   @incs=(split(/\Q$Config{path_sep}/, $INCPATH), 
267          qw(/sw/include /usr/include/freetype2 /usr/local/include/freetype2 
268             /usr/include /usr/local/include /usr/include/freetype 
269             /usr/local/include/freetype));
270   @libs=(split(/\Q$Config{path_sep}/,$LIBPATH), 
271          qw(/sw/lib),  split(/ /, $Config{'libpth'}));
272   if ($^O =~ /win32/i && $Config{cc} =~ /\bcl\b/i) {
273     push(@incs, split /;/, $ENV{INCLUDE}) if exists $ENV{INCLUDE};
274     push(@libs, split /;/, $ENV{LIB}) if exists $ENV{LIB};
275   }
276   if ($^O eq 'cygwin') {
277     push(@libs, '/usr/lib/w32api') if -d '/usr/lib/w32api';
278     push(@incs, '/usr/include/w32api') if -d '/usr/lib/w32api';
279   }
280
281   $formats{'jpeg'}={
282                     order=>'21',
283                     def=>'HAVE_LIBJPEG',
284                     inccheck=>sub { $_[0] eq 'jpeglib.h' },
285                     libcheck=>sub { $_[0] eq "libjpeg$aext" or $_ eq "libjpeg.$lext" },
286                     libfiles=>'-ljpeg',
287                     objfiles=>'jpeg.o',
288                     docs=>q{
289                             In order to use jpeg with this module you need to have libjpeg
290                             installed on your computer}
291                    };
292
293   $formats{'tiff'}={
294                     order=>'23',
295                     def=>'HAVE_LIBTIFF',
296                     inccheck=>sub { $_[0] eq 'tiffio.h' },
297                     libcheck=>sub { $_[0] eq "libtiff$aext" or $_ eq "libtiff.$lext" },
298                     libfiles=>'-ltiff',
299                     objfiles=>'tiff.o',
300                     docs=>q{
301                             In order to use tiff with this module you need to have libtiff
302                             installed on your computer}
303                    };
304
305   $formats{'png'}={
306                    order=>'22',
307                    def=>'HAVE_LIBPNG',
308                    inccheck=>sub { $_[0] eq 'png.h' },
309                    libcheck=>sub { $_[0] eq "libpng$aext" or $_[0] eq "libpng.$lext" },
310                    libfiles=>'-lpng -lz',
311                    objfiles=>'png.o',
312                    docs=>q{
313                            Png stands for Portable Network Graphics and is intended as
314                            a replacement for gif on the web. It is patent free and
315                            is recommended by the w3c, you need libpng to use these formats}
316                   };
317
318   $formats{'gif'}={
319                    order=>'20',
320                    def=>'HAVE_LIBGIF',
321                    inccheck=>sub { $_[0] eq 'gif_lib.h' },
322                    libcheck=>sub { $_[0] eq "libgif$aext" or $_[0] eq "libgif.$lext" },
323                    libfiles=>'-lgif',
324                    objfiles=>'gif.o',
325                    docs=>q{
326                            gif is the de facto standard for webgraphics at the moment,
327                            it does have some patent problems. If you have giflib and
328                            are not in violation with the unisys patent you should use
329                            this instead of the 'ungif' option.  Note that they cannot
330                            be in use at the same time}
331                   };
332
333   $formats{'ungif'}={
334                      order=>'21',
335                      def=>'HAVE_LIBGIF',
336                      inccheck=>sub { $_[0] eq 'gif_lib.h' },
337                      libcheck=>sub { $_[0] eq "libungif$aext" or $_[0] eq "libungif.$lext" },
338                      libfiles=>'-lungif',
339                      objfiles=>'gif.o',
340                      docs=>q{
341                              gif is the de facto standard for webgraphics at the moment,
342                              it does have some patent problems. If you have libungif and
343                              want to create images free from LZW patented compression you
344                              should use this option instead of the 'gif' option}
345                     };
346
347   $formats{'T1-fonts'}={
348                         order=>'30',
349                         def=>'HAVE_LIBT1',
350                         inccheck=>sub { $_[0] eq 't1lib.h' },
351                         libcheck=>sub { $_[0] eq "libt1$aext" or $_[0] eq "libt1.$lext" },
352                         libfiles=>'-lt1',
353                         objfiles=>'',
354                         docs=>q{
355                                 postscript t1 fonts are scalable fonts. They can include 
356                                 ligatures and kerning information and generally yield good
357                                 visual quality. We depend on libt1 to rasterize the fonts
358                                 for use in images.}
359                        };
360
361   $formats{'TT-fonts'}={
362                         order=>'31',
363                         def=>'HAVE_LIBTT',
364                         inccheck=>sub { $_[0] eq 'freetype.h' },
365                         libcheck=>sub { $_[0] eq "libttf$aext" or $_[0] eq "libttf.$lext" },
366                         libfiles=>'-lttf',
367                         objfiles=>'',
368                         docs=>q{
369                                 Truetype fonts are scalable fonts. They can include 
370                                 kerning and hinting information and generally yield good
371                                 visual quality esp on low resultions. The freetype library is
372                                 used to rasterize for us. The only drawback is that there
373                                 are alot of badly designed fonts out there.}
374                        };
375   $formats{'w32'} = {
376                      order=>40,
377                      def=>'HAVE_WIN32',
378                      inccheck=>sub { lc $_[0] eq 'windows.h' },
379                      libcheck=>sub { lc $_[0] eq 'gdi32.lib' 
380                                        || lc $_[0] eq 'libgdi32.a' },
381                      libfiles=>$^O eq 'cygwin' ? '-lgdi32' : '',
382                      objfiles=>'win32.o',
383                      docs => <<DOCS
384 Uses the Win32 GDI for rendering text.
385
386 This currently only works on under normal Win32 and cygwin.
387 DOCS
388                     };
389   $formats{'freetype2'} = {
390                            order=>'29',
391                            def=>'HAVE_FT2',
392                            inccheck=>sub { lc $_[0] eq 'ft2build.h' },
393                            libcheck=>sub { $_[0] eq "libfreetype$aext" or $_[0] eq "libfreetype.$lext" },
394                            libfiles=>'-lfreetype',
395                            objfiles=>'freetyp2.o',
396                            docs=><<DOCS
397 Freetype 2 supports both Truetype and Type 1 fonts, both of which are
398 scalable.
399 DOCS
400                           };
401   # Make fix indent
402   for (keys %formats) { $formats{$_}->{docs} =~ s/^\s+/  /mg; }
403 }
404
405
406
407 sub gen {
408   my $V = $ENV{$_[0]};
409   defined($V) ? $V : "";
410 }
411
412
413 # Get information from environment variables
414
415 sub getenv {
416
417   ($VERBOSE,
418    $INCPATH,
419    $LIBPATH,
420    $NOLOG,
421    $DEBUG_MALLOC,
422    $MANUAL,
423    $CFLAGS,
424    $LFLAGS,
425    $DFLAGS) = map { gen $_ } qw(IM_VERBOSE
426                                 IM_INCPATH
427                                 IM_LIBPATH
428                                 IM_NOLOG
429                                 IM_DEBUG_MALLOC
430                                 IM_MANUAL
431                                 IM_CFLAGS
432                                 IM_LFLAGS
433                                 IM_DFLAGS);
434
435   if ($VERBOSE) { print "Verbose mode\n"; require Data::Dumper; import Data::Dumper qw(Dumper);}
436
437   if ($NOLOG)   { print "Logging not compiled into module\n"; }
438   else { $EXTDEF.=' -DIMAGER_LOG'; }
439
440   if ($DEBUG_MALLOC) {
441     $EXTDEF.=' -DIMAGER_DEBUG_MALLOC';
442     print "Malloc debugging enabled\n";
443   }
444
445 }