document the new test image functions
[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);
10b85929 9use ExtUtils::Liblist;
714cf158 10use vars qw(%formats $VERBOSE $INCPATH $LIBPATH $NOLOG $DEBUG_MALLOC $MANUAL $CFLAGS $LFLAGS $DFLAGS);
812ae05c
TC
11use lib 'inc';
12use Devel::CheckLib;
02d1d628 13
1d7e3124
TC
14# EU::MM runs Makefile.PL all in the same process, so sub-modules will
15# see this
16our $BUILDING_IMAGER = 1;
17
d97c8dbd
TC
18# used to display a summary after we've probed the world
19our %IMAGER_LIBS;
20
02d1d628
AMH
21#
22# IM_INCPATH colon seperated list of paths to extra include paths
23# IM_LIBPATH colon seperated list of paths to extra library paths
24#
25# IM_VERBOSE turns on verbose mode for the library finding and such
26# IM_MANUAL to manually select which libraries are used and which not
27# IM_ENABLE to programmatically select which libraries are used
28# and which are not
29# IM_NOLOG if true logging will not be compiled into the module
30# IM_DEBUG_MALLOC if true malloc debbuging will be compiled into the module
31# do not use IM_DEBUG_MALLOC in production - this slows
32# everything down by alot
33# IM_CFLAGS Extra flags to pass to the compiler
34# IM_LFLAGS Extra flags to pass to the linker
35# IM_DFLAGS Extra flags to pass to the preprocessor
36
812ae05c
TC
37my $KEEP_FILES = $ENV{IMAGER_KEEP_FILES};
38
855c5808
TC
39getenv(); # get environment variables
40
714cf158
TC
41my $lext=$Config{'so'}; # Get extensions of libraries
42my $aext=$Config{'_a'};
43
44my $help; # display help if set
45my @enable; # list of drivers to enable
46my @disable; # or list of drivers to disable
47my @incpaths; # places to look for headers
48my @libpaths; # places to look for libraries
1ef586b1 49my $coverage; # build for coverage testing
b3afeed5 50my $assert; # build with assertions
37959076
TC
51GetOptions("help" => \$help,
52 "enable=s" => \@enable,
53 "disable=s" => \@disable,
54 "incpath=s", \@incpaths,
55 "libpath=s" => \@libpaths,
274cd32b 56 "verbose|v" => \$VERBOSE,
f7450478 57 "nolog" => \$NOLOG,
b3afeed5
TC
58 'coverage' => \$coverage,
59 "assert|a" => \$assert);
60
1d7e3124
TC
61setenv();
62
b3afeed5
TC
63if ($ENV{AUTOMATED_TESTING}) {
64 $assert = 1;
65}
855c5808
TC
66
67if ($VERBOSE) {
68 print "Verbose mode\n";
69 require Data::Dumper;
70 import Data::Dumper qw(Dumper);
71}
37959076
TC
72
73if ($help) {
74 usage();
75}
76
f7450478
TC
77my @defines;
78
274cd32b
TC
79if ($NOLOG) { print "Logging not compiled into module\n"; }
80else {
81 push @defines, [ IMAGER_LOG => 1, "Logging system" ];
82}
83
b3afeed5
TC
84if ($assert) {
85 push @defines, [ IM_ASSERT => 1, "im_assert() are effective" ];
86}
87
274cd32b
TC
88if ($DEBUG_MALLOC) {
89 push @defines, [ IMAGER_DEBUG_MALLOC => 1, "Use Imager's DEBUG malloc()" ];
90 print "Malloc debugging enabled\n";
91}
92
37959076
TC
93if (@enable && @disable) {
94 print STDERR "Only --enable or --disable can be used, not both, try --help\n";
95 exit 1;
96}
02d1d628 97
714cf158
TC
98my %definc;
99my %deflib;
100my @incs; # all the places to look for headers
101my @libs; # all the places to look for libraries
102
02d1d628
AMH
103init(); # initialize global data
104pathcheck(); # Check if directories exist
105
37959076
TC
106if (exists $ENV{IM_ENABLE}) {
107 my %en = map { $_, 1 } split ' ', $ENV{IM_ENABLE};
108 for my $key (keys %formats) {
109 delete $formats{$key} unless $en{$key};
110 }
111}
112if (@enable) {
113 my %en = map { $_ => 1 } map { split /,/ } @enable;
114 for my $key (keys %formats) {
115 delete $formats{$key} unless $en{$key};
116 }
117}
118elsif (@disable) {
119 delete @formats{map { split /,/ } @disable};
120}
121
02d1d628
AMH
122# Pick what libraries are used
123if ($MANUAL) {
124 manual();
125} else {
126 automatic();
02d1d628
AMH
127}
128
07ea6c21 129my $lib_cflags = '';
a8395b42 130my $lib_lflags = '';
80c15fc7
TC
131my $F_LIBS = '';
132my $F_OBJECT = '';
714cf158 133for my $frmkey (sort { $formats{$a}{order} <=> $formats{$b}{order} } keys %formats) {
e11d297f
TC
134 my $frm = $formats{$frmkey};
135 push @defines, [ $frm->{def}, 1, "$frmkey available" ];
02d1d628 136 $F_OBJECT .= ' ' .$frm->{objfiles};
714cf158
TC
137 if ($frm->{cflags}) {
138 $lib_cflags .= ' ' .$frm->{cflags};
139 ++$definc{$_} for map { /^-I(.*)$/ ? ($1) : () }
140 grep /^-I./, split ' ', $frm->{cflags};
141 }
a8395b42
TC
142 if ($frm->{lflags}) {
143 $lib_lflags .= ' ' . $frm->{lflags};
144 }
145 else {
146 $F_LIBS .= ' ' .$frm->{libfiles};
147 }
148
02d1d628 149}
714cf158 150
714cf158
TC
151my $F_INC = join ' ', map "-I$_", map / / ? qq{"$_"} : $_,
152 grep !$definc{$_}, @incs;
153$F_LIBS = join(' ',map "-L$_", map / / ? qq{"$_"} : $_,
154 grep !$deflib{$_}++, @libs) . $F_LIBS;
02d1d628 155
714cf158
TC
156my $OSLIBS = '';
157my $OSDEF = "-DOS_$^O";
02d1d628
AMH
158
159if ($^O eq 'hpux') { $OSLIBS .= ' -ldld'; }
160if (defined $Config{'d_dlsymun'}) { $OSDEF .= ' -DDLSYMUN'; }
161
714cf158 162my @objs = qw(Imager.o draw.o polygon.o image.o io.o iolayer.o
b47464c1 163 log.o gaussian.o conv.o pnm.o raw.o feat.o font.o combine.o
714cf158
TC
164 filters.o dynaload.o stackmach.o datatypes.o
165 regmach.o trans2.o quant.o error.o convert.o
a2f9a61c 166 map.o tags.o palimg.o maskimg.o img8.o img16.o rotate.o
d5477d3d 167 bmp.o tga.o color.o fills.o imgdouble.o limits.o hlines.o
e41cfe8f 168 imext.o scale.o rubthru.o render.o paste.o compose.o flip.o);
92bda632 169
714cf158
TC
170my %opts=(
171 'NAME' => 'Imager',
172 'VERSION_FROM' => 'Imager.pm',
a8395b42 173 'LIBS' => "$LFLAGS -lm $lib_lflags $OSLIBS $F_LIBS",
714cf158
TC
174 'DEFINE' => "$OSDEF $CFLAGS",
175 'INC' => "$lib_cflags $DFLAGS $F_INC",
176 'OBJECT' => join(' ', @objs, $F_OBJECT),
f45b774f 177 clean => { FILES=>'testout rubthru.c scale.c conv.c filters.c gaussian.c render.c rubthru.c' },
714cf158 178 PM => gen_PM(),
867acf5b 179 PREREQ_PM => { 'Test::More' => 0.47 },
714cf158 180 );
02d1d628 181
1ef586b1
TC
182if ($coverage) {
183 if ($Config{gccversion}) {
184 push @ARGV, 'OPTIMIZE=-ftest-coverage -fprofile-arcs';
185 #$opts{dynamic_lib} = { OTHERLDFLAGS => '-ftest-coverage -fprofile-arcs' };
186 }
187 else {
188 die "Don't know the coverage C flags for your compiler\n";
189 }
190}
191
c52cbef2
TC
192# eval to prevent warnings about versions with _ in them
193my $MM_ver = eval $ExtUtils::MakeMaker::VERSION;
194if ($MM_ver > 6.06) {
5b480b14 195 $opts{AUTHOR} = 'Tony Cook <tonyc@cpan.org>, Arnar M. Hrafnkelsson';
ca508100
TC
196 $opts{ABSTRACT} = 'Perl extension for Generating 24 bit Images';
197}
f45b774f
TC
198
199if ($MM_ver >= 6.46) {
200 $opts{META_MERGE} =
201 {
202 recommends =>
203 {
204 "Parse::RecDescent" => 0
205 },
206 license => "perl",
207 dynamic_config => 1,
43452432
TC
208 no_index =>
209 {
210 directory =>
211 [
212 "PNG",
ec6d8908 213 "GIF",
797a9f9c
TC
214 "TIFF",
215 "JPEG",
bd7c1b36 216 "W32",
d7ca2089 217 "FT2",
85702fbd 218 "T1",
43452432
TC
219 ],
220 },
221 resources =>
222 {
223 homepage => "http://imager.perl.org/",
4989229f
TC
224 repository => "git://git.imager.perl.org/imager.git",
225 bugtracker => "http://rt.cpan.org/NoAuth/Bugs.html?Dist=Imager",
43452432 226 },
f45b774f 227 };
135d30e3 228}
ca508100 229
e11d297f
TC
230make_imconfig(\@defines);
231
02d1d628
AMH
232if ($VERBOSE) { print Dumper(\%opts); }
233mkdir('testout',0777); # since we cannot include it in the archive.
135d30e3 234
812ae05c
TC
235-d "probe" and rmdir "probe";
236
02d1d628 237WriteMakefile(%opts);
4dce694d 238
d97c8dbd
TC
239my @good;
240my @bad;
241for my $name (sort { lc $a cmp lc $b } keys %IMAGER_LIBS) {
242 if ($IMAGER_LIBS{$name}) {
243 push @good, $name;
244 }
245 else {
246 push @bad, $name;
247 }
248}
249
250print "\n";
251print "Libraries found:\n" if @good;
252print " $_\n" for @good;
253print "Libraries *not* found:\n" if @bad;
254print " $_\n" for @bad;
255
02d1d628
AMH
256exit;
257
258
259sub MY::postamble {
5a7e62b6
TC
260 my $self = shift;
261 my $perl = $self->{PERLRUN} ? '$(PERLRUN)' : '$(PERL)';
fe415ad2
TC
262 my $mani = maniread;
263
264 my @ims = grep /\.im$/, keys %$mani;
02d1d628 265'
faa9b3e7 266dyntest.$(MYEXTLIB) : dynfilt/Makefile
02d1d628
AMH
267 cd dynfilt && $(MAKE) $(PASTHRU)
268
269lib/Imager/Regops.pm : regmach.h regops.perl
270 $(PERL) regops.perl regmach.h lib/Imager/Regops.pm
e11d297f 271
92bda632 272imconfig.h : Makefile.PL
e11d297f
TC
273 $(ECHO) "imconfig.h out-of-date with respect to $?"
274 $(PERLRUN) Makefile.PL
275 $(ECHO) "==> Your Makefile has been rebuilt - re-run your make command <=="
5a7e62b6 276'.qq!
6cfee9d1 277lib/Imager/APIRef.pod : \$(C_FILES) \$(H_FILES) apidocs.perl
2a69ed21 278 $perl apidocs.perl lib/Imager/APIRef.pod
92bda632 279
fe415ad2
TC
280!.join('', map _im_rule($perl, $_), @ims)
281
282}
283
284sub _im_rule {
285 my ($perl, $im) = @_;
286
287 (my $c = $im) =~ s/\.im$/.c/;
288 return <<MAKE;
289
9b1ec2b8
TC
290$c: $im lib/Imager/Preprocess.pm
291 $perl -Ilib -MImager::Preprocess -epreprocess $im $c
fe415ad2
TC
292
293MAKE
02d1d628 294
55932d2a
TC
295}
296
02d1d628
AMH
297# manual configuration of helper libraries
298
299sub manual {
300 print <<EOF;
301
302 Please answer the following questions about
303 which formats are avaliable on your computer
304
305press <return> to continue
306EOF
307
308 <STDIN>; # eat one return
309
2646b26c 310 for my $frm(sort { $formats{$b}{order} <=> $formats{$a}{order} } keys %formats) {
02d1d628
AMH
311 SWX:
312 if ($formats{$frm}{docs}) { print "\n",$formats{$frm}{docs},"\n\n"; }
313 print "Enable $frm support: ";
714cf158 314 my $gz = <STDIN>;
02d1d628
AMH
315 chomp($gz);
316 if ($gz =~ m/^(y|yes|n|no)/i) {
317 $gz=substr(lc($gz),0,1);
318 if ($gz eq 'n') {
319 delete $formats{$frm};
320 }
321 } else { goto SWX; }
322 }
323}
324
325
326# automatic configuration of helper libraries
327
328sub automatic {
714cf158
TC
329 print "Automatic probing:\n" if $VERBOSE;
330 for my $frm (sort { $formats{$a}{order} <=> $formats{$b}{order} } keys %formats) {
02d1d628
AMH
331 delete $formats{$frm} if !checkformat($frm);
332 }
333}
334
c6e870ae
TC
335sub grep_directory {
336 my($path, $chk)=@_;
02d1d628
AMH
337
338# print "checking path $path\n";
339 if ( !opendir(DH,$path) ) {
340 warn "Cannot open dir $path: $!\n";
341 return;
342 }
343 my @l=grep { $chk->($_) } readdir(DH);
344 # print @l;
345 close(DH);
346 return map $path, @l;
347}
348
812ae05c
TC
349sub _probe_default {
350 my ($format, $frm) = @_;
07ea6c21 351
c6e870ae
TC
352 my $lib_check=$formats{$frm}{'libcheck'};
353 my $inc_check=$formats{$frm}{'inccheck'};
02d1d628 354
c6e870ae
TC
355 if ($lib_check) {
356 my @l;
357 for my $lp (@libs) {
358 push(@l, grep_directory($lp,$lib_check));
359 }
360
361 my @i;
362 for my $ip (@incs) {
363 push(@i, $ip) if $inc_check->($ip,$frm);
364 }
365
366 printf("%10s: includes %s - libraries %s\n",$frm,(@i?'found':'not found'),(@l?'found':'not found'));
367 $formats{$frm}{incdir} = \@i;
368 $formats{$frm}{libdir} = \@l;
369 return 1 if scalar(@i && @l);
02d1d628 370 }
c6e870ae
TC
371 else {
372 printf("%10s: not available\n", $frm);
02d1d628
AMH
373 }
374
c6e870ae 375 return 0;
02d1d628
AMH
376}
377
812ae05c
TC
378sub checkformat {
379 my $frm=shift;
380
381 print " checkformat($frm)\n" if $VERBOSE;
382
383 my $format = $formats{$frm};
384
385 my @probes;
386 if (my $code = $format->{'code'}) {
387 if (ref $code eq 'ARRAY') {
388 push @probes, @$code;
389 }
390 else {
391 push @probes, $code;
392 }
393 }
394 push @probes, \&_probe_default;
395
396 print " Calling probe function\n" if $VERBOSE;
397 my $found;
398 for my $func (@probes) {
399 if ($func->($format, $frm)) {
400 ++$found;
401 last;
402 }
403 }
404
405 $found or return;
406
407 if ($format->{postcheck}) {
408 print " Calling postcheck function\n" if $VERBOSE;
409 $format->{postcheck}->($format, $frm)
410 or return;
411 }
412
413 return 1;
414}
415
02d1d628 416
02d1d628
AMH
417sub pathcheck {
418 if ($VERBOSE) {
419 print "pathcheck\n";
420 print " Include paths:\n";
421 for (@incs) { print $_,"\n"; }
422 }
3a6bb91b 423 @incs=grep { -d $_ && -r _ && -x _ or ( print(" $_ doesnt exist or is unaccessible - removed.\n"),0) } @incs;
02d1d628
AMH
424
425 if ($VERBOSE) {
426 print "\nLibrary paths:\n";
855c5808 427 for (@libs) { print $_,"\n"; }
02d1d628 428 }
3a6bb91b 429 @libs=grep { -d $_ && -r _ && -x _ or ( print(" $_ doesnt exist or is unaccessible - removed.\n"),0) } @libs;
02d1d628
AMH
430 print "\ndone.\n";
431}
432
433
434# Format data initialization
435
436# format definition is:
437# defines needed
438# default include path
439# files needed for include (boolean perl code)
440# default lib path
441# libs needed
442# files needed for link (boolean perl code)
443# object files needed for the format
444
445
446sub init {
447
714cf158
TC
448 my @definc = qw(/usr/include);
449 @definc{@definc}=(1) x @definc;
d8e0c3ba
TC
450 @incs=
451 (
452 split(/\Q$Config{path_sep}/, $INCPATH),
453 map _tilde_expand($_), map { split /\Q$Config{path_sep}/ } @incpaths
454 );
2646b26c 455 if ($Config{locincpth}) {
6552acfe 456 push @incs, grep -d, split ' ', $Config{locincpth};
2646b26c 457 }
88a763e2
TC
458 if ($^O =~ /win32/i && $Config{cc} =~ /\bcl\b/i) {
459 push(@incs, split /;/, $ENV{INCLUDE}) if exists $ENV{INCLUDE};
2646b26c 460 }
16cf4610
TC
461 if ($Config{incpath}) {
462 push @incs, grep -d, split /\Q$Config{path_sep}/, $Config{incpath};
463 }
6552acfe 464 push @incs, grep -d,
2646b26c
TC
465 qw(/sw/include
466 /usr/include/freetype2
467 /usr/local/include/freetype2
468 /usr/local/include/freetype1/freetype
37959076 469 /usr/include /usr/local/include /usr/include/freetype
2646b26c 470 /usr/local/include/freetype);
714cf158
TC
471 if ($Config{ccflags}) {
472 my @hidden = map { /^-I(.*)$/ ? ($1) : () } split ' ', $Config{ccflags};
473 push @incs, @hidden;
474 @definc{@hidden} = (1) x @hidden;
475 }
2646b26c 476
37959076 477 @libs= ( split(/\Q$Config{path_sep}/,$LIBPATH),
d8e0c3ba 478 map _tilde_expand($_), map { split /\Q$Config{path_sep}/} @libpaths );
2646b26c 479 if ($Config{loclibpth}) {
6552acfe 480 push @libs, grep -d, split ' ', $Config{loclibpth};
2646b26c 481 }
714cf158 482
6552acfe 483 push @libs, grep -d, qw(/sw/lib), split(/ /, $Config{'libpth'});
714cf158 484 push @libs, grep -d, split / /, $Config{libspath} if $Config{libspath};
2646b26c 485 if ($^O =~ /win32/i && $Config{cc} =~ /\bcl\b/i) {
88a763e2
TC
486 push(@libs, split /;/, $ENV{LIB}) if exists $ENV{LIB};
487 }
faa9b3e7
TC
488 if ($^O eq 'cygwin') {
489 push(@libs, '/usr/lib/w32api') if -d '/usr/lib/w32api';
274cd32b 490 push(@incs, '/usr/include/w32api') if -d '/usr/include/w32api';
faa9b3e7 491 }
714cf158
TC
492 if ($Config{ldflags}) {
493 # some builds of perl put -Ldir into ldflags without putting it in
494 # loclibpth, let's extract them
495 my @hidden = grep -d, map { /^-L(.*)$/ ? ($1) : () }
496 split ' ', $Config{ldflags};
497 push @libs, @hidden;
498 # don't mark them as seen - EU::MM will remove any libraries
499 # it can't find and it doesn't look for -L in ldflags
500 #@deflib{@hidden} = @hidden;
501 }
ed28c9cc 502 push @libs, grep -d, qw(/usr/local/lib);
2646b26c 503
f8e9bc07
TC
504 $formats{'TT-fonts'}=
505 {
506 order=>'31',
507 def=>'HAVE_LIBTT',
508 inccheck=>sub { -e catfile($_[0], 'freetype.h')
509 && !-e catfile($_[0], 'fterrors.h') },
510 libcheck=>sub { $_[0] eq "libttf$aext" or $_[0] eq "libttf.$lext" },
511 libfiles=>'-lttf',
512 objfiles=>'',
714cf158 513 code => \&freetype1_probe,
f8e9bc07
TC
514 docs=>q{
515Truetype fonts are scalable fonts. They can include
516kerning and hinting information and generally yield good
517visual quality esp on low resultions. The freetype library is
518used to rasterize for us. The only drawback is that there
519are alot of badly designed fonts out there.}
02d1d628
AMH
520 };
521 # Make fix indent
522 for (keys %formats) { $formats{$_}->{docs} =~ s/^\s+/ /mg; }
523}
524
525
526
527sub gen {
528 my $V = $ENV{$_[0]};
529 defined($V) ? $V : "";
530}
531
532
533# Get information from environment variables
534
535sub getenv {
536
537 ($VERBOSE,
538 $INCPATH,
539 $LIBPATH,
540 $NOLOG,
541 $DEBUG_MALLOC,
542 $MANUAL,
543 $CFLAGS,
544 $LFLAGS,
545 $DFLAGS) = map { gen $_ } qw(IM_VERBOSE
546 IM_INCPATH
547 IM_LIBPATH
548 IM_NOLOG
549 IM_DEBUG_MALLOC
550 IM_MANUAL
551 IM_CFLAGS
552 IM_LFLAGS
553 IM_DFLAGS);
554
02d1d628 555}
07ea6c21 556
1d7e3124
TC
557# populate the environment so that sub-modules get the same info
558sub setenv {
559 $ENV{IM_VERBOSE} = 1 if $VERBOSE;
560 $ENV{IM_INCPATH} = join $Config{path_sep}, @incpaths if @incpaths;
561 $ENV{IM_LIBPATH} = join $Config{path_sep}, @libpaths if @libpaths;
562}
563
e11d297f
TC
564sub make_imconfig {
565 my ($defines) = @_;
566
567 open CONFIG, "> imconfig.h"
568 or die "Cannot create imconfig.h: $!\n";
569 print CONFIG <<EOS;
570/* This file is automatically generated by Makefile.PL.
571 Don't edit this file, since any changes will be lost */
572
573#ifndef IMAGER_IMCONFIG_H
574#define IMAGER_IMCONFIG_H
575EOS
576 for my $define (@$defines) {
577 if ($define->[2]) {
578 print CONFIG "\n/*\n $define->[2]\n*/\n\n";
579 }
580 print CONFIG "#define $define->[0] $define->[1]\n";
581 }
53ea6b6f 582 if ($Config{gccversion} && $Config{gccversion} =~ /^([0-9]+)/ && $1 > 3) {
8d14daab
TC
583 print CONFIG <<EOS;
584/*
585
586Compiler supports the GCC __attribute__((format...)) syntax.
587
588*/
589
590#define IMAGER_FORMAT_ATTR 1
53ea6b6f 591
86c8d19a
TC
592EOS
593 }
594
595 if ($Config{d_snprintf}) {
596 print CONFIG <<EOS;
597/* We can use snprintf() */
598#define IMAGER_SNPRINTF 1
599
600EOS
601 }
602
603 if ($Config{d_vsnprintf}) {
604 print CONFIG <<EOS;
605/* We can use vsnprintf() */
606#define IMAGER_VSNPRINTF 1
607
8d14daab
TC
608EOS
609 }
610
611 print CONFIG <<EOS;
612/*
613 Type and format code for formatted output as with printf.
614
615 This is intended for formatting i_img_dim values.
616*/
617typedef $Config{ivtype} i_dim_format_t;
618#define i_DF $Config{ivdformat}
619EOS
620
e11d297f
TC
621 print CONFIG "\n#endif\n";
622 close CONFIG;
623}
624
714cf158
TC
625# probes for freetype1 by scanning @incs for the includes and
626# @libs for the libs. This is done separately because freetype's headers
627# are stored in a freetype or freetype1 directory under PREFIX/include.
628#
629# we could find the files with the existing mechanism, but it won't set
630# -I flags correctly.
631#
632# This could be extended to freetype2 too, but freetype-config catches
633# that
634sub freetype1_probe {
635 my ($frm, $frmkey) = @_;
636
637 my $found_inc;
638 INCS:
639 for my $inc (@incs) {
640 for my $subdir (qw/freetype freetype1/) {
641 my $path = File::Spec->catfile($inc, $subdir, 'freetype.h');
642 -e $path or next;
643 $path = File::Spec->catfile($inc, $subdir, 'fterrors.h');
644 -e $path and next;
645
646 $found_inc = File::Spec->catdir($inc, $subdir);
647 last INCS;
648 }
649 }
650
651 my $found_lib;
652 LIBS:
653 for my $lib (@libs) {
654 my $a_path = File::Spec->catfile($lib, "libttf$aext");
655 my $l_path = File::Spec->catfile($lib, "libttf.$lext");
656 if (-e $a_path || -e $l_path) {
657 $found_lib = $lib;
658 last LIBS;
659 }
660 }
661
89d37182 662 return unless $found_inc && $found_lib;
714cf158
TC
663 printf("%10s: includes %s - libraries %s\n", $frmkey,
664 ($found_inc ? 'found' : 'not found'),
665 ($found_lib ? 'found' : 'not found'));
714cf158
TC
666
667 $frm->{cflags} = "-I$found_inc";
668 $frm->{libfiles} = "-lttf";
669
670 return 1;
671}
672
07ea6c21
TC
673sub catfile {
674 return File::Spec->catfile(@_);
675}
676
37959076
TC
677sub usage {
678 print STDERR <<EOS;
274cd32b
TC
679Usage: $0 [--enable feature1,feature2,...] [other options]
680 $0 [--disable feature1,feature2,...] [other options]
37959076
TC
681 $0 --help
682Possible feature names are:
85702fbd 683 T1-fonts
274cd32b
TC
684Other options:
685 --verbose | -v
686 Verbose library probing (or set IM_VERBOSE in the environment)
687 --nolog
688 Disable logging (or set IM_NOLOG in the environment)
689 --incpath dir
690 Add to the include search path
691 --libpath dir
692 Add to the library search path
35a15603
TC
693 --coverage
694 Build for coverage testing.
695 --assert
696 Build with assertions active.
37959076
TC
697EOS
698 exit 1;
699
700}
92bda632
TC
701
702# generate the PM MM argument
703# I'd prefer to modify the public version, but there doesn't seem to be
704# a public API to do that
705sub gen_PM {
706 my %pm;
707 my $instbase = '$(INST_LIBDIR)';
708
709 # first the basics, .pm and .pod files
710 $pm{"Imager.pm"} = "$instbase/Imager.pm";
711
712 my $mani = maniread();
713
714 for my $filename (keys %$mani) {
715 if ($filename =~ m!^lib/! && $filename =~ /\.(pm|pod)$/) {
716 (my $work = $filename) =~ s/^lib//;
717 $pm{$filename} = $instbase . $work;
718 }
719 }
720
721 # need the typemap
722 $pm{typemap} = $instbase . '/Imager/typemap';
723
724 # and the core headers
725 for my $filename (keys %$mani) {
726 if ($filename =~ /^\w+\.h$/) {
727 $pm{$filename} = $instbase . '/Imager/include/' . $filename;
728 }
729 }
730
731 # and the generated header
732 $pm{"imconfig.h"} = $instbase . '/Imager/include/imconfig.h';
733
734 \%pm;
735}
135d30e3 736
d8e0c3ba
TC
737my $home;
738sub _tilde_expand {
739 my ($path) = @_;
740
741 if ($path =~ m!^~[/\\]!) {
742 defined $home or $home = $ENV{HOME};
743 if (!defined $home && $^O eq 'MSWin32'
744 && defined $ENV{HOMEDRIVE} && defined $ENV{HOMEPATH}) {
745 $home = $ENV{HOMEDRIVE} . $ENV{HOMEPATH};
746 }
747 unless (defined $home) {
748 $home = eval { (getpwuid($<))[7] };
749 }
750 defined $home or die "You supplied $path, but I can't find your home directory\n";
751 $path =~ s/^~//;
752 $path = File::Spec->catdir($home, $path);
753 }
754
755 $path;
756}
757
678a9a65 7581;