3 use ExtUtils::MakeMaker;
8 use ExtUtils::Manifest qw(maniread);
10 use vars qw(%formats $VERBOSE $INCPATH $LIBPATH $NOLOG $DEBUG_MALLOC $MANUAL $CFLAGS $LFLAGS $DFLAGS);
14 # EU::MM runs Makefile.PL all in the same process, so sub-modules will
16 our $BUILDING_IMAGER = 1;
18 # used to display a summary after we've probed the world
22 # IM_INCPATH colon seperated list of paths to extra include paths
23 # IM_LIBPATH colon seperated list of paths to extra library paths
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
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
37 my $KEEP_FILES = $ENV{IMAGER_KEEP_FILES};
39 # make sure --verbose will dump environment settings
40 if (grep $_ =~ /^--?v(?:erbose)?$/, @ARGV) {
44 getenv(); # get environment variables
46 my $lext=$Config{'so'}; # Get extensions of libraries
47 my $aext=$Config{'_a'};
49 my $help; # display help if set
50 my @enable; # list of drivers to enable
51 my @disable; # or list of drivers to disable
52 my @incpaths; # places to look for headers
53 my @libpaths; # places to look for libraries
54 my $coverage; # build for coverage testing
55 my $assert; # build with assertions
56 my $trace_context; # trace context management to stderr
57 GetOptions("help" => \$help,
58 "enable=s" => \@enable,
59 "disable=s" => \@disable,
60 "incpath=s", \@incpaths,
61 "libpath=s" => \@libpaths,
62 "verbose|v" => \$VERBOSE,
64 'coverage' => \$coverage,
65 "assert|a" => \$assert,
66 "tracecontext" => \$trace_context);
70 if ($ENV{AUTOMATED_TESTING}) {
75 print "Verbose mode\n";
77 import Data::Dumper qw(Dumper);
86 if ($NOLOG) { print "Logging not compiled into module\n"; }
88 push @defines, [ IMAGER_LOG => 1, "Logging system" ];
92 push @defines, [ IM_ASSERT => 1, "im_assert() are effective" ];
96 push @defines, [ IMAGER_DEBUG_MALLOC => 1, "Use Imager's DEBUG malloc()" ];
97 print "Malloc debugging enabled\n";
100 if (@enable && @disable) {
101 print STDERR "Only --enable or --disable can be used, not both, try --help\n";
107 my @incs; # all the places to look for headers
108 my @libs; # all the places to look for libraries
110 init(); # initialize global data
111 pathcheck(); # Check if directories exist
113 if (exists $ENV{IM_ENABLE}) {
114 my %en = map { $_, 1 } split ' ', $ENV{IM_ENABLE};
115 for my $key (keys %formats) {
116 delete $formats{$key} unless $en{$key};
120 my %en = map { $_ => 1 } map { split /,/ } @enable;
121 for my $key (keys %formats) {
122 delete $formats{$key} unless $en{$key};
126 delete @formats{map { split /,/ } @disable};
129 # Pick what libraries are used
136 my @objs = qw(Imager.o context.o draw.o polygon.o image.o io.o iolayer.o
137 log.o gaussian.o conv.o pnm.o raw.o feat.o combine.o
138 filters.o dynaload.o stackmach.o datatypes.o
139 regmach.o trans2.o quant.o error.o convert.o
140 map.o tags.o palimg.o maskimg.o img8.o img16.o rotate.o
141 bmp.o tga.o color.o fills.o imgdouble.o limits.o hlines.o
142 imext.o scale.o rubthru.o render.o paste.o compose.o flip.o
148 for my $frmkey (sort { $formats{$a}{order} <=> $formats{$b}{order} } keys %formats) {
149 my $frm = $formats{$frmkey};
150 if ($frm->{enabled}) {
151 push @defines, [ $frm->{def}, 1, "$frmkey available" ];
152 push @objs, $frm->{objfiles};
153 $lib_define .= " $frm->{DEFINE}" if $frm->{DEFINE};
154 $lib_inc .= " $frm->{INC}" if $frm->{INC};
155 $lib_libs .= " $frm->{LIBS}" if $frm->{LIBS};
160 my $OSDEF = "-DOS_$^O";
162 if ($^O eq 'hpux') { $OSLIBS .= ' -ldld'; }
163 if (defined $Config{'d_dlsymun'}) { $OSDEF .= ' -DDLSYMUN'; }
165 if ($Config{useithreads}) {
166 if ($Config{i_pthread}) {
167 print "POSIX threads\n";
168 push @objs, "mutexpthr.o";
170 elsif ($^O eq 'MSWin32') {
171 print "Win32 threads\n";
172 push @objs, "mutexwin.o";
175 print "Unsupported threading model\n";
176 push @objs, "mutexnull.o";
177 if ($ENV{AUTOMATED_TESTING}) {
178 die "OS unsupported: no threading support code for this platform\n";
183 print "No threads\n";
184 push @objs, "mutexnull.o";
187 my @typemaps = qw(typemap.local typemap);
189 unshift @typemaps, "typemap.oldperl";
192 if ($trace_context) {
193 $CFLAGS .= " -DIMAGER_TRACE_CONTEXT";
196 my $tests = 't/*.t t/*/*.t';
197 if (-d "xt" && scalar(() = glob("xt/*.t"))) {
204 'VERSION_FROM' => 'Imager.pm',
205 'LIBS' => "$LFLAGS -lm $lib_libs $OSLIBS",
206 'DEFINE' => "$OSDEF $lib_define $CFLAGS",
207 'INC' => "$lib_inc $DFLAGS",
208 'OBJECT' => join(' ', @objs),
209 clean => { FILES=>'testout rubthru.c scale.c conv.c filters.c gaussian.c render.c rubthru.c' },
213 'Test::More' => 0.47,
214 'Scalar::Util' => 1.00,
217 TYPEMAPS => \@typemaps,
218 test => { TESTS => $tests },
222 if ($Config{gccversion}) {
223 push @ARGV, 'OPTIMIZE=-ftest-coverage -fprofile-arcs -g';
224 $opts{dynamic_lib} = { OTHERLDFLAGS => '-ftest-coverage -fprofile-arcs' };
227 die "Don't know the coverage C flags for your compiler\n";
231 # eval to prevent warnings about versions with _ in them
232 my $MM_ver = eval $ExtUtils::MakeMaker::VERSION;
233 if ($MM_ver > 6.06) {
234 $opts{AUTHOR} = 'Tony Cook <tonyc@cpan.org>, Arnar M. Hrafnkelsson';
235 $opts{ABSTRACT} = 'Perl extension for Generating 24 bit Images';
238 if ($MM_ver >= 6.46) {
243 "Parse::RecDescent" => 0
262 homepage => "http://imager.perl.org/",
263 repository => "git://git.imager.perl.org/imager.git",
264 bugtracker => "http://rt.cpan.org/NoAuth/Bugs.html?Dist=Imager",
269 make_imconfig(\@defines);
271 if ($VERBOSE) { print Dumper(\%opts); }
272 mkdir('testout',0777); # since we cannot include it in the archive.
274 -d "probe" and rmdir "probe";
276 WriteMakefile(%opts);
280 for my $name (sort { lc $a cmp lc $b } keys %IMAGER_LIBS) {
281 if ($IMAGER_LIBS{$name}) {
290 print "Libraries found:\n" if @good;
291 print " $_\n" for @good;
292 print "Libraries *not* found:\n" if @bad;
293 print " $_\n" for @bad;
300 my $perl = $self->{PERLRUN} ? '$(PERLRUN)' : '$(PERL)';
303 my @ims = grep /\.im$/, keys %$mani;
305 dyntest.$(MYEXTLIB) : dynfilt/Makefile
306 cd dynfilt && $(MAKE) $(PASTHRU)
308 lib/Imager/Regops.pm : regmach.h regops.perl
309 $(PERL) regops.perl regmach.h lib/Imager/Regops.pm
311 imconfig.h : Makefile.PL
312 $(ECHO) "imconfig.h out-of-date with respect to $?"
313 $(PERLRUN) Makefile.PL
314 $(ECHO) "==> Your Makefile has been rebuilt - re-run your make command <=="
316 lib/Imager/APIRef.pod : \$(C_FILES) \$(H_FILES) apidocs.perl
317 $perl apidocs.perl lib/Imager/APIRef.pod
319 !.join('', map _im_rule($perl, $_), @ims)
324 my ($perl, $im) = @_;
326 (my $c = $im) =~ s/\.im$/.c/;
329 $c: $im lib/Imager/Preprocess.pm
330 $perl -Ilib -MImager::Preprocess -epreprocess $im $c
336 # manual configuration of helper libraries
341 Please answer the following questions about
342 which formats are avaliable on your computer
344 Warning: if you use manual configuration you are responsible for
345 configuring extra include/library directories as necessary using
346 INC and LIBS command-line assignments.
348 press <return> to continue
351 <STDIN>; # eat one return
353 for my $frm(sort { $formats{$b}{order} <=> $formats{$a}{order} } keys %formats) {
355 if ($formats{$frm}{docs}) { print "\n",$formats{$frm}{docs},"\n\n"; }
356 print "Enable $frm support: ";
359 if ($gz =~ m/^(y|yes|n|no)/i) {
361 $formats{$frm}{enabled} = 1;
362 $IMAGER_LIBS{$frm} = 1;
369 # automatic configuration of helper libraries
372 print "Automatic probing:\n" if $VERBOSE;
377 inccheck => sub { -e File::Spec->catfile($_[0], "ftnameid.h") },
379 testcode => _ft1_test_code(),
380 testcodeheaders => [ "freetype.h", "stdio.h" ],
381 incpaths => \@incpaths,
382 libpaths => \@libpaths,
386 incsuffix => "freetype",
391 my $probe_res = Imager::Probe->probe(\%probe);
392 $IMAGER_LIBS{FT1} = defined $probe_res;
394 $formats{FT1}{enabled} = 1;
395 @{$formats{FT1}}{qw/DEFINE INC LIBS/} =
396 @$probe_res{qw/DEFINE INC LIBS/};
403 print " Include paths:\n";
404 for (@incs) { print $_,"\n"; }
406 @incs=grep { -d $_ && -r _ && -x _ or ( print(" $_ doesnt exist or is unaccessible - removed.\n"),0) } @incs;
409 print "\nLibrary paths:\n";
410 for (@libs) { print $_,"\n"; }
412 @libs=grep { -d $_ && -r _ && -x _ or ( print(" $_ doesnt exist or is unaccessible - removed.\n"),0) } @libs;
417 # Format data initialization
419 # format definition is:
421 # default include path
422 # files needed for include (boolean perl code)
425 # files needed for link (boolean perl code)
426 # object files needed for the format
431 my @definc = qw(/usr/include);
432 @definc{@definc}=(1) x @definc;
435 split(/\Q$Config{path_sep}/, $INCPATH),
436 map _tilde_expand($_), map { split /\Q$Config{path_sep}/ } @incpaths
438 if ($Config{locincpth}) {
439 push @incs, grep -d, split ' ', $Config{locincpth};
441 if ($^O =~ /win32/i && $Config{cc} =~ /\bcl\b/i) {
442 push(@incs, split /;/, $ENV{INCLUDE}) if exists $ENV{INCLUDE};
444 if ($Config{incpath}) {
445 push @incs, grep -d, split /\Q$Config{path_sep}/, $Config{incpath};
449 /usr/include/freetype2
450 /usr/local/include/freetype2
451 /usr/local/include/freetype1/freetype
452 /usr/include /usr/local/include /usr/include/freetype
453 /usr/local/include/freetype);
454 if ($Config{ccflags}) {
455 my @hidden = map { /^-I(.*)$/ ? ($1) : () } split ' ', $Config{ccflags};
457 @definc{@hidden} = (1) x @hidden;
460 @libs= ( split(/\Q$Config{path_sep}/,$LIBPATH),
461 map _tilde_expand($_), map { split /\Q$Config{path_sep}/} @libpaths );
462 if ($Config{loclibpth}) {
463 push @libs, grep -d, split ' ', $Config{loclibpth};
466 push @libs, grep -d, qw(/sw/lib), split(/ /, $Config{'libpth'});
467 push @libs, grep -d, split / /, $Config{libspath} if $Config{libspath};
468 if ($^O =~ /win32/i && $Config{cc} =~ /\bcl\b/i) {
469 push(@libs, split /;/, $ENV{LIB}) if exists $ENV{LIB};
471 if ($^O eq 'cygwin') {
472 push(@libs, '/usr/lib/w32api') if -d '/usr/lib/w32api';
473 push(@incs, '/usr/include/w32api') if -d '/usr/include/w32api';
475 if ($Config{ldflags}) {
476 # some builds of perl put -Ldir into ldflags without putting it in
477 # loclibpth, let's extract them
478 my @hidden = grep -d, map { /^-L(.*)$/ ? ($1) : () }
479 split ' ', $Config{ldflags};
481 # don't mark them as seen - EU::MM will remove any libraries
482 # it can't find and it doesn't look for -L in ldflags
483 #@deflib{@hidden} = @hidden;
485 push @libs, grep -d, qw(/usr/local/lib);
491 objfiles=>'fontft1.o',
494 Freetype 1.x supports Truetype fonts and is obsoleted by Freetype 2.x.
496 It's probably insecure.
500 for (keys %formats) { $formats{$_}->{docs} =~ s/^\s+/ /mg; }
507 print " $_[0]: '$V'\n"
508 if $VERBOSE && defined $V;
509 defined($V) ? $V : "";
513 # Get information from environment variables
517 $VERBOSE ||= gen("IM_VERBOSE");
519 print "Environment config:\n" if $VERBOSE;
528 $DFLAGS) = map { gen $_ } qw(IM_INCPATH
538 # populate the environment so that sub-modules get the same info
540 $ENV{IM_VERBOSE} = 1 if $VERBOSE;
541 $ENV{IM_INCPATH} = join $Config{path_sep}, @incpaths if @incpaths;
542 $ENV{IM_LIBPATH} = join $Config{path_sep}, @libpaths if @libpaths;
548 open CONFIG, "> imconfig.h"
549 or die "Cannot create imconfig.h: $!\n";
551 /* This file is automatically generated by Makefile.PL.
552 Don't edit this file, since any changes will be lost */
554 #ifndef IMAGER_IMCONFIG_H
555 #define IMAGER_IMCONFIG_H
557 for my $define (@$defines) {
559 print CONFIG "\n/*\n $define->[2]\n*/\n\n";
561 print CONFIG "#define $define->[0] $define->[1]\n";
563 if ($Config{gccversion} && $Config{gccversion} =~ /^([0-9]+)/ && $1 > 3) {
567 Compiler supports the GCC __attribute__((format...)) syntax.
571 #define IMAGER_FORMAT_ATTR 1
576 if ($Config{d_snprintf}) {
578 /* We can use snprintf() */
579 #define IMAGER_SNPRINTF 1
584 if ($Config{d_vsnprintf}) {
586 /* We can use vsnprintf() */
587 #define IMAGER_VSNPRINTF 1
594 Type and format code for formatted output as with printf.
596 This is intended for formatting i_img_dim values.
598 typedef $Config{ivtype} i_dim_format_t;
599 #define i_DF $Config{ivdformat}
602 print CONFIG "\n#endif\n";
608 Usage: $0 [--enable feature1,feature2,...] [other options]
609 $0 [--disable feature1,feature2,...] [other options]
611 Possible feature names are:
615 Verbose library probing (or set IM_VERBOSE in the environment)
617 Disable logging (or set IM_NOLOG in the environment)
619 Add to the include search path
621 Add to the library search path
623 Build for coverage testing.
625 Build with assertions active.
631 # generate the PM MM argument
632 # I'd prefer to modify the public version, but there doesn't seem to be
633 # a public API to do that
636 my $instbase = '$(INST_LIBDIR)';
638 # first the basics, .pm and .pod files
639 $pm{"Imager.pm"} = "$instbase/Imager.pm";
641 my $mani = maniread();
643 for my $filename (keys %$mani) {
644 if ($filename =~ m!^lib/! && $filename =~ /\.(pm|pod)$/) {
645 (my $work = $filename) =~ s/^lib//;
646 $pm{$filename} = $instbase . $work;
651 $pm{typemap} = $instbase . '/Imager/typemap';
653 # and the core headers
654 for my $filename (keys %$mani) {
655 if ($filename =~ /^\w+\.h$/) {
656 $pm{$filename} = $instbase . '/Imager/include/' . $filename;
660 # and the generated header
661 $pm{"imconfig.h"} = $instbase . '/Imager/include/imconfig.h';
670 if ($path =~ m!^~[/\\]!) {
671 defined $home or $home = $ENV{HOME};
672 if (!defined $home && $^O eq 'MSWin32'
673 && defined $ENV{HOMEDRIVE} && defined $ENV{HOMEPATH}) {
674 $home = $ENV{HOMEDRIVE} . $ENV{HOMEPATH};
676 unless (defined $home) {
677 $home = eval { (getpwuid($<))[7] };
679 defined $home or die "You supplied $path, but I can't find your home directory\n";
681 $path = File::Spec->catdir($home, $path);
692 error = TT_Init_FreeType(&engine);
694 printf("FT1: Could not initialize engine\n");