Update metadata to meta-spec 2, include web view of repository, correct EUMM version...
[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
debe370b 242if (eval { ExtUtils::MakeMaker->VERSION('6.06'); 1 }) {
5b480b14 243 $opts{AUTHOR} = 'Tony Cook <tonyc@cpan.org>, Arnar M. Hrafnkelsson';
ca508100
TC
244 $opts{ABSTRACT} = 'Perl extension for Generating 24 bit Images';
245}
f45b774f 246
debe370b
DB
247if (eval { ExtUtils::MakeMaker->VERSION('6.46'); 1 }) {
248 $opts{LICENSE} = "perl_5";
f45b774f
TC
249 $opts{META_MERGE} =
250 {
debe370b 251 'meta-spec' =>
f45b774f 252 {
debe370b
DB
253 version => "2",
254 url => "https://metacpan.org/pod/CPAN::Meta::Spec",
f45b774f 255 },
debe370b
DB
256 prereqs =>
257 {
258 runtime =>
259 {
260 recommends =>
261 {
262 "Parse::RecDescent" => 0
263 },
264 },
265 },
266 dynamic_config => 0,
43452432
TC
267 no_index =>
268 {
269 directory =>
270 [
271 "PNG",
ec6d8908 272 "GIF",
797a9f9c
TC
273 "TIFF",
274 "JPEG",
bd7c1b36 275 "W32",
d7ca2089 276 "FT2",
85702fbd 277 "T1",
43452432
TC
278 ],
279 },
280 resources =>
281 {
282 homepage => "http://imager.perl.org/",
debe370b
DB
283 repository =>
284 {
285 url => "git://git.imager.perl.org/imager.git",
286 web => "http://git.imager.perl.org/imager.git",
287 type => "git",
288 },
289 bugtracker =>
290 {
291 web => "https://rt.cpan.org/Dist/Display.html?Name=Imager",
292 },
43452432 293 },
f45b774f 294 };
135d30e3 295}
ca508100 296
9318b8f1 297make_imconfig(\@defines);
e11d297f 298
02d1d628
AMH
299if ($VERBOSE) { print Dumper(\%opts); }
300mkdir('testout',0777); # since we cannot include it in the archive.
135d30e3 301
812ae05c
TC
302-d "probe" and rmdir "probe";
303
02d1d628 304WriteMakefile(%opts);
4dce694d 305
d97c8dbd
TC
306my @good;
307my @bad;
308for my $name (sort { lc $a cmp lc $b } keys %IMAGER_LIBS) {
309 if ($IMAGER_LIBS{$name}) {
310 push @good, $name;
311 }
312 else {
313 push @bad, $name;
314 }
315}
316
317print "\n";
318print "Libraries found:\n" if @good;
319print " $_\n" for @good;
320print "Libraries *not* found:\n" if @bad;
321print " $_\n" for @bad;
322
02d1d628
AMH
323exit;
324
325
326sub MY::postamble {
5a7e62b6
TC
327 my $self = shift;
328 my $perl = $self->{PERLRUN} ? '$(PERLRUN)' : '$(PERL)';
fe415ad2
TC
329 my $mani = maniread;
330
331 my @ims = grep /\.im$/, keys %$mani;
02d1d628 332'
faa9b3e7 333dyntest.$(MYEXTLIB) : dynfilt/Makefile
02d1d628
AMH
334 cd dynfilt && $(MAKE) $(PASTHRU)
335
336lib/Imager/Regops.pm : regmach.h regops.perl
337 $(PERL) regops.perl regmach.h lib/Imager/Regops.pm
e11d297f 338
92bda632 339imconfig.h : Makefile.PL
e11d297f
TC
340 $(ECHO) "imconfig.h out-of-date with respect to $?"
341 $(PERLRUN) Makefile.PL
342 $(ECHO) "==> Your Makefile has been rebuilt - re-run your make command <=="
5a7e62b6 343'.qq!
6cfee9d1 344lib/Imager/APIRef.pod : \$(C_FILES) \$(H_FILES) apidocs.perl
2a69ed21 345 $perl apidocs.perl lib/Imager/APIRef.pod
92bda632 346
fe415ad2
TC
347!.join('', map _im_rule($perl, $_), @ims)
348
349}
350
351sub _im_rule {
352 my ($perl, $im) = @_;
353
354 (my $c = $im) =~ s/\.im$/.c/;
355 return <<MAKE;
356
9b1ec2b8
TC
357$c: $im lib/Imager/Preprocess.pm
358 $perl -Ilib -MImager::Preprocess -epreprocess $im $c
fe415ad2
TC
359
360MAKE
02d1d628 361
55932d2a
TC
362}
363
02d1d628
AMH
364# manual configuration of helper libraries
365
366sub manual {
367 print <<EOF;
368
369 Please answer the following questions about
370 which formats are avaliable on your computer
371
cd10a9c7
TC
372 Warning: if you use manual configuration you are responsible for
373 configuring extra include/library directories as necessary using
374 INC and LIBS command-line assignments.
375
02d1d628
AMH
376press <return> to continue
377EOF
378
379 <STDIN>; # eat one return
380
2646b26c 381 for my $frm(sort { $formats{$b}{order} <=> $formats{$a}{order} } keys %formats) {
02d1d628
AMH
382 SWX:
383 if ($formats{$frm}{docs}) { print "\n",$formats{$frm}{docs},"\n\n"; }
384 print "Enable $frm support: ";
714cf158 385 my $gz = <STDIN>;
02d1d628
AMH
386 chomp($gz);
387 if ($gz =~ m/^(y|yes|n|no)/i) {
cd10a9c7
TC
388 if ($gz =~ /y/i) {
389 $formats{$frm}{enabled} = 1;
390 $IMAGER_LIBS{$frm} = 1;
02d1d628
AMH
391 }
392 } else { goto SWX; }
393 }
394}
395
396
397# automatic configuration of helper libraries
398
399sub automatic {
714cf158 400 print "Automatic probing:\n" if $VERBOSE;
02d1d628 401
3e4bbf92
TC
402 if (grep $_ eq "FT1", @enabled_bundled) {
403 my %probe =
404 (
405 name => "FT1",
406 inccheck => sub { -e File::Spec->catfile($_[0], "ftnameid.h") },
407 libbase => "ttf",
408 testcode => _ft1_test_code(),
409 testcodeheaders => [ "freetype.h", "stdio.h" ],
410 incpaths => \@incpaths,
411 libpaths => \@libpaths,
412 alternatives =>
413 [
414 {
415 incsuffix => "freetype",
416 }
417 ],
418 verbose => $VERBOSE,
419 );
420 my $probe_res = Imager::Probe->probe(\%probe);
421 $IMAGER_LIBS{FT1} = defined $probe_res;
422 if ($probe_res) {
423 $formats{FT1}{enabled} = 1;
424 @{$formats{FT1}}{qw/DEFINE INC LIBS/} =
425 @$probe_res{qw/DEFINE INC LIBS/};
426 }
812ae05c 427 }
812ae05c
TC
428}
429
02d1d628
AMH
430sub pathcheck {
431 if ($VERBOSE) {
432 print "pathcheck\n";
433 print " Include paths:\n";
434 for (@incs) { print $_,"\n"; }
435 }
3a6bb91b 436 @incs=grep { -d $_ && -r _ && -x _ or ( print(" $_ doesnt exist or is unaccessible - removed.\n"),0) } @incs;
02d1d628
AMH
437
438 if ($VERBOSE) {
439 print "\nLibrary paths:\n";
855c5808 440 for (@libs) { print $_,"\n"; }
02d1d628 441 }
3a6bb91b 442 @libs=grep { -d $_ && -r _ && -x _ or ( print(" $_ doesnt exist or is unaccessible - removed.\n"),0) } @libs;
02d1d628
AMH
443 print "\ndone.\n";
444}
445
446
447# Format data initialization
448
449# format definition is:
450# defines needed
451# default include path
452# files needed for include (boolean perl code)
453# default lib path
454# libs needed
455# files needed for link (boolean perl code)
456# object files needed for the format
457
458
459sub init {
460
714cf158
TC
461 my @definc = qw(/usr/include);
462 @definc{@definc}=(1) x @definc;
d8e0c3ba
TC
463 @incs=
464 (
465 split(/\Q$Config{path_sep}/, $INCPATH),
466 map _tilde_expand($_), map { split /\Q$Config{path_sep}/ } @incpaths
467 );
2646b26c 468 if ($Config{locincpth}) {
6552acfe 469 push @incs, grep -d, split ' ', $Config{locincpth};
2646b26c 470 }
88a763e2
TC
471 if ($^O =~ /win32/i && $Config{cc} =~ /\bcl\b/i) {
472 push(@incs, split /;/, $ENV{INCLUDE}) if exists $ENV{INCLUDE};
2646b26c 473 }
16cf4610
TC
474 if ($Config{incpath}) {
475 push @incs, grep -d, split /\Q$Config{path_sep}/, $Config{incpath};
476 }
6552acfe 477 push @incs, grep -d,
2646b26c
TC
478 qw(/sw/include
479 /usr/include/freetype2
480 /usr/local/include/freetype2
481 /usr/local/include/freetype1/freetype
37959076 482 /usr/include /usr/local/include /usr/include/freetype
2646b26c 483 /usr/local/include/freetype);
714cf158
TC
484 if ($Config{ccflags}) {
485 my @hidden = map { /^-I(.*)$/ ? ($1) : () } split ' ', $Config{ccflags};
486 push @incs, @hidden;
487 @definc{@hidden} = (1) x @hidden;
488 }
2646b26c 489
37959076 490 @libs= ( split(/\Q$Config{path_sep}/,$LIBPATH),
d8e0c3ba 491 map _tilde_expand($_), map { split /\Q$Config{path_sep}/} @libpaths );
2646b26c 492 if ($Config{loclibpth}) {
6552acfe 493 push @libs, grep -d, split ' ', $Config{loclibpth};
2646b26c 494 }
714cf158 495
6552acfe 496 push @libs, grep -d, qw(/sw/lib), split(/ /, $Config{'libpth'});
714cf158 497 push @libs, grep -d, split / /, $Config{libspath} if $Config{libspath};
2646b26c 498 if ($^O =~ /win32/i && $Config{cc} =~ /\bcl\b/i) {
88a763e2
TC
499 push(@libs, split /;/, $ENV{LIB}) if exists $ENV{LIB};
500 }
faa9b3e7
TC
501 if ($^O eq 'cygwin') {
502 push(@libs, '/usr/lib/w32api') if -d '/usr/lib/w32api';
274cd32b 503 push(@incs, '/usr/include/w32api') if -d '/usr/include/w32api';
faa9b3e7 504 }
714cf158
TC
505 if ($Config{ldflags}) {
506 # some builds of perl put -Ldir into ldflags without putting it in
507 # loclibpth, let's extract them
508 my @hidden = grep -d, map { /^-L(.*)$/ ? ($1) : () }
509 split ' ', $Config{ldflags};
510 push @libs, @hidden;
511 # don't mark them as seen - EU::MM will remove any libraries
512 # it can't find and it doesn't look for -L in ldflags
513 #@deflib{@hidden} = @hidden;
514 }
ed28c9cc 515 push @libs, grep -d, qw(/usr/local/lib);
2646b26c 516
cd10a9c7 517 $formats{FT1}=
f8e9bc07
TC
518 {
519 order=>'31',
520 def=>'HAVE_LIBTT',
f2da6da9 521 objfiles=>'fontft1.o',
cd10a9c7 522 LIBS => "-lttf",
f8e9bc07 523 docs=>q{
cd10a9c7 524Freetype 1.x supports Truetype fonts and is obsoleted by Freetype 2.x.
7e72e6a4 525
cd10a9c7
TC
526It's probably insecure.
527}
02d1d628
AMH
528 };
529 # Make fix indent
530 for (keys %formats) { $formats{$_}->{docs} =~ s/^\s+/ /mg; }
531}
532
533
534
535sub gen {
536 my $V = $ENV{$_[0]};
7e72e6a4
TC
537 print " $_[0]: '$V'\n"
538 if $VERBOSE && defined $V;
02d1d628
AMH
539 defined($V) ? $V : "";
540}
541
542
543# Get information from environment variables
544
545sub getenv {
546
7e72e6a4
TC
547 $VERBOSE ||= gen("IM_VERBOSE");
548
549 print "Environment config:\n" if $VERBOSE;
550
551 ($INCPATH,
02d1d628
AMH
552 $LIBPATH,
553 $NOLOG,
554 $DEBUG_MALLOC,
555 $MANUAL,
556 $CFLAGS,
557 $LFLAGS,
7e72e6a4 558 $DFLAGS) = map { gen $_ } qw(IM_INCPATH
02d1d628
AMH
559 IM_LIBPATH
560 IM_NOLOG
561 IM_DEBUG_MALLOC
562 IM_MANUAL
563 IM_CFLAGS
564 IM_LFLAGS
565 IM_DFLAGS);
02d1d628 566}
07ea6c21 567
1d7e3124
TC
568# populate the environment so that sub-modules get the same info
569sub setenv {
570 $ENV{IM_VERBOSE} = 1 if $VERBOSE;
571 $ENV{IM_INCPATH} = join $Config{path_sep}, @incpaths if @incpaths;
572 $ENV{IM_LIBPATH} = join $Config{path_sep}, @libpaths if @libpaths;
573}
574
e11d297f 575sub make_imconfig {
9318b8f1 576 my ($defines) = @_;
e11d297f
TC
577
578 open CONFIG, "> imconfig.h"
579 or die "Cannot create imconfig.h: $!\n";
580 print CONFIG <<EOS;
581/* This file is automatically generated by Makefile.PL.
582 Don't edit this file, since any changes will be lost */
583
584#ifndef IMAGER_IMCONFIG_H
585#define IMAGER_IMCONFIG_H
586EOS
587 for my $define (@$defines) {
588 if ($define->[2]) {
589 print CONFIG "\n/*\n $define->[2]\n*/\n\n";
590 }
591 print CONFIG "#define $define->[0] $define->[1]\n";
592 }
53ea6b6f 593 if ($Config{gccversion} && $Config{gccversion} =~ /^([0-9]+)/ && $1 > 3) {
8d14daab
TC
594 print CONFIG <<EOS;
595/*
596
597Compiler supports the GCC __attribute__((format...)) syntax.
598
599*/
600
601#define IMAGER_FORMAT_ATTR 1
53ea6b6f 602
86c8d19a
TC
603EOS
604 }
605
606 if ($Config{d_snprintf}) {
607 print CONFIG <<EOS;
608/* We can use snprintf() */
609#define IMAGER_SNPRINTF 1
610
611EOS
612 }
613
614 if ($Config{d_vsnprintf}) {
615 print CONFIG <<EOS;
616/* We can use vsnprintf() */
617#define IMAGER_VSNPRINTF 1
618
8d14daab
TC
619EOS
620 }
621
622 print CONFIG <<EOS;
623/*
624 Type and format code for formatted output as with printf.
625
626 This is intended for formatting i_img_dim values.
627*/
628typedef $Config{ivtype} i_dim_format_t;
9318b8f1 629#define i_DF $Config{ivdformat}
8d14daab
TC
630EOS
631
e11d297f
TC
632 print CONFIG "\n#endif\n";
633 close CONFIG;
634}
635
37959076
TC
636sub usage {
637 print STDERR <<EOS;
274cd32b
TC
638Usage: $0 [--enable feature1,feature2,...] [other options]
639 $0 [--disable feature1,feature2,...] [other options]
37959076
TC
640 $0 --help
641Possible feature names are:
85702fbd 642 T1-fonts
274cd32b
TC
643Other options:
644 --verbose | -v
645 Verbose library probing (or set IM_VERBOSE in the environment)
646 --nolog
647 Disable logging (or set IM_NOLOG in the environment)
648 --incpath dir
649 Add to the include search path
650 --libpath dir
651 Add to the library search path
35a15603
TC
652 --coverage
653 Build for coverage testing.
654 --assert
655 Build with assertions active.
37959076
TC
656EOS
657 exit 1;
658
659}
92bda632
TC
660
661# generate the PM MM argument
662# I'd prefer to modify the public version, but there doesn't seem to be
663# a public API to do that
664sub gen_PM {
665 my %pm;
666 my $instbase = '$(INST_LIBDIR)';
667
668 # first the basics, .pm and .pod files
669 $pm{"Imager.pm"} = "$instbase/Imager.pm";
670
671 my $mani = maniread();
672
673 for my $filename (keys %$mani) {
674 if ($filename =~ m!^lib/! && $filename =~ /\.(pm|pod)$/) {
675 (my $work = $filename) =~ s/^lib//;
676 $pm{$filename} = $instbase . $work;
677 }
678 }
679
680 # need the typemap
681 $pm{typemap} = $instbase . '/Imager/typemap';
682
683 # and the core headers
684 for my $filename (keys %$mani) {
685 if ($filename =~ /^\w+\.h$/) {
686 $pm{$filename} = $instbase . '/Imager/include/' . $filename;
687 }
688 }
689
690 # and the generated header
691 $pm{"imconfig.h"} = $instbase . '/Imager/include/imconfig.h';
692
693 \%pm;
694}
135d30e3 695
d8e0c3ba
TC
696my $home;
697sub _tilde_expand {
698 my ($path) = @_;
699
700 if ($path =~ m!^~[/\\]!) {
701 defined $home or $home = $ENV{HOME};
702 if (!defined $home && $^O eq 'MSWin32'
703 && defined $ENV{HOMEDRIVE} && defined $ENV{HOMEPATH}) {
704 $home = $ENV{HOMEDRIVE} . $ENV{HOMEPATH};
705 }
706 unless (defined $home) {
707 $home = eval { (getpwuid($<))[7] };
708 }
709 defined $home or die "You supplied $path, but I can't find your home directory\n";
710 $path =~ s/^~//;
711 $path = File::Spec->catdir($home, $path);
712 }
713
714 $path;
715}
716
cd10a9c7
TC
717sub _ft1_test_code {
718 return <<'CODE';
719TT_Engine engine;
720TT_Error error;
721
722error = TT_Init_FreeType(&engine);
723if (error) {
724 printf("FT1: Could not initialize engine\n");
9318b8f1 725 exit(1);
cd10a9c7
TC
726}
727
728return 0;
729CODE
730}
731
3e4bbf92
TC
732sub map_bundled {
733 my (@names) = @_;
734
735 @names = map { split /,/ } @names;
736
737 my @outnames;
738 for my $name (@names) {
739 push @outnames, $name;
740 push @outnames, $bundled_names{$name}
741 if $bundled_names{$name};
742 }
743
744 @outnames;
745}
746
678a9a65 7471;