X-Git-Url: http://git.imager.perl.org/imager.git/blobdiff_plain/6cfee9d1ec893f4947a6fd8c3472aad44b813ca8..5e795fcc42c699ff2e3d9a08ccfe7b187f7f0909:/Makefile.PL diff --git a/Makefile.PL b/Makefile.PL index 53966a42..35d80bab 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -6,10 +6,18 @@ use Config; use File::Spec; use Getopt::Long; use ExtUtils::Manifest qw(maniread); +use ExtUtils::Liblist; use vars qw(%formats $VERBOSE $INCPATH $LIBPATH $NOLOG $DEBUG_MALLOC $MANUAL $CFLAGS $LFLAGS $DFLAGS); use lib 'inc'; use Devel::CheckLib; +# EU::MM runs Makefile.PL all in the same process, so sub-modules will +# see this +our $BUILDING_IMAGER = 1; + +# used to display a summary after we've probed the world +our %IMAGER_LIBS; + # # IM_INCPATH colon seperated list of paths to extra include paths # IM_LIBPATH colon seperated list of paths to extra library paths @@ -25,7 +33,6 @@ use Devel::CheckLib; # IM_CFLAGS Extra flags to pass to the compiler # IM_LFLAGS Extra flags to pass to the linker # IM_DFLAGS Extra flags to pass to the preprocessor -# IM_SUPPRESS_PROMPT Suppress the prompt asking about gif support my $KEEP_FILES = $ENV{IMAGER_KEEP_FILES}; @@ -39,9 +46,9 @@ my @enable; # list of drivers to enable my @disable; # or list of drivers to disable my @incpaths; # places to look for headers my @libpaths; # places to look for libraries -my $noexif; # non-zero to disable EXIF parsing of JPEGs -my $no_gif_set_version; # disable calling EGifSetGifVersion my $coverage; # build for coverage testing +my $assert; # build with assertions +my $trace_context; # trace context management to stderr GetOptions("help" => \$help, "enable=s" => \@enable, "disable=s" => \@disable, @@ -49,9 +56,15 @@ GetOptions("help" => \$help, "libpath=s" => \@libpaths, "verbose|v" => \$VERBOSE, "nolog" => \$NOLOG, - "noexif" => \$noexif, - "nogifsetversion" => \$no_gif_set_version, - 'coverage' => \$coverage); + 'coverage' => \$coverage, + "assert|a" => \$assert, + "tracecontext" => \$trace_context); + +setenv(); + +if ($ENV{AUTOMATED_TESTING}) { + $assert = 1; +} if ($VERBOSE) { print "Verbose mode\n"; @@ -70,6 +83,10 @@ else { push @defines, [ IMAGER_LOG => 1, "Logging system" ]; } +if ($assert) { + push @defines, [ IM_ASSERT => 1, "im_assert() are effective" ]; +} + if ($DEBUG_MALLOC) { push @defines, [ IMAGER_DEBUG_MALLOC => 1, "Use Imager's DEBUG malloc()" ]; print "Malloc debugging enabled\n"; @@ -111,9 +128,6 @@ if ($MANUAL) { automatic(); } -# Make sure there isn't a clash between the gif libraries. -gifcheck(); - my $lib_cflags = ''; my $lib_lflags = ''; my $F_LIBS = ''; @@ -136,12 +150,6 @@ for my $frmkey (sort { $formats{$a}{order} <=> $formats{$b}{order} } keys %forma } -unless ($noexif) { - print "EXIF support enabled\n"; - push @defines, [ 'IMEXIF_ENABLE', 1, "Enable experimental EXIF support" ]; - $F_OBJECT .= ' imexif.o'; -} - my $F_INC = join ' ', map "-I$_", map / / ? qq{"$_"} : $_, grep !$definc{$_}, @incs; $F_LIBS = join(' ',map "-L$_", map / / ? qq{"$_"} : $_, @@ -153,30 +161,75 @@ my $OSDEF = "-DOS_$^O"; if ($^O eq 'hpux') { $OSLIBS .= ' -ldld'; } if (defined $Config{'d_dlsymun'}) { $OSDEF .= ' -DDLSYMUN'; } -my @objs = qw(Imager.o draw.o polygon.o image.o io.o iolayer.o - log.o gaussian.o conv.o pnm.o raw.o feat.o font.o +my @objs = qw(Imager.o context.o draw.o polygon.o image.o io.o iolayer.o + log.o gaussian.o conv.o pnm.o raw.o feat.o combine.o filters.o dynaload.o stackmach.o datatypes.o regmach.o trans2.o quant.o error.o convert.o - map.o tags.o palimg.o maskimg.o img16.o rotate.o + map.o tags.o palimg.o maskimg.o img8.o img16.o rotate.o bmp.o tga.o color.o fills.o imgdouble.o limits.o hlines.o - imext.o scale.o rubthru.o render.o paste.o compose.o); - -my %opts=( - 'NAME' => 'Imager', - 'VERSION_FROM' => 'Imager.pm', - 'LIBS' => "$LFLAGS -lm $lib_lflags $OSLIBS $F_LIBS", - 'DEFINE' => "$OSDEF $CFLAGS", - 'INC' => "$lib_cflags $DFLAGS $F_INC", - 'OBJECT' => join(' ', @objs, $F_OBJECT), - clean => { FILES=>'testout rubthru.c scale.c conv.c filters.c gaussian.c render.c rubthru.c' }, - PM => gen_PM(), - PREREQ_PM => { 'Test::More' => 0.47 }, - ); + imext.o scale.o rubthru.o render.o paste.o compose.o flip.o + perlio.o); + +if ($Config{useithreads}) { + if ($Config{i_pthread}) { + print "POSIX threads\n"; + push @objs, "mutexpthr.o"; + } + elsif ($^O eq 'MSWin32') { + print "Win32 threads\n"; + push @objs, "mutexwin.o"; + } + else { + print "Unsupported threading model\n"; + push @objs, "mutexnull.o"; + if ($ENV{AUTOMATED_TESTING}) { + die "OS unsupported: no threading support code for this platform\n"; + } + } +} +else { + print "No threads\n"; + push @objs, "mutexnull.o"; +} + +my @typemaps = qw(typemap.local typemap); +if ($] < 5.008) { + unshift @typemaps, "typemap.oldperl"; +} + +if ($trace_context) { + $CFLAGS .= " -DIMAGER_TRACE_CONTEXT"; +} + +my $tests = 't/*.t t/*/*.t'; +if (-d "xt" && scalar(() = glob("xt/*.t"))) { + $tests .= " xt/*.t"; +} + +my %opts= + ( + 'NAME' => 'Imager', + 'VERSION_FROM' => 'Imager.pm', + 'LIBS' => "$LFLAGS -lm $lib_lflags $OSLIBS $F_LIBS", + 'DEFINE' => "$OSDEF $CFLAGS", + 'INC' => "$lib_cflags $DFLAGS $F_INC", + 'OBJECT' => join(' ', @objs, $F_OBJECT), + clean => { FILES=>'testout rubthru.c scale.c conv.c filters.c gaussian.c render.c rubthru.c' }, + PM => gen_PM(), + PREREQ_PM => + { + 'Test::More' => 0.47, + 'Scalar::Util' => 1.00, + 'XSLoader' => 0, + }, + TYPEMAPS => \@typemaps, + test => { TESTS => $tests }, + ); if ($coverage) { if ($Config{gccversion}) { - push @ARGV, 'OPTIMIZE=-ftest-coverage -fprofile-arcs'; - #$opts{dynamic_lib} = { OTHERLDFLAGS => '-ftest-coverage -fprofile-arcs' }; + push @ARGV, 'OPTIMIZE=-ftest-coverage -fprofile-arcs -g'; + $opts{dynamic_lib} = { OTHERLDFLAGS => '-ftest-coverage -fprofile-arcs' }; } else { die "Don't know the coverage C flags for your compiler\n"; @@ -186,7 +239,7 @@ if ($coverage) { # eval to prevent warnings about versions with _ in them my $MM_ver = eval $ExtUtils::MakeMaker::VERSION; if ($MM_ver > 6.06) { - $opts{AUTHOR} = 'Tony Cook , Arnar M. Hrafnkelsson'; + $opts{AUTHOR} = 'Tony Cook , Arnar M. Hrafnkelsson'; $opts{ABSTRACT} = 'Perl extension for Generating 24 bit Images'; } @@ -199,6 +252,25 @@ if ($MM_ver >= 6.46) { }, license => "perl", dynamic_config => 1, + no_index => + { + directory => + [ + "PNG", + "GIF", + "TIFF", + "JPEG", + "W32", + "FT2", + "T1", + ], + }, + resources => + { + homepage => "http://imager.perl.org/", + repository => "git://git.imager.perl.org/imager.git", + bugtracker => "http://rt.cpan.org/NoAuth/Bugs.html?Dist=Imager", + }, }; } @@ -211,6 +283,23 @@ mkdir('testout',0777); # since we cannot include it in the archive. WriteMakefile(%opts); +my @good; +my @bad; +for my $name (sort { lc $a cmp lc $b } keys %IMAGER_LIBS) { + if ($IMAGER_LIBS{$name}) { + push @good, $name; + } + else { + push @bad, $name; + } +} + +print "\n"; +print "Libraries found:\n" if @good; +print " $_\n" for @good; +print "Libraries *not* found:\n" if @bad; +print " $_\n" for @bad; + exit; @@ -290,46 +379,6 @@ sub automatic { } } - -sub gifcheck { - if ($formats{'gif'} and $formats{'ungif'}) { - print "ungif and gif can not coexist - removing ungif support\n"; - delete $formats{'ungif'}; - } - - for my $frm (qw(gif ungif)) { - checkformat($frm) if ($MANUAL and $formats{$frm}); - } - - my @dirs; - for my $frm (grep $formats{$_}, qw(gif ungif)) { - push(@dirs, @{$formats{$frm}{incdir}}) if $formats{$frm}{incdir}; - } - my $minor = 0; - my $major = 0; - FILES: for my $dir (@dirs) { - my $h = "$dir/gif_lib.h"; - open H, "< $h" or next; - while () { - if (/GIF_LIB_VERSION\s+"\s*version\s*(\d+)\.(\d+)/i) { - $major = $1; - $minor = $2; - close H; - last FILES; - } - } - close H; - } - - # we need the version in a #ifdefable form - - push @defines, [ IM_GIFMAJOR => $major, "Parsed giflib version" ]; - push @defines, [ IM_GIFMINOR => $minor ]; - push @defines, [ IM_NO_SET_GIF_VERSION => 1, "Disable EGifSetGifVersion" ] - if $no_gif_set_version; -} - - sub grep_directory { my($path, $chk)=@_; @@ -499,88 +548,6 @@ sub init { } push @libs, grep -d, qw(/usr/local/lib); - $formats{'jpeg'}={ - order=>'21', - def=>'HAVE_LIBJPEG', - inccheck=>sub { -e catfile($_[0], 'jpeglib.h') }, - libcheck=>sub { $_[0] eq "libjpeg$aext" or $_ eq "libjpeg.$lext" }, - libfiles=>'-ljpeg', - objfiles=>'jpeg.o', - docs=>q{ - In order to use jpeg with this module you need to have libjpeg - installed on your computer} - }; - - $formats{'tiff'}={ - order=>'23', - def=>'HAVE_LIBTIFF', - inccheck=>sub { -e catfile($_[0], 'tiffio.h') }, - libcheck=>sub { $_[0] eq "libtiff$aext" or $_ eq "libtiff.$lext" }, - libfiles=>'-ltiff', - objfiles=>'tiff.o', - docs=>q{ - In order to use tiff with this module you need to have libtiff - installed on your computer}, - postcheck => \&postcheck_tiff, - }; - - $formats{'png'}={ - order=>'22', - def=>'HAVE_LIBPNG', - inccheck=>sub { -e catfile($_[0], 'png.h') }, - libcheck=>sub { $_[0] eq "libpng$aext" or $_[0] eq "libpng.$lext" }, - libfiles=>$^O eq 'MSWin32' ? '-lpng -lzlib' : '-lpng -lz', - objfiles=>'png.o', - docs=>q{ - Png stands for Portable Network Graphics and is intended as - a replacement for gif on the web. It is patent free and - is recommended by the w3c, you need libpng to use these formats}, - code => \&png_probe, - }; - - $formats{'gif'}={ - order=>'20', - def=>'HAVE_LIBGIF', - inccheck=>sub { -e catfile($_[0], 'gif_lib.h') }, - libcheck=>sub { $_[0] eq "libgif$aext" or $_[0] eq "libgif.$lext" }, - libfiles=>'-lgif', - objfiles=>'gif.o', - docs=>q{ - gif is the de facto standard for webgraphics at the moment, - it does have some patent problems. If you have giflib and - are not in violation with the unisys patent you should use - this instead of the 'ungif' option. Note that they cannot - be in use at the same time} - }; - - $formats{'ungif'}={ - order=>'21', - def=>'HAVE_LIBGIF', - inccheck=>sub { -e catfile($_[0], 'gif_lib.h') }, - libcheck=>sub { $_[0] eq "libungif$aext" or $_[0] eq "libungif.$lext" }, - libfiles=>'-lungif', - objfiles=>'gif.o', - docs=>q{ - gif is the de facto standard for webgraphics at the moment, - it does have some patent problems. If you have libungif and - want to create images free from LZW patented compression you - should use this option instead of the 'gif' option} - }; - - $formats{'T1-fonts'}={ - order=>'30', - def=>'HAVE_LIBT1', - inccheck=>sub { -e catfile($_[0], 't1lib.h') }, - libcheck=>sub { $_[0] eq "libt1$aext" or $_[0] eq "libt1.$lext" }, - libfiles=>'-lt1', - objfiles=>'', - docs=>q{ - postscript t1 fonts are scalable fonts. They can include - ligatures and kerning information and generally yield good - visual quality. We depend on libt1 to rasterize the fonts - for use in images.} - }; - $formats{'TT-fonts'}= { order=>'31', @@ -589,7 +556,7 @@ sub init { && !-e catfile($_[0], 'fterrors.h') }, libcheck=>sub { $_[0] eq "libttf$aext" or $_[0] eq "libttf.$lext" }, libfiles=>'-lttf', - objfiles=>'', + objfiles=>'fontft1.o', code => \&freetype1_probe, docs=>q{ Truetype fonts are scalable fonts. They can include @@ -598,40 +565,6 @@ visual quality esp on low resultions. The freetype library is used to rasterize for us. The only drawback is that there are alot of badly designed fonts out there.} }; - $formats{'w32'} = { - order=>40, - def=>'HAVE_WIN32', - inccheck=>sub { -e catfile($_[0], 'windows.h') }, - libcheck=>sub { lc $_[0] eq 'gdi32.lib' - || lc $_[0] eq 'libgdi32.a' }, - libfiles=>$^O eq 'cygwin' ? '-lgdi32' : '', - objfiles=>'win32.o', - docs => <'29', - def=>'HAVE_FT2', - # we always use a probe function - #inccheck=>sub { -e catfile($_[0], 'ft2build.h') }, - #libcheck=>sub { $_[0] eq "libfreetype$aext" or $_[0] eq "libfreetype.$lext" }, - libfiles=>'-lfreetype', - objfiles=>'freetyp2.o', - docs=>< - [ - \&freetype2_probe_ftconfig, - \&freetype2_probe_scan - ], - }; - # Make fix indent for (keys %formats) { $formats{$_}->{docs} =~ s/^\s+/ /mg; } } @@ -668,6 +601,13 @@ sub getenv { } +# populate the environment so that sub-modules get the same info +sub setenv { + $ENV{IM_VERBOSE} = 1 if $VERBOSE; + $ENV{IM_INCPATH} = join $Config{path_sep}, @incpaths if @incpaths; + $ENV{IM_LIBPATH} = join $Config{path_sep}, @libpaths if @libpaths; +} + sub make_imconfig { my ($defines) = @_; @@ -686,20 +626,47 @@ EOS } print CONFIG "#define $define->[0] $define->[1]\n"; } - print CONFIG "\n#endif\n"; - close CONFIG; -} + if ($Config{gccversion} && $Config{gccversion} =~ /^([0-9]+)/ && $1 > 3) { + print CONFIG </dev/null'; + print CONFIG <{cflags} = $cflags; - $frm->{lflags} = $lflags; - - printf "%10s: configured via freetype-config\n", $frmkey; - - return 1; -} - -# attempt to probe for freetype2 by scanning directories -# we can't use the normal scan since we need to find the directory -# containing most of the includes -sub freetype2_probe_scan { - my ($frm, $frmkey) = @_; - - my $found_inc; - my $found_inc2; - INCS: - for my $inc (@incs) { - my $path = File::Spec->catfile($inc, 'ft2build.h'); - -e $path or next; - - # try to find what it's including - my $ftheader; - open FT2BUILD, "< $path" - or next; - while () { - if (m!^\s*\#\s*include\s+<([\w/.]+)>! - || m!^\s*\#\s*include\s+"([\w/.]+)"!) { - $ftheader = $1; - last; - } - } - close FT2BUILD; - $ftheader - or next; - # non-Unix installs put this directly under the same directory in - # theory - if (-e File::Spec->catfile($inc, $ftheader)) { - $found_inc = $inc; - last INCS; - } - for my $subdir (qw/freetype2 freetype/) { - $path = File::Spec->catfile($inc, $subdir, 'fterrors.h'); - -e $path and next; - - $found_inc = $inc; - $found_inc2 = File::Spec->catdir($inc, $subdir); - last INCS; - } - } - - my $found_lib; - LIBS: - for my $lib (@libs) { - my $a_path = File::Spec->catfile($lib, "libfreetype$aext"); - my $l_path = File::Spec->catfile($lib, "libfreetype.$lext"); - if (-e $a_path || -e $l_path) { - $found_lib = $lib; - last LIBS; - } - } - - printf("%10s: includes %s - libraries %s\n", $frmkey, - ($found_inc ? 'found' : 'not found'), - ($found_lib ? 'found' : 'not found')); - - return unless $found_inc && $found_lib; - - $frm->{cflags} = _make_I($found_inc); - $frm->{cflags} .= " " . _make_I($found_inc2) if $found_inc2; - $frm->{libfiles} = "-lfreetype"; - - return 1; -} - -sub _make_I { - my ($inc_dir) = @_; - - $definc{$inc_dir} - and return ''; - - $inc_dir =~ / / ? qq!-I"$inc_dir"! : "-I$inc_dir"; -} - -# probes for libpng via pkg-config -sub png_probe { - my ($frm, $frmkey) = @_; - - is_exe('pkg-config') or return; - - my $config; - for my $check_conf (qw(libpng libpng12 libpng10)) { - if (_pkg_probe($check_conf)) { - $config = $check_conf; - last; - } - } - $config or return; - - my $cflags = `pkg-config $config --cflags` - and !$? or return; - - my $lflags = `pkg-config $config --libs` - and !$? or return; - - chomp $cflags; - chomp $lflags; - $frm->{cflags} = $cflags; - $frm->{lflags} = $lflags; - - printf "%10s: configured via `pkg-config $config ...`\n", $frmkey; - - return 1; -} - sub catfile { return File::Spec->catfile(@_); } -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 catfile($dir, "$name$suffix") - and return 1; - } - } - - return; -} - sub usage { print STDERR < $VERBOSE, - incpath => $format->{incdir}, - libpath => $format->{libdir}, - lib => $lib, - header => [ qw(stdio.h tiffio.h) ], - function => < }; - close VERS; - unlink $tiffver_name unless $KEEP_FILES; - - my ($version) = $ver_str =~ /(\d+\.\d+\.\d+)/; - - if ($version eq '3.9.0') { - print <