#!perl -w use strict; use ExtUtils::MakeMaker; use Getopt::Long; use Config; my $verbose = $ENV{IM_VERBOSE}; my @libpaths; my @incpaths; GetOptions("incpath=s", \@incpaths, "libpath=s" => \@libpaths, "verbose|v" => \$verbose); our $BUILDING_IMAGER; my $MM_ver = eval $ExtUtils::MakeMaker::VERSION; my %opts = ( NAME => 'Imager::Font::FT2', VERSION_FROM => 'FT2.pm', OBJECT => 'FT2.o freetyp2.o', clean => { FILES => 'testout' }, ); my @inc; if ($BUILDING_IMAGER) { push @inc, "-I.."; unshift @INC, "../lib"; } else { unshift @INC, "inc"; print "FreeType 2: building independently\n"; require Imager::ExtUtils; push @inc, Imager::ExtUtils->includes; $opts{TYPEMAPS} = [ Imager::ExtUtils->typemap ]; # Imager required configure through use my @Imager_req = ( Imager => "0.78" ); if ($MM_ver >= 6.46) { $opts{META_MERGE} = { configure_requires => { @Imager_req, }, build_requires => { @Imager_req, "Test::More" => "0.47", }, resources => { homepage => "http://imager.perl.org/", repository => { url => "http://imager.perl.org/svn/trunk/Imager/FT2", web => "http://imager.perl.org/svnweb/public/browse/trunk/Imager/FT2", type => "svn", }, }, }; $opts{PREREQ_PM} = { @Imager_req, }; } } require Imager::Probe; my %probe = ( name => "FreeType 2", code => \&freetype2_probe_ftconfig, inccheck => sub { -e File::Spec->catfile($_[0], "freetype/ftbitmap.h") }, libbase => "freetype", testcode => _ft2_test_code(), testcodeheaders => [ "stdio.h", "string.h", "ft2build.h" ], testcodeprologue => _ft2_test_code_prologue(), incpath => \@incpaths, libpath => \@libpaths, alternatives => [ { incsuffix => "freetype2", }, { incsuffix => "freetype", }, ], ); my $probe_res = Imager::Probe->probe(\%probe); if ($probe_res) { push @inc, $probe_res->{INC}; $opts{LIBS} = $probe_res->{LIBS}; $opts{INC} = "@inc"; if ($MM_ver > 6.06) { $opts{AUTHOR} = 'Tony Cook '; $opts{ABSTRACT} = 'FreeType 2 font driver for Imager'; } WriteMakefile(%opts); } else { if ($BUILDING_IMAGER) { ExtUtils::MakeMaker::WriteEmptyMakefile(%opts); } else { # fail in good way die "OS unsupported: FreeType 2 headers/libraries not found\n"; } } sub _ft2_test_code { return <<'CODE'; FT_Library library = 0; FT_Face face = 0; FT_Error error; error = FT_Init_FreeType(&library); if (error) { fprintf(stderr, "FreeType 2: cannot initialize library: %d\n", error); return 1; } error = FT_New_Face(library, "fontfiles/dodge.ttf", 0, &face); if (error) { fprintf(stderr, "FreeType 2: cannot load font: %d\n", error); return 1; } return 0; CODE } sub _ft2_test_code_prologue { return <<'CODE'; #include FT_FREETYPE_H CODE } sub is_exe { my ($name) = @_; my @exe_suffix = $Config{_exe}; if ($^O eq 'MSWin32') { push @exe_suffix, qw/.bat .cmd/; } for my $dir (File::Spec->path) { for my $suffix (@exe_suffix) { -x File::Spec->catfile($dir, "$name$suffix") and return 1; } } return; } # probes for freetype2 by trying to run freetype-config sub freetype2_probe_ftconfig { my ($req) = @_; is_exe('freetype-config') or return; my $cflags = `freetype-config --cflags` and !$? or return; chomp $cflags; my $lflags = `freetype-config --libs` and !$? or return; chomp $lflags; # before 2.1.5 freetype-config --cflags could output # the -I options in the wrong order, causing a conflict with # freetype1.x installed with the same --prefix # # can happen iff: # - both -Iprefix/include and -Iprefix/include/freetype2 are in cflags # in that order # - freetype 1.x headers are in prefix/include/freetype my @incdirs = map substr($_, 2), grep /^-I/, split ' ', $cflags; if (@incdirs == 2 && $incdirs[1] eq "$incdirs[0]/freetype2" && -e "$incdirs[0]/freetype/freetype.h" && -e "$incdirs[0]/freetype/fterrid.h") { print "** freetype-config provided -I options out of order, correcting\n" if $verbose; $cflags = join(' ', grep(!/-I/, split ' ', $cflags), map "-I$_", reverse @incdirs); } print "$req->{name}: configured via freetype-config\n"; return { INC => $cflags, LIBS => $lflags, }; }