access to lower-level error messages
[imager.git] / Makefile.PL
CommitLineData
02d1d628
AMH
1
2use ExtUtils::MakeMaker;
3use Cwd;
4use Config;
5
6$lext=$Config{'so'}; # Get extensions of libraries
88a763e2 7$aext=$Config{'_a'};
02d1d628
AMH
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
25
26getenv(); # get environment variables
27init(); # initialize global data
28pathcheck(); # Check if directories exist
29
30# Pick what libraries are used
31if ($MANUAL) {
32 manual();
33} else {
34 automatic();
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};
39 }
40 }
41}
42
43# Make sure there isn't a clash between the gif libraries.
44gifcheck();
45
46for $frm(values %formats) {
47 $F_DEFINE .= ' -D'.$frm->{def};
48 $F_LIBS .= ' ' .$frm->{libfiles};
49 $F_OBJECT .= ' ' .$frm->{objfiles};
50}
51
52$F_INC = join(" ",map { (exists $definc{$_})?'':'-I'.$_ } @incs);
53$F_LIBS = join(" ",map { '-L'.$_ } @libs).' '.$F_LIBS;
54
55$OSLIBS = '';
56$OSDEF = "-DOS_$^O";
57
58if ($^O eq 'hpux') { $OSLIBS .= ' -ldld'; }
59if (defined $Config{'d_dlsymun'}) { $OSDEF .= ' -DDLSYMUN'; }
60
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);
65
66%opts=(
67 'NAME' => 'Imager',
68 'VERSION_FROM' => 'Imager.pm',
69 'LIBS' => "$LFLAGS -lm $OSLIBS $F_LIBS",
70 'DEFINE' => "$F_DEFINE $EXTDEF $OSDEF $CFLAGS",
71 'INC' => "$DFLAGS $F_INC",
72 'OBJECT' => join(' ', @objs, $F_OBJECT)
73 );
74
75if ($VERBOSE) { print Dumper(\%opts); }
76mkdir('testout',0777); # since we cannot include it in the archive.
77WriteMakefile(%opts);
78exit;
79
80
81sub MY::postamble {
82'
83dyntest.(MYEXTLIB) : dynfilt/Makefile
84 cd dynfilt && $(MAKE) $(PASTHRU)
85
86lib/Imager/Regops.pm : regmach.h regops.perl
87 $(PERL) regops.perl regmach.h lib/Imager/Regops.pm
88';
89}
90
91# manual configuration of helper libraries
92
93sub manual {
94 print <<EOF;
95
96 Please answer the following questions about
97 which formats are avaliable on your computer
98
99press <return> to continue
100EOF
101
102 <STDIN>; # eat one return
103
104 for $frm(sort { $formats{$b}{order} <=> $formats{$a}{order} } keys %formats) {
105 SWX:
106 if ($formats{$frm}{docs}) { print "\n",$formats{$frm}{docs},"\n\n"; }
107 print "Enable $frm support: ";
108 $gz=<STDIN>;
109 chomp($gz);
110 if ($gz =~ m/^(y|yes|n|no)/i) {
111 $gz=substr(lc($gz),0,1);
112 if ($gz eq 'n') {
113 delete $formats{$frm};
114 }
115 } else { goto SWX; }
116 }
117}
118
119
120# automatic configuration of helper libraries
121
122sub automatic {
123 for $frm(keys %formats) {
124 delete $formats{$frm} if !checkformat($frm);
125 }
126}
127
128
129sub gifcheck {
130 if ($formats{'gif'} and $formats{'ungif'}) {
131 print "ungif and gif can not coexist - removing ungif support\n";
132 delete $formats{'ungif'};
133 }
134 my @dirs;
135 for my $frm (grep $formats{$_}, qw(gif ungif)) {
136 push(@dirs, @{$formats{$frm}{incdir}}) if $formats{$frm}{incdir};
137 }
138 my $minor = 0;
139 my $major = 0;
140 FILES: for my $dir (@dirs) {
141 my $h = "$dir/gif_lib.h";
142 open H, "< $h" or next;
143 while (<H>) {
144 if (/GIF_LIB_VERSION\s+"\s*version\s*(\d+)\.(\d+)/i) {
145 $major = $1;
146 $minor = $2;
147 close H;
148 last FILES;
149 }
150 }
151 close H;
152 }
153
154 # we need the version in a #ifdefable form
155
156 $F_DEFINE .= "-DIM_GIFMAJOR=$major -DIM_GIFMINOR=$minor";
157}
158
159
160sub gd {
161 my($path,$chk)=@_;
162
163# print "checking path $path\n";
164 if ( !opendir(DH,$path) ) {
165 warn "Cannot open dir $path: $!\n";
166 return;
167 }
168 my @l=grep { $chk->($_) } readdir(DH);
169 # print @l;
170 close(DH);
171 return map $path, @l;
172}
173
174
175sub checkformat {
176 my $frm=shift;
177 my $libchk=$formats{$frm}{'libcheck'};
178 my $incchk=$formats{$frm}{'inccheck'};
179
180 my @l;
181 for my $lp (@libs) {
182 push(@l, gd($lp,$libchk));
183 }
184
185 my @i;
186 for my $ip (@incs) {
187 push(@i, gd($ip,$incchk));
188 }
189
190 printf("%10s: includes %s - libraries %s\n",$frm,(@i?'found':'not found'),(@l?'found':'not found'));
191 $formats{$frm}{incdir} = \@i;
192 $formats{$frm}{libdir} = \@l;
193 return scalar(@i && @l);
194}
195
196
197
198
199sub pathcheck {
200 if ($VERBOSE) {
201 print "pathcheck\n";
202 print " Include paths:\n";
203 for (@incs) { print $_,"\n"; }
204 }
205 @incs=grep { -d $_ && -r _ && -x _ or ( print(" $_ doesnt exist or is unaccessible - removed."),0) } @incs;
206
207 if ($VERBOSE) {
208 print "\nLibrary paths:\n";
209 for (@incs) { print $_,"\n"; }
210 }
211 @libs=grep { -d $_ && -r _ && -x _ or ( print(" $_ doesnt exist or is unaccessible - removed."),0) } @libs;
212 print "\ndone.\n";
213}
214
215
216# Format data initialization
217
218# format definition is:
219# defines needed
220# default include path
221# files needed for include (boolean perl code)
222# default lib path
223# libs needed
224# files needed for link (boolean perl code)
225# object files needed for the format
226
227
228sub init {
229
230 @definc{'/usr/include'}=();
231 @incs=(qw(/usr/include /usr/local/include /usr/include/freetype /usr/local/include/freetype), split /:/, $INCPATH );
232 @libs=(split(/ /, $Config{'libpth'}), split(/:/, $LIBPATH) );
88a763e2
TC
233 if ($^O =~ /win32/i && $Config{cc} =~ /\bcl\b/i) {
234 push(@incs, split /;/, $ENV{INCLUDE}) if exists $ENV{INCLUDE};
235 push(@libs, split /;/, $ENV{LIB}) if exists $ENV{LIB};
236 }
02d1d628
AMH
237
238 $formats{'jpeg'}={
239 order=>'21',
240 def=>'HAVE_LIBJPEG',
241 inccheck=>sub { $_[0] eq 'jpeglib.h' },
50ee6f9c 242 libcheck=>sub { $_[0] eq "libjpeg$aext" or $_ eq "libjpeg.$lext" },
02d1d628
AMH
243 libfiles=>'-ljpeg',
244 objfiles=>'jpeg.o',
245 docs=>q{
246 In order to use jpeg with this module you need to have libjpeg
247 installed on your computer}
248 };
249
250 $formats{'tiff'}={
251 order=>'23',
252 def=>'HAVE_LIBTIFF',
253 inccheck=>sub { $_[0] eq 'tiffio.h' },
76c8a0a4 254 libcheck=>sub { $_[0] eq "libtiff$aext" or $_ eq "libtiff.$lext" },
02d1d628
AMH
255 libfiles=>'-ltiff',
256 objfiles=>'tiff.o',
257 docs=>q{
258 In order to use tiff with this module you need to have libtiff
259 installed on your computer}
260 };
261
262 $formats{'png'}={
263 order=>'22',
264 def=>'HAVE_LIBPNG',
265 inccheck=>sub { $_[0] eq 'png.h' },
88a763e2 266 libcheck=>sub { $_[0] eq "libpng$aext" or $_[0] eq "libpng.$lext" },
02d1d628
AMH
267 libfiles=>'-lpng -lz',
268 objfiles=>'png.o',
269 docs=>q{
270 Png stands for Portable Network Graphics and is intended as
271 a replacement for gif on the web. It is patent free and
272 is recommended by the w3c, you need libpng to use these formats}
273 };
274
275 $formats{'gif'}={
276 order=>'20',
277 def=>'HAVE_LIBGIF',
278 inccheck=>sub { $_[0] eq 'gif_lib.h' },
279 libcheck=>sub { $_[0] eq 'libgif.a' or $_[0] eq "libgif.$lext" },
280 libfiles=>'-lgif',
281 objfiles=>'gif.o',
282 docs=>q{
283 gif is the de facto standard for webgraphics at the moment,
284 it does have some patent problems. If you have giflib and
285 are not in violation with the unisys patent you should use
286 this instead of the 'ungif' option. Note that they cannot
287 be in use at the same time}
288 };
289
290 $formats{'ungif'}={
291 order=>'21',
292 def=>'HAVE_LIBGIF',
293 inccheck=>sub { $_[0] eq 'gif_lib.h' },
294 libcheck=>sub { $_[0] eq 'libungif.a' or $_[0] eq "libungif.$lext" },
295 libfiles=>'-lungif',
296 objfiles=>'gif.o',
297 docs=>q{
298 gif is the de facto standard for webgraphics at the moment,
299 it does have some patent problems. If you have libungif and
300 want to create images free from LZW patented compression you
301 should use this option instead of the 'gif' option}
302 };
303
304 $formats{'T1-fonts'}={
305 order=>'30',
306 def=>'HAVE_LIBT1',
307 inccheck=>sub { $_[0] eq 't1lib.h' },
308 libcheck=>sub { $_[0] eq 'libt1.a' or $_[0] eq "libt1.$lext" },
309 libfiles=>'-lt1',
310 objfiles=>'',
311 docs=>q{
312 postscript t1 fonts are scalable fonts. They can include
313 ligatures and kerning information and generally yield good
314 visual quality. We depend on libt1 to rasterize the fonts
315 for use in images.}
316 };
317
318 $formats{'TT-fonts'}={
319 order=>'31',
320 def=>'HAVE_LIBTT',
321 inccheck=>sub { $_[0] eq 'freetype.h' },
322 libcheck=>sub { $_[0] eq 'libttf.a' or $_[0] eq "libttf.$lext" },
323 libfiles=>'-lttf',
324 objfiles=>'',
325 docs=>q{
326 Truetype fonts are scalable fonts. They can include
327 kerning and hinting information and generally yield good
328 visual quality esp on low resultions. The freetype library is
329 used to rasterize for us. The only drawback is that there
330 are alot of badly designed fonts out there.}
331 };
332 # Make fix indent
333 for (keys %formats) { $formats{$_}->{docs} =~ s/^\s+/ /mg; }
334}
335
336
337
338sub gen {
339 my $V = $ENV{$_[0]};
340 defined($V) ? $V : "";
341}
342
343
344# Get information from environment variables
345
346sub getenv {
347
348 ($VERBOSE,
349 $INCPATH,
350 $LIBPATH,
351 $NOLOG,
352 $DEBUG_MALLOC,
353 $MANUAL,
354 $CFLAGS,
355 $LFLAGS,
356 $DFLAGS) = map { gen $_ } qw(IM_VERBOSE
357 IM_INCPATH
358 IM_LIBPATH
359 IM_NOLOG
360 IM_DEBUG_MALLOC
361 IM_MANUAL
362 IM_CFLAGS
363 IM_LFLAGS
364 IM_DFLAGS);
365
366 if ($VERBOSE) { print "Verbose mode\n"; require Data::Dumper; import Data::Dumper qw(Dumper);}
367
368 if ($NOLOG) { print "Logging not compiled into module\n"; }
369 else { $EXTDEF.=' -DIMAGER_LOG'; }
370
371 if ($DEBUG_MALLOC) {
372 $EXTDEF.=' -DIMAGER_DEBUG_MALLOC';
373 print "Malloc debugging enabled\n";
374 }
375
376}