- use the new EU::MM META_MERGE facility instead of generating
[imager.git] / Makefile.PL
CommitLineData
ea9e6c3f 1#!perl -w
714cf158 2use strict;
02d1d628
AMH
3use ExtUtils::MakeMaker;
4use Cwd;
5use Config;
07ea6c21 6use File::Spec;
37959076 7use Getopt::Long;
92bda632 8use ExtUtils::Manifest qw(maniread);
714cf158 9use vars qw(%formats $VERBOSE $INCPATH $LIBPATH $NOLOG $DEBUG_MALLOC $MANUAL $CFLAGS $LFLAGS $DFLAGS);
02d1d628 10
02d1d628
AMH
11#
12# IM_INCPATH colon seperated list of paths to extra include paths
13# IM_LIBPATH colon seperated list of paths to extra library paths
14#
15# IM_VERBOSE turns on verbose mode for the library finding and such
16# IM_MANUAL to manually select which libraries are used and which not
17# IM_ENABLE to programmatically select which libraries are used
18# and which are not
19# IM_NOLOG if true logging will not be compiled into the module
20# IM_DEBUG_MALLOC if true malloc debbuging will be compiled into the module
21# do not use IM_DEBUG_MALLOC in production - this slows
22# everything down by alot
23# IM_CFLAGS Extra flags to pass to the compiler
24# IM_LFLAGS Extra flags to pass to the linker
25# IM_DFLAGS Extra flags to pass to the preprocessor
f4dbac50 26# IM_SUPPRESS_PROMPT Suppress the prompt asking about gif support
02d1d628 27
855c5808
TC
28getenv(); # get environment variables
29
714cf158
TC
30my $lext=$Config{'so'}; # Get extensions of libraries
31my $aext=$Config{'_a'};
32
33my $help; # display help if set
34my @enable; # list of drivers to enable
35my @disable; # or list of drivers to disable
36my @incpaths; # places to look for headers
37my @libpaths; # places to look for libraries
714cf158 38my $noexif; # non-zero to disable EXIF parsing of JPEGs
1660561c 39my $no_gif_set_version; # disable calling EGifSetGifVersion
1ef586b1 40my $coverage; # build for coverage testing
37959076
TC
41GetOptions("help" => \$help,
42 "enable=s" => \@enable,
43 "disable=s" => \@disable,
44 "incpath=s", \@incpaths,
45 "libpath=s" => \@libpaths,
274cd32b 46 "verbose|v" => \$VERBOSE,
f7450478 47 "nolog" => \$NOLOG,
1660561c 48 "noexif" => \$noexif,
1ef586b1
TC
49 "nogifsetversion" => \$no_gif_set_version,
50 'coverage' => \$coverage);
855c5808
TC
51
52if ($VERBOSE) {
53 print "Verbose mode\n";
54 require Data::Dumper;
55 import Data::Dumper qw(Dumper);
56}
37959076
TC
57
58if ($help) {
59 usage();
60}
61
f7450478
TC
62my @defines;
63
274cd32b
TC
64if ($NOLOG) { print "Logging not compiled into module\n"; }
65else {
66 push @defines, [ IMAGER_LOG => 1, "Logging system" ];
67}
68
69if ($DEBUG_MALLOC) {
70 push @defines, [ IMAGER_DEBUG_MALLOC => 1, "Use Imager's DEBUG malloc()" ];
71 print "Malloc debugging enabled\n";
72}
73
37959076
TC
74if (@enable && @disable) {
75 print STDERR "Only --enable or --disable can be used, not both, try --help\n";
76 exit 1;
77}
02d1d628 78
714cf158
TC
79my %definc;
80my %deflib;
81my @incs; # all the places to look for headers
82my @libs; # all the places to look for libraries
83
02d1d628
AMH
84init(); # initialize global data
85pathcheck(); # Check if directories exist
86
37959076
TC
87if (exists $ENV{IM_ENABLE}) {
88 my %en = map { $_, 1 } split ' ', $ENV{IM_ENABLE};
89 for my $key (keys %formats) {
90 delete $formats{$key} unless $en{$key};
91 }
92}
93if (@enable) {
94 my %en = map { $_ => 1 } map { split /,/ } @enable;
95 for my $key (keys %formats) {
96 delete $formats{$key} unless $en{$key};
97 }
98}
99elsif (@disable) {
100 delete @formats{map { split /,/ } @disable};
101}
102
02d1d628
AMH
103# Pick what libraries are used
104if ($MANUAL) {
105 manual();
106} else {
107 automatic();
02d1d628
AMH
108}
109
110# Make sure there isn't a clash between the gif libraries.
111gifcheck();
112
07ea6c21 113my $lib_cflags = '';
a8395b42 114my $lib_lflags = '';
80c15fc7
TC
115my $F_LIBS = '';
116my $F_OBJECT = '';
714cf158 117for my $frmkey (sort { $formats{$a}{order} <=> $formats{$b}{order} } keys %formats) {
e11d297f
TC
118 my $frm = $formats{$frmkey};
119 push @defines, [ $frm->{def}, 1, "$frmkey available" ];
02d1d628 120 $F_OBJECT .= ' ' .$frm->{objfiles};
714cf158
TC
121 if ($frm->{cflags}) {
122 $lib_cflags .= ' ' .$frm->{cflags};
123 ++$definc{$_} for map { /^-I(.*)$/ ? ($1) : () }
124 grep /^-I./, split ' ', $frm->{cflags};
125 }
a8395b42
TC
126 if ($frm->{lflags}) {
127 $lib_lflags .= ' ' . $frm->{lflags};
128 }
129 else {
130 $F_LIBS .= ' ' .$frm->{libfiles};
131 }
132
02d1d628 133}
714cf158 134
f7450478
TC
135unless ($noexif) {
136 print "EXIF support enabled\n";
137 push @defines, [ 'IMEXIF_ENABLE', 1, "Enable experimental EXIF support" ];
138 $F_OBJECT .= ' imexif.o';
139}
02d1d628 140
714cf158
TC
141my $F_INC = join ' ', map "-I$_", map / / ? qq{"$_"} : $_,
142 grep !$definc{$_}, @incs;
143$F_LIBS = join(' ',map "-L$_", map / / ? qq{"$_"} : $_,
144 grep !$deflib{$_}++, @libs) . $F_LIBS;
02d1d628 145
714cf158
TC
146my $OSLIBS = '';
147my $OSDEF = "-DOS_$^O";
02d1d628
AMH
148
149if ($^O eq 'hpux') { $OSLIBS .= ' -ldld'; }
150if (defined $Config{'d_dlsymun'}) { $OSDEF .= ' -DDLSYMUN'; }
151
714cf158
TC
152my @objs = qw(Imager.o draw.o polygon.o image.o io.o iolayer.o
153 log.o gaussian.o conv.o pnm.o raw.o feat.o font.o
154 filters.o dynaload.o stackmach.o datatypes.o
155 regmach.o trans2.o quant.o error.o convert.o
156 map.o tags.o palimg.o maskimg.o img16.o rotate.o
d5477d3d 157 bmp.o tga.o color.o fills.o imgdouble.o limits.o hlines.o
9b1ec2b8 158 imext.o scale.o rubthru.o render.o paste.o compose.o);
92bda632 159
714cf158
TC
160my %opts=(
161 'NAME' => 'Imager',
162 'VERSION_FROM' => 'Imager.pm',
a8395b42 163 'LIBS' => "$LFLAGS -lm $lib_lflags $OSLIBS $F_LIBS",
714cf158
TC
164 'DEFINE' => "$OSDEF $CFLAGS",
165 'INC' => "$lib_cflags $DFLAGS $F_INC",
166 'OBJECT' => join(' ', @objs, $F_OBJECT),
f45b774f 167 clean => { FILES=>'testout rubthru.c scale.c conv.c filters.c gaussian.c render.c rubthru.c' },
714cf158 168 PM => gen_PM(),
867acf5b 169 PREREQ_PM => { 'Test::More' => 0.47 },
714cf158 170 );
02d1d628 171
1ef586b1
TC
172if ($coverage) {
173 if ($Config{gccversion}) {
174 push @ARGV, 'OPTIMIZE=-ftest-coverage -fprofile-arcs';
175 #$opts{dynamic_lib} = { OTHERLDFLAGS => '-ftest-coverage -fprofile-arcs' };
176 }
177 else {
178 die "Don't know the coverage C flags for your compiler\n";
179 }
180}
181
c52cbef2
TC
182# eval to prevent warnings about versions with _ in them
183my $MM_ver = eval $ExtUtils::MakeMaker::VERSION;
184if ($MM_ver > 6.06) {
29316bdb 185 $opts{AUTHOR} = 'Tony Cook <tony@imager.perl.org>, Arnar M. Hrafnkelsson';
ca508100
TC
186 $opts{ABSTRACT} = 'Perl extension for Generating 24 bit Images';
187}
f45b774f
TC
188
189if ($MM_ver >= 6.46) {
190 $opts{META_MERGE} =
191 {
192 recommends =>
193 {
194 "Parse::RecDescent" => 0
195 },
196 license => "perl",
197 dynamic_config => 1,
198 };
135d30e3 199}
ca508100 200
e11d297f
TC
201make_imconfig(\@defines);
202
02d1d628
AMH
203if ($VERBOSE) { print Dumper(\%opts); }
204mkdir('testout',0777); # since we cannot include it in the archive.
135d30e3 205
02d1d628 206WriteMakefile(%opts);
4dce694d 207
02d1d628
AMH
208exit;
209
210
211sub MY::postamble {
5a7e62b6
TC
212 my $self = shift;
213 my $perl = $self->{PERLRUN} ? '$(PERLRUN)' : '$(PERL)';
fe415ad2
TC
214 my $mani = maniread;
215
216 my @ims = grep /\.im$/, keys %$mani;
02d1d628 217'
faa9b3e7 218dyntest.$(MYEXTLIB) : dynfilt/Makefile
02d1d628
AMH
219 cd dynfilt && $(MAKE) $(PASTHRU)
220
221lib/Imager/Regops.pm : regmach.h regops.perl
222 $(PERL) regops.perl regmach.h lib/Imager/Regops.pm
e11d297f 223
92bda632 224imconfig.h : Makefile.PL
e11d297f
TC
225 $(ECHO) "imconfig.h out-of-date with respect to $?"
226 $(PERLRUN) Makefile.PL
227 $(ECHO) "==> Your Makefile has been rebuilt - re-run your make command <=="
5a7e62b6 228'.qq!
a7811258 229lib/Imager/APIRef.pod : \$(C_FILES) apidocs.perl
2a69ed21 230 $perl apidocs.perl lib/Imager/APIRef.pod
92bda632 231
fe415ad2
TC
232!.join('', map _im_rule($perl, $_), @ims)
233
234}
235
236sub _im_rule {
237 my ($perl, $im) = @_;
238
239 (my $c = $im) =~ s/\.im$/.c/;
240 return <<MAKE;
241
9b1ec2b8
TC
242$c: $im lib/Imager/Preprocess.pm
243 $perl -Ilib -MImager::Preprocess -epreprocess $im $c
fe415ad2
TC
244
245MAKE
02d1d628 246
55932d2a
TC
247}
248
02d1d628
AMH
249# manual configuration of helper libraries
250
251sub manual {
252 print <<EOF;
253
254 Please answer the following questions about
255 which formats are avaliable on your computer
256
257press <return> to continue
258EOF
259
260 <STDIN>; # eat one return
261
2646b26c 262 for my $frm(sort { $formats{$b}{order} <=> $formats{$a}{order} } keys %formats) {
02d1d628
AMH
263 SWX:
264 if ($formats{$frm}{docs}) { print "\n",$formats{$frm}{docs},"\n\n"; }
265 print "Enable $frm support: ";
714cf158 266 my $gz = <STDIN>;
02d1d628
AMH
267 chomp($gz);
268 if ($gz =~ m/^(y|yes|n|no)/i) {
269 $gz=substr(lc($gz),0,1);
270 if ($gz eq 'n') {
271 delete $formats{$frm};
272 }
273 } else { goto SWX; }
274 }
275}
276
277
278# automatic configuration of helper libraries
279
280sub automatic {
714cf158
TC
281 print "Automatic probing:\n" if $VERBOSE;
282 for my $frm (sort { $formats{$a}{order} <=> $formats{$b}{order} } keys %formats) {
02d1d628
AMH
283 delete $formats{$frm} if !checkformat($frm);
284 }
285}
286
287
288sub gifcheck {
5f5fe73e 289 if ($formats{'gif'} and $formats{'ungif'}) {
02d1d628
AMH
290 print "ungif and gif can not coexist - removing ungif support\n";
291 delete $formats{'ungif'};
292 }
5f5fe73e 293
09fd3468
AMH
294 for my $frm (qw(gif ungif)) {
295 checkformat($frm) if ($MANUAL and $formats{$frm});
296 }
297
02d1d628
AMH
298 my @dirs;
299 for my $frm (grep $formats{$_}, qw(gif ungif)) {
300 push(@dirs, @{$formats{$frm}{incdir}}) if $formats{$frm}{incdir};
301 }
302 my $minor = 0;
303 my $major = 0;
304 FILES: for my $dir (@dirs) {
305 my $h = "$dir/gif_lib.h";
306 open H, "< $h" or next;
307 while (<H>) {
308 if (/GIF_LIB_VERSION\s+"\s*version\s*(\d+)\.(\d+)/i) {
309 $major = $1;
310 $minor = $2;
311 close H;
312 last FILES;
313 }
314 }
315 close H;
316 }
317
318 # we need the version in a #ifdefable form
4dce694d 319
714cf158
TC
320 push @defines, [ IM_GIFMAJOR => $major, "Parsed giflib version" ];
321 push @defines, [ IM_GIFMINOR => $minor ];
1660561c
TC
322 push @defines, [ IM_NO_SET_GIF_VERSION => 1, "Disable EGifSetGifVersion" ]
323 if $no_gif_set_version;
02d1d628
AMH
324}
325
326
c6e870ae
TC
327sub grep_directory {
328 my($path, $chk)=@_;
02d1d628
AMH
329
330# print "checking path $path\n";
331 if ( !opendir(DH,$path) ) {
332 warn "Cannot open dir $path: $!\n";
333 return;
334 }
335 my @l=grep { $chk->($_) } readdir(DH);
336 # print @l;
337 close(DH);
338 return map $path, @l;
339}
340
341
342sub checkformat {
343 my $frm=shift;
714cf158
TC
344
345 print " checkformat($frm)\n" if $VERBOSE;
37959076 346
c6e870ae
TC
347 my $probe_array = $formats{$frm}{'code'};
348 if ($probe_array) {
714cf158 349 print " Calling probe function\n" if $VERBOSE;
c6e870ae
TC
350 if (ref $probe_array ne 'ARRAY') {
351 $probe_array = [ $probe_array ];
352 }
353 for my $func (@$probe_array) {
354 return 1 if $func->($formats{$frm}, $frm);
355 }
07ea6c21
TC
356 }
357
c6e870ae
TC
358 my $lib_check=$formats{$frm}{'libcheck'};
359 my $inc_check=$formats{$frm}{'inccheck'};
02d1d628 360
c6e870ae
TC
361 if ($lib_check) {
362 my @l;
363 for my $lp (@libs) {
364 push(@l, grep_directory($lp,$lib_check));
365 }
366
367 my @i;
368 for my $ip (@incs) {
369 push(@i, $ip) if $inc_check->($ip,$frm);
370 }
371
372 printf("%10s: includes %s - libraries %s\n",$frm,(@i?'found':'not found'),(@l?'found':'not found'));
373 $formats{$frm}{incdir} = \@i;
374 $formats{$frm}{libdir} = \@l;
375 return 1 if scalar(@i && @l);
02d1d628 376 }
c6e870ae
TC
377 else {
378 printf("%10s: not available\n", $frm);
02d1d628
AMH
379 }
380
c6e870ae 381 return 0;
02d1d628
AMH
382}
383
384
02d1d628
AMH
385sub pathcheck {
386 if ($VERBOSE) {
387 print "pathcheck\n";
388 print " Include paths:\n";
389 for (@incs) { print $_,"\n"; }
390 }
3a6bb91b 391 @incs=grep { -d $_ && -r _ && -x _ or ( print(" $_ doesnt exist or is unaccessible - removed.\n"),0) } @incs;
02d1d628
AMH
392
393 if ($VERBOSE) {
394 print "\nLibrary paths:\n";
855c5808 395 for (@libs) { print $_,"\n"; }
02d1d628 396 }
3a6bb91b 397 @libs=grep { -d $_ && -r _ && -x _ or ( print(" $_ doesnt exist or is unaccessible - removed.\n"),0) } @libs;
02d1d628
AMH
398 print "\ndone.\n";
399}
400
401
402# Format data initialization
403
404# format definition is:
405# defines needed
406# default include path
407# files needed for include (boolean perl code)
408# default lib path
409# libs needed
410# files needed for link (boolean perl code)
411# object files needed for the format
412
413
414sub init {
415
714cf158
TC
416 my @definc = qw(/usr/include);
417 @definc{@definc}=(1) x @definc;
d8e0c3ba
TC
418 @incs=
419 (
420 split(/\Q$Config{path_sep}/, $INCPATH),
421 map _tilde_expand($_), map { split /\Q$Config{path_sep}/ } @incpaths
422 );
2646b26c 423 if ($Config{locincpth}) {
6552acfe 424 push @incs, grep -d, split ' ', $Config{locincpth};
2646b26c 425 }
88a763e2
TC
426 if ($^O =~ /win32/i && $Config{cc} =~ /\bcl\b/i) {
427 push(@incs, split /;/, $ENV{INCLUDE}) if exists $ENV{INCLUDE};
2646b26c 428 }
16cf4610
TC
429 if ($Config{incpath}) {
430 push @incs, grep -d, split /\Q$Config{path_sep}/, $Config{incpath};
431 }
6552acfe 432 push @incs, grep -d,
2646b26c
TC
433 qw(/sw/include
434 /usr/include/freetype2
435 /usr/local/include/freetype2
436 /usr/local/include/freetype1/freetype
37959076 437 /usr/include /usr/local/include /usr/include/freetype
2646b26c 438 /usr/local/include/freetype);
714cf158
TC
439 if ($Config{ccflags}) {
440 my @hidden = map { /^-I(.*)$/ ? ($1) : () } split ' ', $Config{ccflags};
441 push @incs, @hidden;
442 @definc{@hidden} = (1) x @hidden;
443 }
2646b26c 444
37959076 445 @libs= ( split(/\Q$Config{path_sep}/,$LIBPATH),
d8e0c3ba 446 map _tilde_expand($_), map { split /\Q$Config{path_sep}/} @libpaths );
2646b26c 447 if ($Config{loclibpth}) {
6552acfe 448 push @libs, grep -d, split ' ', $Config{loclibpth};
2646b26c 449 }
714cf158 450
6552acfe 451 push @libs, grep -d, qw(/sw/lib), split(/ /, $Config{'libpth'});
714cf158 452 push @libs, grep -d, split / /, $Config{libspath} if $Config{libspath};
2646b26c 453 if ($^O =~ /win32/i && $Config{cc} =~ /\bcl\b/i) {
88a763e2
TC
454 push(@libs, split /;/, $ENV{LIB}) if exists $ENV{LIB};
455 }
faa9b3e7
TC
456 if ($^O eq 'cygwin') {
457 push(@libs, '/usr/lib/w32api') if -d '/usr/lib/w32api';
274cd32b 458 push(@incs, '/usr/include/w32api') if -d '/usr/include/w32api';
faa9b3e7 459 }
714cf158
TC
460 if ($Config{ldflags}) {
461 # some builds of perl put -Ldir into ldflags without putting it in
462 # loclibpth, let's extract them
463 my @hidden = grep -d, map { /^-L(.*)$/ ? ($1) : () }
464 split ' ', $Config{ldflags};
465 push @libs, @hidden;
466 # don't mark them as seen - EU::MM will remove any libraries
467 # it can't find and it doesn't look for -L in ldflags
468 #@deflib{@hidden} = @hidden;
469 }
ed28c9cc 470 push @libs, grep -d, qw(/usr/local/lib);
2646b26c 471
02d1d628
AMH
472 $formats{'jpeg'}={
473 order=>'21',
474 def=>'HAVE_LIBJPEG',
f8e9bc07 475 inccheck=>sub { -e catfile($_[0], 'jpeglib.h') },
50ee6f9c 476 libcheck=>sub { $_[0] eq "libjpeg$aext" or $_ eq "libjpeg.$lext" },
02d1d628
AMH
477 libfiles=>'-ljpeg',
478 objfiles=>'jpeg.o',
479 docs=>q{
480 In order to use jpeg with this module you need to have libjpeg
481 installed on your computer}
482 };
483
484 $formats{'tiff'}={
485 order=>'23',
486 def=>'HAVE_LIBTIFF',
f8e9bc07 487 inccheck=>sub { -e catfile($_[0], 'tiffio.h') },
76c8a0a4 488 libcheck=>sub { $_[0] eq "libtiff$aext" or $_ eq "libtiff.$lext" },
02d1d628
AMH
489 libfiles=>'-ltiff',
490 objfiles=>'tiff.o',
491 docs=>q{
492 In order to use tiff with this module you need to have libtiff
493 installed on your computer}
494 };
495
496 $formats{'png'}={
497 order=>'22',
498 def=>'HAVE_LIBPNG',
f8e9bc07 499 inccheck=>sub { -e catfile($_[0], 'png.h') },
88a763e2 500 libcheck=>sub { $_[0] eq "libpng$aext" or $_[0] eq "libpng.$lext" },
64ddd21f 501 libfiles=>$^O eq 'MSWin32' ? '-lpng -lzlib' : '-lpng -lz',
02d1d628
AMH
502 objfiles=>'png.o',
503 docs=>q{
504 Png stands for Portable Network Graphics and is intended as
505 a replacement for gif on the web. It is patent free and
07ea6c21
TC
506 is recommended by the w3c, you need libpng to use these formats},
507 code => \&png_probe,
02d1d628
AMH
508 };
509
510 $formats{'gif'}={
511 order=>'20',
512 def=>'HAVE_LIBGIF',
f8e9bc07 513 inccheck=>sub { -e catfile($_[0], 'gif_lib.h') },
e02451e0 514 libcheck=>sub { $_[0] eq "libgif$aext" or $_[0] eq "libgif.$lext" },
02d1d628
AMH
515 libfiles=>'-lgif',
516 objfiles=>'gif.o',
517 docs=>q{
518 gif is the de facto standard for webgraphics at the moment,
519 it does have some patent problems. If you have giflib and
520 are not in violation with the unisys patent you should use
521 this instead of the 'ungif' option. Note that they cannot
522 be in use at the same time}
523 };
524
525 $formats{'ungif'}={
526 order=>'21',
527 def=>'HAVE_LIBGIF',
f8e9bc07 528 inccheck=>sub { -e catfile($_[0], 'gif_lib.h') },
e02451e0 529 libcheck=>sub { $_[0] eq "libungif$aext" or $_[0] eq "libungif.$lext" },
02d1d628
AMH
530 libfiles=>'-lungif',
531 objfiles=>'gif.o',
532 docs=>q{
533 gif is the de facto standard for webgraphics at the moment,
534 it does have some patent problems. If you have libungif and
535 want to create images free from LZW patented compression you
536 should use this option instead of the 'gif' option}
537 };
538
539 $formats{'T1-fonts'}={
540 order=>'30',
541 def=>'HAVE_LIBT1',
f8e9bc07 542 inccheck=>sub { -e catfile($_[0], 't1lib.h') },
faa9b3e7 543 libcheck=>sub { $_[0] eq "libt1$aext" or $_[0] eq "libt1.$lext" },
02d1d628
AMH
544 libfiles=>'-lt1',
545 objfiles=>'',
546 docs=>q{
547 postscript t1 fonts are scalable fonts. They can include
548 ligatures and kerning information and generally yield good
549 visual quality. We depend on libt1 to rasterize the fonts
550 for use in images.}
551 };
552
f8e9bc07
TC
553 $formats{'TT-fonts'}=
554 {
555 order=>'31',
556 def=>'HAVE_LIBTT',
557 inccheck=>sub { -e catfile($_[0], 'freetype.h')
558 && !-e catfile($_[0], 'fterrors.h') },
559 libcheck=>sub { $_[0] eq "libttf$aext" or $_[0] eq "libttf.$lext" },
560 libfiles=>'-lttf',
561 objfiles=>'',
714cf158 562 code => \&freetype1_probe,
f8e9bc07
TC
563 docs=>q{
564Truetype fonts are scalable fonts. They can include
565kerning and hinting information and generally yield good
566visual quality esp on low resultions. The freetype library is
567used to rasterize for us. The only drawback is that there
568are alot of badly designed fonts out there.}
02d1d628 569 };
faa9b3e7
TC
570 $formats{'w32'} = {
571 order=>40,
572 def=>'HAVE_WIN32',
f8e9bc07 573 inccheck=>sub { -e catfile($_[0], 'windows.h') },
faa9b3e7
TC
574 libcheck=>sub { lc $_[0] eq 'gdi32.lib'
575 || lc $_[0] eq 'libgdi32.a' },
576 libfiles=>$^O eq 'cygwin' ? '-lgdi32' : '',
577 objfiles=>'win32.o',
578 docs => <<DOCS
579Uses the Win32 GDI for rendering text.
580
581This currently only works on under normal Win32 and cygwin.
582DOCS
583 };
c6e870ae
TC
584 $formats{'freetype2'} =
585 {
586 order=>'29',
587 def=>'HAVE_FT2',
588 # we always use a probe function
589 #inccheck=>sub { -e catfile($_[0], 'ft2build.h') },
590 #libcheck=>sub { $_[0] eq "libfreetype$aext" or $_[0] eq "libfreetype.$lext" },
591 libfiles=>'-lfreetype',
592 objfiles=>'freetyp2.o',
593 docs=><<DOCS,
faa9b3e7 594Freetype 2 supports both Truetype and Type 1 fonts, both of which are
f8e9bc07 595scalable. It also supports a variety of other fonts.
faa9b3e7 596DOCS
c6e870ae
TC
597 code =>
598 [
599 \&freetype2_probe_ftconfig,
600 \&freetype2_probe_scan
601 ],
602 };
f7450478 603
02d1d628
AMH
604 # Make fix indent
605 for (keys %formats) { $formats{$_}->{docs} =~ s/^\s+/ /mg; }
606}
607
608
609
610sub gen {
611 my $V = $ENV{$_[0]};
612 defined($V) ? $V : "";
613}
614
615
616# Get information from environment variables
617
618sub getenv {
619
620 ($VERBOSE,
621 $INCPATH,
622 $LIBPATH,
623 $NOLOG,
624 $DEBUG_MALLOC,
625 $MANUAL,
626 $CFLAGS,
627 $LFLAGS,
628 $DFLAGS) = map { gen $_ } qw(IM_VERBOSE
629 IM_INCPATH
630 IM_LIBPATH
631 IM_NOLOG
632 IM_DEBUG_MALLOC
633 IM_MANUAL
634 IM_CFLAGS
635 IM_LFLAGS
636 IM_DFLAGS);
637
02d1d628 638}
07ea6c21 639
e11d297f
TC
640sub make_imconfig {
641 my ($defines) = @_;
642
643 open CONFIG, "> imconfig.h"
644 or die "Cannot create imconfig.h: $!\n";
645 print CONFIG <<EOS;
646/* This file is automatically generated by Makefile.PL.
647 Don't edit this file, since any changes will be lost */
648
649#ifndef IMAGER_IMCONFIG_H
650#define IMAGER_IMCONFIG_H
651EOS
652 for my $define (@$defines) {
653 if ($define->[2]) {
654 print CONFIG "\n/*\n $define->[2]\n*/\n\n";
655 }
656 print CONFIG "#define $define->[0] $define->[1]\n";
657 }
658 print CONFIG "\n#endif\n";
659 close CONFIG;
660}
661
dbc33d8a
TC
662# use pkg-config to probe for libraries
663# works around the junk that pkg-config dumps on FreeBSD
664sub _pkg_probe {
665 my ($pkg) = @_;
666
667 is_exe('pkg-config') or return;
668
669 my $redir = $^O eq 'MSWin32' ? '' : '2>/dev/null';
670
671 !system("pkg-config $pkg --exists $redir");
672}
673
714cf158
TC
674# probes for freetype1 by scanning @incs for the includes and
675# @libs for the libs. This is done separately because freetype's headers
676# are stored in a freetype or freetype1 directory under PREFIX/include.
677#
678# we could find the files with the existing mechanism, but it won't set
679# -I flags correctly.
680#
681# This could be extended to freetype2 too, but freetype-config catches
682# that
683sub freetype1_probe {
684 my ($frm, $frmkey) = @_;
685
686 my $found_inc;
687 INCS:
688 for my $inc (@incs) {
689 for my $subdir (qw/freetype freetype1/) {
690 my $path = File::Spec->catfile($inc, $subdir, 'freetype.h');
691 -e $path or next;
692 $path = File::Spec->catfile($inc, $subdir, 'fterrors.h');
693 -e $path and next;
694
695 $found_inc = File::Spec->catdir($inc, $subdir);
696 last INCS;
697 }
698 }
699
700 my $found_lib;
701 LIBS:
702 for my $lib (@libs) {
703 my $a_path = File::Spec->catfile($lib, "libttf$aext");
704 my $l_path = File::Spec->catfile($lib, "libttf.$lext");
705 if (-e $a_path || -e $l_path) {
706 $found_lib = $lib;
707 last LIBS;
708 }
709 }
710
89d37182 711 return unless $found_inc && $found_lib;
714cf158
TC
712 printf("%10s: includes %s - libraries %s\n", $frmkey,
713 ($found_inc ? 'found' : 'not found'),
714 ($found_lib ? 'found' : 'not found'));
714cf158
TC
715
716 $frm->{cflags} = "-I$found_inc";
717 $frm->{libfiles} = "-lttf";
718
719 return 1;
720}
721
07ea6c21 722# probes for freetype2 by trying to run freetype-config
c6e870ae 723sub freetype2_probe_ftconfig {
07ea6c21
TC
724 my ($frm, $frmkey) = @_;
725
726 is_exe('freetype-config') or return;
727
728 my $cflags = `freetype-config --cflags`
729 and !$? or return;
730 chomp $cflags;
88e16587 731
07ea6c21
TC
732 my $lflags = `freetype-config --libs`
733 and !$? or return;
734 chomp $lflags;
88e16587
TC
735
736 # before 2.1.5 freetype-config --cflags could output
737 # the -I options in the wrong order, causing a conflict with
738 # freetype1.x installed with the same --prefix
739 #
740 # can happen iff:
741 # - both -Iprefix/include and -Iprefix/include/freetype2 are in cflags
742 # in that order
743 # - freetype 1.x headers are in prefix/include/freetype
744 my @incdirs = map substr($_, 2), grep /^-I/, split ' ', $cflags;
745 if (@incdirs == 2
746 && $incdirs[1] eq "$incdirs[0]/freetype2"
747 && -e "$incdirs[0]/freetype/freetype.h"
748 && -e "$incdirs[0]/freetype/fterrid.h") {
749 print "** freetype-config provided -I options out of order, correcting\n"
750 if $VERBOSE;
751 $cflags = join(' ', grep(!/-I/, split ' ', $cflags),
752 map "-I$_", reverse @incdirs);
753 }
754 $frm->{cflags} = $cflags;
a8395b42 755 $frm->{lflags} = $lflags;
07ea6c21
TC
756
757 printf "%10s: configured via freetype-config\n", $frmkey;
758
759 return 1;
760}
761
c6e870ae
TC
762# attempt to probe for freetype2 by scanning directories
763# we can't use the normal scan since we need to find the directory
764# containing most of the includes
765sub freetype2_probe_scan {
766 my ($frm, $frmkey) = @_;
767
768 my $found_inc;
769 my $found_inc2;
770 INCS:
771 for my $inc (@incs) {
772 my $path = File::Spec->catfile($inc, 'ft2build.h');
773 -e $path or next;
774
c6e870ae
TC
775 # try to find what it's including
776 my $ftheader;
777 open FT2BUILD, "< $path"
778 or next;
c6e870ae
TC
779 while (<FT2BUILD>) {
780 if (m!^\s*\#\s*include\s+<([\w/.]+)>!
781 || m!^\s*\#\s*include\s+"([\w/.]+)"!) {
c6e870ae
TC
782 $ftheader = $1;
783 last;
784 }
785 }
786 close FT2BUILD;
787 $ftheader
788 or next;
c6e870ae
TC
789 # non-Unix installs put this directly under the same directory in
790 # theory
791 if (-e File::Spec->catfile($inc, $ftheader)) {
792 $found_inc = $inc;
793 last INCS;
794 }
795 for my $subdir (qw/freetype2 freetype/) {
796 $path = File::Spec->catfile($inc, $subdir, 'fterrors.h');
797 -e $path and next;
798
799 $found_inc = $inc;
800 $found_inc2 = File::Spec->catdir($inc, $subdir);
801 last INCS;
802 }
803 }
804
805 my $found_lib;
806 LIBS:
807 for my $lib (@libs) {
808 my $a_path = File::Spec->catfile($lib, "libfreetype$aext");
809 my $l_path = File::Spec->catfile($lib, "libfreetype.$lext");
810 if (-e $a_path || -e $l_path) {
811 $found_lib = $lib;
812 last LIBS;
813 }
814 }
815
816 printf("%10s: includes %s - libraries %s\n", $frmkey,
817 ($found_inc ? 'found' : 'not found'),
818 ($found_lib ? 'found' : 'not found'));
819
820 return unless $found_inc && $found_lib;
821
6c2b7cf1
TC
822 $frm->{cflags} = _make_I($found_inc);
823 $frm->{cflags} .= " " . _make_I($found_inc2) if $found_inc2;
c6e870ae
TC
824 $frm->{libfiles} = "-lfreetype";
825
826 return 1;
827}
828
6c2b7cf1
TC
829sub _make_I {
830 my ($inc_dir) = @_;
831
832 $definc{$inc_dir}
e1fe2094 833 and return '';
6c2b7cf1
TC
834
835 $inc_dir =~ / / ? qq!-I"$inc_dir"! : "-I$inc_dir";
836}
837
07ea6c21
TC
838# probes for libpng via pkg-config
839sub png_probe {
840 my ($frm, $frmkey) = @_;
841
842 is_exe('pkg-config') or return;
843
07ea6c21
TC
844 my $config;
845 for my $check_conf (qw(libpng libpng12 libpng10)) {
dbc33d8a 846 if (_pkg_probe($check_conf)) {
07ea6c21
TC
847 $config = $check_conf;
848 last;
849 }
850 }
851 $config or return;
852
dbc33d8a
TC
853 my $cflags = `pkg-config $config --cflags`
854 and !$? or return;
855
07ea6c21
TC
856 my $lflags = `pkg-config $config --libs`
857 and !$? or return;
858
859 chomp $cflags;
860 chomp $lflags;
861 $frm->{cflags} = $cflags;
a8395b42 862 $frm->{lflags} = $lflags;
07ea6c21
TC
863
864 printf "%10s: configured via `pkg-config $config ...`\n", $frmkey;
865
866 return 1;
867}
868
869sub catfile {
870 return File::Spec->catfile(@_);
871}
872
873sub is_exe {
874 my ($name) = @_;
875
3e6d8b86
TC
876 my @exe_suffix = $Config{_exe};
877 if ($^O eq 'MSWin32') {
878 push @exe_suffix, qw/.bat .cmd/;
879 }
880
07ea6c21 881 for my $dir (File::Spec->path) {
3e6d8b86
TC
882 for my $suffix (@exe_suffix) {
883 -x catfile($dir, "$name$suffix")
884 and return 1;
885 }
07ea6c21
TC
886 }
887
888 return;
889}
37959076
TC
890
891sub usage {
892 print STDERR <<EOS;
274cd32b
TC
893Usage: $0 [--enable feature1,feature2,...] [other options]
894 $0 [--disable feature1,feature2,...] [other options]
37959076
TC
895 $0 --help
896Possible feature names are:
897 png gif ungif jpeg tiff T1-fonts TT-fonts freetype2
274cd32b
TC
898Other options:
899 --verbose | -v
900 Verbose library probing (or set IM_VERBOSE in the environment)
901 --nolog
902 Disable logging (or set IM_NOLOG in the environment)
903 --incpath dir
904 Add to the include search path
905 --libpath dir
906 Add to the library search path
37959076
TC
907EOS
908 exit 1;
909
910}
92bda632
TC
911
912# generate the PM MM argument
913# I'd prefer to modify the public version, but there doesn't seem to be
914# a public API to do that
915sub gen_PM {
916 my %pm;
917 my $instbase = '$(INST_LIBDIR)';
918
919 # first the basics, .pm and .pod files
920 $pm{"Imager.pm"} = "$instbase/Imager.pm";
921
922 my $mani = maniread();
923
924 for my $filename (keys %$mani) {
925 if ($filename =~ m!^lib/! && $filename =~ /\.(pm|pod)$/) {
926 (my $work = $filename) =~ s/^lib//;
927 $pm{$filename} = $instbase . $work;
928 }
929 }
930
931 # need the typemap
932 $pm{typemap} = $instbase . '/Imager/typemap';
933
934 # and the core headers
935 for my $filename (keys %$mani) {
936 if ($filename =~ /^\w+\.h$/) {
937 $pm{$filename} = $instbase . '/Imager/include/' . $filename;
938 }
939 }
940
941 # and the generated header
942 $pm{"imconfig.h"} = $instbase . '/Imager/include/imconfig.h';
943
944 \%pm;
945}
135d30e3 946
d8e0c3ba
TC
947my $home;
948sub _tilde_expand {
949 my ($path) = @_;
950
951 if ($path =~ m!^~[/\\]!) {
952 defined $home or $home = $ENV{HOME};
953 if (!defined $home && $^O eq 'MSWin32'
954 && defined $ENV{HOMEDRIVE} && defined $ENV{HOMEPATH}) {
955 $home = $ENV{HOMEDRIVE} . $ENV{HOMEPATH};
956 }
957 unless (defined $home) {
958 $home = eval { (getpwuid($<))[7] };
959 }
960 defined $home or die "You supplied $path, but I can't find your home directory\n";
961 $path =~ s/^~//;
962 $path = File::Spec->catdir($home, $path);
963 }
964
965 $path;
966}
967
678a9a65
TC
968# This isn't a module, but some broken tools, like
969# Module::Depends::Instrusive insist on treating it like one.
970#
971# http://rt.cpan.org/Public/Bug/Display.html?id=21229
972
9731;