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