0.84 release
[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",
43452432
TC
218 ],
219 },
220 resources =>
221 {
222 homepage => "http://imager.perl.org/",
4989229f
TC
223 repository => "git://git.imager.perl.org/imager.git",
224 bugtracker => "http://rt.cpan.org/NoAuth/Bugs.html?Dist=Imager",
43452432 225 },
f45b774f 226 };
135d30e3 227}
ca508100 228
e11d297f
TC
229make_imconfig(\@defines);
230
02d1d628
AMH
231if ($VERBOSE) { print Dumper(\%opts); }
232mkdir('testout',0777); # since we cannot include it in the archive.
135d30e3 233
812ae05c
TC
234-d "probe" and rmdir "probe";
235
02d1d628 236WriteMakefile(%opts);
4dce694d 237
d97c8dbd
TC
238my @good;
239my @bad;
240for my $name (sort { lc $a cmp lc $b } keys %IMAGER_LIBS) {
241 if ($IMAGER_LIBS{$name}) {
242 push @good, $name;
243 }
244 else {
245 push @bad, $name;
246 }
247}
248
249print "\n";
250print "Libraries found:\n" if @good;
251print " $_\n" for @good;
252print "Libraries *not* found:\n" if @bad;
253print " $_\n" for @bad;
254
02d1d628
AMH
255exit;
256
257
258sub MY::postamble {
5a7e62b6
TC
259 my $self = shift;
260 my $perl = $self->{PERLRUN} ? '$(PERLRUN)' : '$(PERL)';
fe415ad2
TC
261 my $mani = maniread;
262
263 my @ims = grep /\.im$/, keys %$mani;
02d1d628 264'
faa9b3e7 265dyntest.$(MYEXTLIB) : dynfilt/Makefile
02d1d628
AMH
266 cd dynfilt && $(MAKE) $(PASTHRU)
267
268lib/Imager/Regops.pm : regmach.h regops.perl
269 $(PERL) regops.perl regmach.h lib/Imager/Regops.pm
e11d297f 270
92bda632 271imconfig.h : Makefile.PL
e11d297f
TC
272 $(ECHO) "imconfig.h out-of-date with respect to $?"
273 $(PERLRUN) Makefile.PL
274 $(ECHO) "==> Your Makefile has been rebuilt - re-run your make command <=="
5a7e62b6 275'.qq!
6cfee9d1 276lib/Imager/APIRef.pod : \$(C_FILES) \$(H_FILES) apidocs.perl
2a69ed21 277 $perl apidocs.perl lib/Imager/APIRef.pod
92bda632 278
fe415ad2
TC
279!.join('', map _im_rule($perl, $_), @ims)
280
281}
282
283sub _im_rule {
284 my ($perl, $im) = @_;
285
286 (my $c = $im) =~ s/\.im$/.c/;
287 return <<MAKE;
288
9b1ec2b8
TC
289$c: $im lib/Imager/Preprocess.pm
290 $perl -Ilib -MImager::Preprocess -epreprocess $im $c
fe415ad2
TC
291
292MAKE
02d1d628 293
55932d2a
TC
294}
295
02d1d628
AMH
296# manual configuration of helper libraries
297
298sub manual {
299 print <<EOF;
300
301 Please answer the following questions about
302 which formats are avaliable on your computer
303
304press <return> to continue
305EOF
306
307 <STDIN>; # eat one return
308
2646b26c 309 for my $frm(sort { $formats{$b}{order} <=> $formats{$a}{order} } keys %formats) {
02d1d628
AMH
310 SWX:
311 if ($formats{$frm}{docs}) { print "\n",$formats{$frm}{docs},"\n\n"; }
312 print "Enable $frm support: ";
714cf158 313 my $gz = <STDIN>;
02d1d628
AMH
314 chomp($gz);
315 if ($gz =~ m/^(y|yes|n|no)/i) {
316 $gz=substr(lc($gz),0,1);
317 if ($gz eq 'n') {
318 delete $formats{$frm};
319 }
320 } else { goto SWX; }
321 }
322}
323
324
325# automatic configuration of helper libraries
326
327sub automatic {
714cf158
TC
328 print "Automatic probing:\n" if $VERBOSE;
329 for my $frm (sort { $formats{$a}{order} <=> $formats{$b}{order} } keys %formats) {
02d1d628
AMH
330 delete $formats{$frm} if !checkformat($frm);
331 }
332}
333
334
ec6d8908
TC
335# sub gifcheck {
336# if ($formats{'gif'} and $formats{'ungif'}) {
337# print "ungif and gif can not coexist - removing ungif support\n";
338# delete $formats{'ungif'};
339# }
5f5fe73e 340
ec6d8908
TC
341# for my $frm (qw(gif ungif)) {
342# checkformat($frm) if ($MANUAL and $formats{$frm});
343# }
09fd3468 344
ec6d8908
TC
345# my @dirs;
346# for my $frm (grep $formats{$_}, qw(gif ungif)) {
347# push(@dirs, @{$formats{$frm}{incdir}}) if $formats{$frm}{incdir};
348# }
349# my $minor = 0;
350# my $major = 0;
351# FILES: for my $dir (@dirs) {
352# my $h = "$dir/gif_lib.h";
353# open H, "< $h" or next;
354# while (<H>) {
355# if (/GIF_LIB_VERSION\s+"\s*version\s*(\d+)\.(\d+)/i) {
356# $major = $1;
357# $minor = $2;
358# close H;
359# last FILES;
360# }
361# }
362# close H;
363# }
02d1d628 364
ec6d8908 365# # we need the version in a #ifdefable form
4dce694d 366
ec6d8908
TC
367# push @defines, [ IM_GIFMAJOR => $major, "Parsed giflib version" ];
368# push @defines, [ IM_GIFMINOR => $minor ];
369# push @defines, [ IM_NO_SET_GIF_VERSION => 1, "Disable EGifSetGifVersion" ]
370# if $no_gif_set_version;
371# }
02d1d628
AMH
372
373
c6e870ae
TC
374sub grep_directory {
375 my($path, $chk)=@_;
02d1d628
AMH
376
377# print "checking path $path\n";
378 if ( !opendir(DH,$path) ) {
379 warn "Cannot open dir $path: $!\n";
380 return;
381 }
382 my @l=grep { $chk->($_) } readdir(DH);
383 # print @l;
384 close(DH);
385 return map $path, @l;
386}
387
812ae05c
TC
388sub _probe_default {
389 my ($format, $frm) = @_;
07ea6c21 390
c6e870ae
TC
391 my $lib_check=$formats{$frm}{'libcheck'};
392 my $inc_check=$formats{$frm}{'inccheck'};
02d1d628 393
c6e870ae
TC
394 if ($lib_check) {
395 my @l;
396 for my $lp (@libs) {
397 push(@l, grep_directory($lp,$lib_check));
398 }
399
400 my @i;
401 for my $ip (@incs) {
402 push(@i, $ip) if $inc_check->($ip,$frm);
403 }
404
405 printf("%10s: includes %s - libraries %s\n",$frm,(@i?'found':'not found'),(@l?'found':'not found'));
406 $formats{$frm}{incdir} = \@i;
407 $formats{$frm}{libdir} = \@l;
408 return 1 if scalar(@i && @l);
02d1d628 409 }
c6e870ae
TC
410 else {
411 printf("%10s: not available\n", $frm);
02d1d628
AMH
412 }
413
c6e870ae 414 return 0;
02d1d628
AMH
415}
416
812ae05c
TC
417sub checkformat {
418 my $frm=shift;
419
420 print " checkformat($frm)\n" if $VERBOSE;
421
422 my $format = $formats{$frm};
423
424 my @probes;
425 if (my $code = $format->{'code'}) {
426 if (ref $code eq 'ARRAY') {
427 push @probes, @$code;
428 }
429 else {
430 push @probes, $code;
431 }
432 }
433 push @probes, \&_probe_default;
434
435 print " Calling probe function\n" if $VERBOSE;
436 my $found;
437 for my $func (@probes) {
438 if ($func->($format, $frm)) {
439 ++$found;
440 last;
441 }
442 }
443
444 $found or return;
445
446 if ($format->{postcheck}) {
447 print " Calling postcheck function\n" if $VERBOSE;
448 $format->{postcheck}->($format, $frm)
449 or return;
450 }
451
452 return 1;
453}
454
02d1d628 455
02d1d628
AMH
456sub pathcheck {
457 if ($VERBOSE) {
458 print "pathcheck\n";
459 print " Include paths:\n";
460 for (@incs) { print $_,"\n"; }
461 }
3a6bb91b 462 @incs=grep { -d $_ && -r _ && -x _ or ( print(" $_ doesnt exist or is unaccessible - removed.\n"),0) } @incs;
02d1d628
AMH
463
464 if ($VERBOSE) {
465 print "\nLibrary paths:\n";
855c5808 466 for (@libs) { print $_,"\n"; }
02d1d628 467 }
3a6bb91b 468 @libs=grep { -d $_ && -r _ && -x _ or ( print(" $_ doesnt exist or is unaccessible - removed.\n"),0) } @libs;
02d1d628
AMH
469 print "\ndone.\n";
470}
471
472
473# Format data initialization
474
475# format definition is:
476# defines needed
477# default include path
478# files needed for include (boolean perl code)
479# default lib path
480# libs needed
481# files needed for link (boolean perl code)
482# object files needed for the format
483
484
485sub init {
486
714cf158
TC
487 my @definc = qw(/usr/include);
488 @definc{@definc}=(1) x @definc;
d8e0c3ba
TC
489 @incs=
490 (
491 split(/\Q$Config{path_sep}/, $INCPATH),
492 map _tilde_expand($_), map { split /\Q$Config{path_sep}/ } @incpaths
493 );
2646b26c 494 if ($Config{locincpth}) {
6552acfe 495 push @incs, grep -d, split ' ', $Config{locincpth};
2646b26c 496 }
88a763e2
TC
497 if ($^O =~ /win32/i && $Config{cc} =~ /\bcl\b/i) {
498 push(@incs, split /;/, $ENV{INCLUDE}) if exists $ENV{INCLUDE};
2646b26c 499 }
16cf4610
TC
500 if ($Config{incpath}) {
501 push @incs, grep -d, split /\Q$Config{path_sep}/, $Config{incpath};
502 }
6552acfe 503 push @incs, grep -d,
2646b26c
TC
504 qw(/sw/include
505 /usr/include/freetype2
506 /usr/local/include/freetype2
507 /usr/local/include/freetype1/freetype
37959076 508 /usr/include /usr/local/include /usr/include/freetype
2646b26c 509 /usr/local/include/freetype);
714cf158
TC
510 if ($Config{ccflags}) {
511 my @hidden = map { /^-I(.*)$/ ? ($1) : () } split ' ', $Config{ccflags};
512 push @incs, @hidden;
513 @definc{@hidden} = (1) x @hidden;
514 }
2646b26c 515
37959076 516 @libs= ( split(/\Q$Config{path_sep}/,$LIBPATH),
d8e0c3ba 517 map _tilde_expand($_), map { split /\Q$Config{path_sep}/} @libpaths );
2646b26c 518 if ($Config{loclibpth}) {
6552acfe 519 push @libs, grep -d, split ' ', $Config{loclibpth};
2646b26c 520 }
714cf158 521
6552acfe 522 push @libs, grep -d, qw(/sw/lib), split(/ /, $Config{'libpth'});
714cf158 523 push @libs, grep -d, split / /, $Config{libspath} if $Config{libspath};
2646b26c 524 if ($^O =~ /win32/i && $Config{cc} =~ /\bcl\b/i) {
88a763e2
TC
525 push(@libs, split /;/, $ENV{LIB}) if exists $ENV{LIB};
526 }
faa9b3e7
TC
527 if ($^O eq 'cygwin') {
528 push(@libs, '/usr/lib/w32api') if -d '/usr/lib/w32api';
274cd32b 529 push(@incs, '/usr/include/w32api') if -d '/usr/include/w32api';
faa9b3e7 530 }
714cf158
TC
531 if ($Config{ldflags}) {
532 # some builds of perl put -Ldir into ldflags without putting it in
533 # loclibpth, let's extract them
534 my @hidden = grep -d, map { /^-L(.*)$/ ? ($1) : () }
535 split ' ', $Config{ldflags};
536 push @libs, @hidden;
537 # don't mark them as seen - EU::MM will remove any libraries
538 # it can't find and it doesn't look for -L in ldflags
539 #@deflib{@hidden} = @hidden;
540 }
ed28c9cc 541 push @libs, grep -d, qw(/usr/local/lib);
2646b26c 542
797a9f9c
TC
543# $formats{'jpeg'}={
544# order=>'21',
545# def=>'HAVE_LIBJPEG',
546# inccheck=>sub { -e catfile($_[0], 'jpeglib.h') },
547# libcheck=>sub { $_[0] eq "libjpeg$aext" or $_ eq "libjpeg.$lext" },
548# libfiles=>'-ljpeg',
549# objfiles=>'jpeg.o',
550# docs=>q{
551# In order to use jpeg with this module you need to have libjpeg
552# installed on your computer}
553# };
02d1d628 554
e5ee047b
TC
555# $formats{'tiff'}={
556# order=>'23',
557# def=>'HAVE_LIBTIFF',
558# inccheck=>sub { -e catfile($_[0], 'tiffio.h') },
559# libcheck=>sub { $_[0] eq "libtiff$aext" or $_ eq "libtiff.$lext" },
560# libfiles=>'-ltiff',
561# objfiles=>'tiff.o',
562# docs=>q{
563# In order to use tiff with this module you need to have libtiff
564# installed on your computer},
565# postcheck => \&postcheck_tiff,
566# };
02d1d628 567
1d7e3124
TC
568# $formats{'png'}={
569# order=>'22',
570# def=>'HAVE_LIBPNG',
571# inccheck=>sub { -e catfile($_[0], 'png.h') },
572# libcheck=>sub { $_[0] eq "libpng$aext" or $_[0] eq "libpng.$lext" },
573# libfiles=>$^O eq 'MSWin32' ? '-lpng -lzlib' : '-lpng -lz',
574# objfiles=>'png.o',
575# docs=>q{
576# Png stands for Portable Network Graphics and is intended as
577# a replacement for gif on the web. It is patent free and
578# is recommended by the w3c, you need libpng to use these formats},
579# code => \&png_probe,
580# };
02d1d628 581
ec6d8908
TC
582# $formats{'gif'}={
583# order=>'20',
584# def=>'HAVE_LIBGIF',
585# inccheck=>sub { -e catfile($_[0], 'gif_lib.h') },
586# libcheck=>sub { $_[0] eq "libgif$aext" or $_[0] eq "libgif.$lext" },
587# libfiles=>'-lgif',
588# objfiles=>'gif.o',
589# docs=>q{
590# gif is the de facto standard for webgraphics at the moment,
591# it does have some patent problems. If you have giflib and
592# are not in violation with the unisys patent you should use
593# this instead of the 'ungif' option. Note that they cannot
594# be in use at the same time}
595# };
596
597# $formats{'ungif'}={
598# order=>'21',
599# def=>'HAVE_LIBGIF',
600# inccheck=>sub { -e catfile($_[0], 'gif_lib.h') },
601# libcheck=>sub { $_[0] eq "libungif$aext" or $_[0] eq "libungif.$lext" },
602# libfiles=>'-lungif',
603# objfiles=>'gif.o',
604# docs=>q{
605# gif is the de facto standard for webgraphics at the moment,
606# it does have some patent problems. If you have libungif and
607# want to create images free from LZW patented compression you
608# should use this option instead of the 'gif' option}
609# };
02d1d628 610
a556912d
TC
611# $formats{'T1-fonts'}={
612# order=>'30',
613# def=>'HAVE_LIBT1',
614# inccheck=>sub { -e catfile($_[0], 't1lib.h') },
615# libcheck=>sub { $_[0] eq "libt1$aext" or $_[0] eq "libt1.$lext" },
616# libfiles=>'-lt1',
617# objfiles=>'',
618# docs=>q{
619# postscript t1 fonts are scalable fonts. They can include
620# ligatures and kerning information and generally yield good
621# visual quality. We depend on libt1 to rasterize the fonts
622# for use in images.}
623# };
02d1d628 624
f8e9bc07
TC
625 $formats{'TT-fonts'}=
626 {
627 order=>'31',
628 def=>'HAVE_LIBTT',
629 inccheck=>sub { -e catfile($_[0], 'freetype.h')
630 && !-e catfile($_[0], 'fterrors.h') },
631 libcheck=>sub { $_[0] eq "libttf$aext" or $_[0] eq "libttf.$lext" },
632 libfiles=>'-lttf',
633 objfiles=>'',
714cf158 634 code => \&freetype1_probe,
f8e9bc07
TC
635 docs=>q{
636Truetype fonts are scalable fonts. They can include
637kerning and hinting information and generally yield good
638visual quality esp on low resultions. The freetype library is
639used to rasterize for us. The only drawback is that there
640are alot of badly designed fonts out there.}
02d1d628 641 };
718b8c97
TC
642# $formats{'w32'} = {
643# order=>40,
644# def=>'HAVE_WIN32',
645# inccheck=>sub { -e catfile($_[0], 'windows.h') },
646# libcheck=>sub { lc $_[0] eq 'gdi32.lib'
647# || lc $_[0] eq 'libgdi32.a' },
648# libfiles=>$^O eq 'cygwin' ? '-lgdi32' : '',
649# objfiles=>'win32.o',
650# docs => <<DOCS
651# Uses the Win32 GDI for rendering text.
652
653# This currently only works on under normal Win32 and cygwin.
654# DOCS
655# };
50c75381
TC
656# $formats{'freetype2'} =
657# {
658# order=>'29',
659# def=>'HAVE_FT2',
660# # we always use a probe function
661# #inccheck=>sub { -e catfile($_[0], 'ft2build.h') },
662# #libcheck=>sub { $_[0] eq "libfreetype$aext" or $_[0] eq "libfreetype.$lext" },
663# libfiles=>'-lfreetype',
664# objfiles=>'freetyp2.o',
665# docs=><<DOCS,
666# Freetype 2 supports both Truetype and Type 1 fonts, both of which are
667# scalable. It also supports a variety of other fonts.
668# DOCS
669# code =>
670# [
671# \&freetype2_probe_ftconfig,
672# \&freetype2_probe_scan
673# ],
674# };
f7450478 675
02d1d628
AMH
676 # Make fix indent
677 for (keys %formats) { $formats{$_}->{docs} =~ s/^\s+/ /mg; }
678}
679
680
681
682sub gen {
683 my $V = $ENV{$_[0]};
684 defined($V) ? $V : "";
685}
686
687
688# Get information from environment variables
689
690sub getenv {
691
692 ($VERBOSE,
693 $INCPATH,
694 $LIBPATH,
695 $NOLOG,
696 $DEBUG_MALLOC,
697 $MANUAL,
698 $CFLAGS,
699 $LFLAGS,
700 $DFLAGS) = map { gen $_ } qw(IM_VERBOSE
701 IM_INCPATH
702 IM_LIBPATH
703 IM_NOLOG
704 IM_DEBUG_MALLOC
705 IM_MANUAL
706 IM_CFLAGS
707 IM_LFLAGS
708 IM_DFLAGS);
709
02d1d628 710}
07ea6c21 711
1d7e3124
TC
712# populate the environment so that sub-modules get the same info
713sub setenv {
714 $ENV{IM_VERBOSE} = 1 if $VERBOSE;
715 $ENV{IM_INCPATH} = join $Config{path_sep}, @incpaths if @incpaths;
716 $ENV{IM_LIBPATH} = join $Config{path_sep}, @libpaths if @libpaths;
717}
718
e11d297f
TC
719sub make_imconfig {
720 my ($defines) = @_;
721
722 open CONFIG, "> imconfig.h"
723 or die "Cannot create imconfig.h: $!\n";
724 print CONFIG <<EOS;
725/* This file is automatically generated by Makefile.PL.
726 Don't edit this file, since any changes will be lost */
727
728#ifndef IMAGER_IMCONFIG_H
729#define IMAGER_IMCONFIG_H
730EOS
731 for my $define (@$defines) {
732 if ($define->[2]) {
733 print CONFIG "\n/*\n $define->[2]\n*/\n\n";
734 }
735 print CONFIG "#define $define->[0] $define->[1]\n";
736 }
737 print CONFIG "\n#endif\n";
738 close CONFIG;
739}
740
50c75381
TC
741# # use pkg-config to probe for libraries
742# # works around the junk that pkg-config dumps on FreeBSD
743# sub _pkg_probe {
744# my ($pkg) = @_;
dbc33d8a 745
50c75381 746# is_exe('pkg-config') or return;
dbc33d8a 747
50c75381 748# my $redir = $^O eq 'MSWin32' ? '' : '2>/dev/null';
dbc33d8a 749
50c75381
TC
750# !system("pkg-config $pkg --exists $redir");
751# }
dbc33d8a 752
714cf158
TC
753# probes for freetype1 by scanning @incs for the includes and
754# @libs for the libs. This is done separately because freetype's headers
755# are stored in a freetype or freetype1 directory under PREFIX/include.
756#
757# we could find the files with the existing mechanism, but it won't set
758# -I flags correctly.
759#
760# This could be extended to freetype2 too, but freetype-config catches
761# that
762sub freetype1_probe {
763 my ($frm, $frmkey) = @_;
764
765 my $found_inc;
766 INCS:
767 for my $inc (@incs) {
768 for my $subdir (qw/freetype freetype1/) {
769 my $path = File::Spec->catfile($inc, $subdir, 'freetype.h');
770 -e $path or next;
771 $path = File::Spec->catfile($inc, $subdir, 'fterrors.h');
772 -e $path and next;
773
774 $found_inc = File::Spec->catdir($inc, $subdir);
775 last INCS;
776 }
777 }
778
779 my $found_lib;
780 LIBS:
781 for my $lib (@libs) {
782 my $a_path = File::Spec->catfile($lib, "libttf$aext");
783 my $l_path = File::Spec->catfile($lib, "libttf.$lext");
784 if (-e $a_path || -e $l_path) {
785 $found_lib = $lib;
786 last LIBS;
787 }
788 }
789
89d37182 790 return unless $found_inc && $found_lib;
714cf158
TC
791 printf("%10s: includes %s - libraries %s\n", $frmkey,
792 ($found_inc ? 'found' : 'not found'),
793 ($found_lib ? 'found' : 'not found'));
714cf158
TC
794
795 $frm->{cflags} = "-I$found_inc";
796 $frm->{libfiles} = "-lttf";
797
798 return 1;
799}
800
07ea6c21 801# probes for freetype2 by trying to run freetype-config
50c75381
TC
802# sub freetype2_probe_ftconfig {
803# my ($frm, $frmkey) = @_;
804
805# is_exe('freetype-config') or return;
806
807# my $cflags = `freetype-config --cflags`
808# and !$? or return;
809# chomp $cflags;
810
811# my $lflags = `freetype-config --libs`
812# and !$? or return;
813# chomp $lflags;
814
815# # before 2.1.5 freetype-config --cflags could output
816# # the -I options in the wrong order, causing a conflict with
817# # freetype1.x installed with the same --prefix
818# #
819# # can happen iff:
820# # - both -Iprefix/include and -Iprefix/include/freetype2 are in cflags
821# # in that order
822# # - freetype 1.x headers are in prefix/include/freetype
823# my @incdirs = map substr($_, 2), grep /^-I/, split ' ', $cflags;
824# if (@incdirs == 2
825# && $incdirs[1] eq "$incdirs[0]/freetype2"
826# && -e "$incdirs[0]/freetype/freetype.h"
827# && -e "$incdirs[0]/freetype/fterrid.h") {
828# print "** freetype-config provided -I options out of order, correcting\n"
829# if $VERBOSE;
830# $cflags = join(' ', grep(!/-I/, split ' ', $cflags),
831# map "-I$_", reverse @incdirs);
832# }
833# $frm->{cflags} = $cflags;
834# $frm->{lflags} = $lflags;
07ea6c21 835
50c75381 836# printf "%10s: configured via freetype-config\n", $frmkey;
07ea6c21 837
50c75381
TC
838# return 1;
839# }
07ea6c21 840
c6e870ae
TC
841# attempt to probe for freetype2 by scanning directories
842# we can't use the normal scan since we need to find the directory
843# containing most of the includes
50c75381
TC
844# sub freetype2_probe_scan {
845# my ($frm, $frmkey) = @_;
846
847# my $found_inc;
848# my $found_inc2;
849# INCS:
850# for my $inc (@incs) {
851# my $path = File::Spec->catfile($inc, 'ft2build.h');
852# -e $path or next;
853
854# # try to find what it's including
855# my $ftheader;
856# open FT2BUILD, "< $path"
857# or next;
858# while (<FT2BUILD>) {
859# if (m!^\s*\#\s*include\s+<([\w/.]+)>!
860# || m!^\s*\#\s*include\s+"([\w/.]+)"!) {
861# $ftheader = $1;
862# last;
863# }
864# }
865# close FT2BUILD;
866# $ftheader
867# or next;
868# # non-Unix installs put this directly under the same directory in
869# # theory
870# if (-e File::Spec->catfile($inc, $ftheader)) {
871# $found_inc = $inc;
872# last INCS;
873# }
874# for my $subdir (qw/freetype2 freetype/) {
875# $path = File::Spec->catfile($inc, $subdir, 'fterrors.h');
876# -e $path and next;
c6e870ae 877
50c75381
TC
878# $found_inc = $inc;
879# $found_inc2 = File::Spec->catdir($inc, $subdir);
880# last INCS;
881# }
882# }
c6e870ae 883
50c75381
TC
884# my $found_lib;
885# LIBS:
886# for my $lib (@libs) {
887# my $a_path = File::Spec->catfile($lib, "libfreetype$aext");
888# my $l_path = File::Spec->catfile($lib, "libfreetype.$lext");
889# if (-e $a_path || -e $l_path) {
890# $found_lib = $lib;
891# last LIBS;
892# }
893# }
c6e870ae 894
50c75381
TC
895# printf("%10s: includes %s - libraries %s\n", $frmkey,
896# ($found_inc ? 'found' : 'not found'),
897# ($found_lib ? 'found' : 'not found'));
c6e870ae 898
50c75381 899# return unless $found_inc && $found_lib;
c6e870ae 900
50c75381
TC
901# $frm->{cflags} = _make_I($found_inc);
902# $frm->{cflags} .= " " . _make_I($found_inc2) if $found_inc2;
903# $frm->{libfiles} = "-lfreetype";
c6e870ae 904
50c75381
TC
905# return 1;
906# }
c6e870ae 907
6c2b7cf1
TC
908sub _make_I {
909 my ($inc_dir) = @_;
910
911 $definc{$inc_dir}
e1fe2094 912 and return '';
6c2b7cf1
TC
913
914 $inc_dir =~ / / ? qq!-I"$inc_dir"! : "-I$inc_dir";
915}
916
07ea6c21 917# probes for libpng via pkg-config
50c75381
TC
918# sub png_probe {
919# my ($frm, $frmkey) = @_;
07ea6c21 920
50c75381 921# is_exe('pkg-config') or return;
07ea6c21 922
50c75381
TC
923# my $config;
924# for my $check_conf (qw(libpng libpng12 libpng10)) {
925# if (_pkg_probe($check_conf)) {
926# $config = $check_conf;
927# last;
928# }
929# }
930# $config or return;
07ea6c21 931
50c75381
TC
932# my $cflags = `pkg-config $config --cflags`
933# and !$? or return;
dbc33d8a 934
50c75381
TC
935# my $lflags = `pkg-config $config --libs`
936# and !$? or return;
07ea6c21 937
50c75381
TC
938# chomp $cflags;
939# chomp $lflags;
940# $frm->{cflags} = $cflags;
941# $frm->{lflags} = $lflags;
07ea6c21 942
50c75381 943# printf "%10s: configured via `pkg-config $config ...`\n", $frmkey;
07ea6c21 944
50c75381
TC
945# return 1;
946# }
07ea6c21
TC
947
948sub catfile {
949 return File::Spec->catfile(@_);
950}
951
50c75381
TC
952# sub is_exe {
953# my ($name) = @_;
07ea6c21 954
50c75381
TC
955# my @exe_suffix = $Config{_exe};
956# if ($^O eq 'MSWin32') {
957# push @exe_suffix, qw/.bat .cmd/;
958# }
3e6d8b86 959
50c75381
TC
960# for my $dir (File::Spec->path) {
961# for my $suffix (@exe_suffix) {
962# -x catfile($dir, "$name$suffix")
963# and return 1;
964# }
965# }
07ea6c21 966
50c75381
TC
967# return;
968# }
37959076
TC
969
970sub usage {
971 print STDERR <<EOS;
274cd32b
TC
972Usage: $0 [--enable feature1,feature2,...] [other options]
973 $0 [--disable feature1,feature2,...] [other options]
37959076
TC
974 $0 --help
975Possible feature names are:
797a9f9c 976 T1-fonts TT-fonts freetype2
274cd32b
TC
977Other options:
978 --verbose | -v
979 Verbose library probing (or set IM_VERBOSE in the environment)
980 --nolog
981 Disable logging (or set IM_NOLOG in the environment)
982 --incpath dir
983 Add to the include search path
984 --libpath dir
985 Add to the library search path
35a15603
TC
986 --coverage
987 Build for coverage testing.
988 --assert
989 Build with assertions active.
37959076
TC
990EOS
991 exit 1;
992
993}
92bda632
TC
994
995# generate the PM MM argument
996# I'd prefer to modify the public version, but there doesn't seem to be
997# a public API to do that
998sub gen_PM {
999 my %pm;
1000 my $instbase = '$(INST_LIBDIR)';
1001
1002 # first the basics, .pm and .pod files
1003 $pm{"Imager.pm"} = "$instbase/Imager.pm";
1004
1005 my $mani = maniread();
1006
1007 for my $filename (keys %$mani) {
1008 if ($filename =~ m!^lib/! && $filename =~ /\.(pm|pod)$/) {
1009 (my $work = $filename) =~ s/^lib//;
1010 $pm{$filename} = $instbase . $work;
1011 }
1012 }
1013
1014 # need the typemap
1015 $pm{typemap} = $instbase . '/Imager/typemap';
1016
1017 # and the core headers
1018 for my $filename (keys %$mani) {
1019 if ($filename =~ /^\w+\.h$/) {
1020 $pm{$filename} = $instbase . '/Imager/include/' . $filename;
1021 }
1022 }
1023
1024 # and the generated header
1025 $pm{"imconfig.h"} = $instbase . '/Imager/include/imconfig.h';
1026
1027 \%pm;
1028}
135d30e3 1029
d8e0c3ba
TC
1030my $home;
1031sub _tilde_expand {
1032 my ($path) = @_;
1033
1034 if ($path =~ m!^~[/\\]!) {
1035 defined $home or $home = $ENV{HOME};
1036 if (!defined $home && $^O eq 'MSWin32'
1037 && defined $ENV{HOMEDRIVE} && defined $ENV{HOMEPATH}) {
1038 $home = $ENV{HOMEDRIVE} . $ENV{HOMEPATH};
1039 }
1040 unless (defined $home) {
1041 $home = eval { (getpwuid($<))[7] };
1042 }
1043 defined $home or die "You supplied $path, but I can't find your home directory\n";
1044 $path =~ s/^~//;
1045 $path = File::Spec->catdir($home, $path);
1046 }
1047
1048 $path;
1049}
1050
e5ee047b
TC
1051# sub postcheck_tiff {
1052# my ($format, $frm) = @_;
812ae05c 1053
e5ee047b 1054# -d "probe" or mkdir "probe";
812ae05c 1055
e5ee047b 1056# my $tiffver_name = "probe/tiffver.txt";
b8ea81ac 1057
e5ee047b
TC
1058# my $lib;
1059# if ($Config{cc} =~ /\b(cl|bcc)\b/) {
1060# $lib = "libtiff";
1061# }
1062# else {
1063# $lib = "tiff";
1064# }
10b85929 1065
e5ee047b
TC
1066# # setup LD_RUN_PATH to match link time
1067# my $lopts = join " " , map("-L$_", @{$format->{libdir}}), " -ltiff";
1068# my ($extra, $bs_load, $ld_load, $ld_run_path) =
1069# ExtUtils::Liblist->ext($lopts, $VERBOSE);
1070# local $ENV{LD_RUN_PATH};
10b85929 1071
e5ee047b
TC
1072# if ($ld_run_path) {
1073# print "Setting LD_RUN_PATH=$ld_run_path for TIFF probe\n" if $VERBOSE;
1074# $ENV{LD_RUN_PATH} = $ld_run_path;
1075# }
812ae05c 1076
e5ee047b
TC
1077# my $good =
1078# eval {
1079# assert_lib
1080# (
1081# debug => $VERBOSE,
1082# incpath => $format->{incdir},
1083# libpath => $format->{libdir},
1084# lib => $lib,
1085# header => [ qw(stdio.h tiffio.h) ],
1086# function => <<FUNCTION,
1087# {
1088# const char *vers = TIFFGetVersion();
1089# FILE *f = fopen("$tiffver_name", "wb");
1090# if (!f)
1091# return 1;
1092# fputs(vers, f);
1093# if (fclose(f))
1094# return 1;
1095# return 0;
1096# }
1097# FUNCTION
1098# );
1099# 1;
1100# };
1101
1102# unless ($good && -s $tiffver_name
1103# && open(VERS, "< $tiffver_name")) {
1104# unlink $tiffver_name unless $KEEP_FILES;
1105# print <<EOS;
1106# **tiff: cannot determine libtiff version number
1107# tiff: DISABLED
1108# EOS
1109# return;
1110# }
812ae05c 1111
e5ee047b
TC
1112# # version file seems to be there, load it up
1113# my $ver_str = do { local $/; <VERS> };
1114# close VERS;
1115# unlink $tiffver_name unless $KEEP_FILES;
812ae05c 1116
e5ee047b 1117# my ($version) = $ver_str =~ /(\d+\.\d+\.\d+)/;
812ae05c 1118
e5ee047b
TC
1119# if ($version eq '3.9.0') {
1120# print <<EOS;
1121# **tiff: libtiff 3.9.0 introduced a serious bug, please install 3.9.1
1122# tiff: DISABLED
1123# EOS
1124# return;
1125# }
812ae05c 1126
e5ee047b
TC
1127# return 1;
1128# }
812ae05c 1129
678a9a65
TC
1130# This isn't a module, but some broken tools, like
1131# Module::Depends::Instrusive insist on treating it like one.
1132#
1133# http://rt.cpan.org/Public/Bug/Display.html?id=21229
1134
11351;