From: cristy Date: Thu, 14 Feb 2013 13:34:02 +0000 (+0000) Subject: (no commit message) X-Git-Tag: 7.0.1-0~4239 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=45d54ff53ebbc377888020790eab43f0179f54ac;p=imagemagick --- diff --git a/PerlMagick/Magick.pm b/PerlMagick/Magick.pm index 72c3c1079..98b2f5e2e 100644 --- a/PerlMagick/Magick.pm +++ b/PerlMagick/Magick.pm @@ -19,15 +19,90 @@ package Image::Magick; use strict; use Carp; - -use parent qw/Image::Magick::Q16HDRI/; +use vars qw($VERSION @ISA @EXPORT $AUTOLOAD); + +require 5.002; +require Exporter; +require DynaLoader; +require AutoLoader; + +@ISA = qw(Exporter DynaLoader); +# Items to export into callers namespace by default. Note: do not export +# names by default without a very good reason. Use EXPORT_OK instead. +# Do not simply export all your public functions/methods/constants. +@EXPORT = + qw( + Success Transparent Opaque QuantumDepth QuantumRange MaxRGB + WarningException ResourceLimitWarning TypeWarning OptionWarning + DelegateWarning MissingDelegateWarning CorruptImageWarning + FileOpenWarning BlobWarning StreamWarning CacheWarning CoderWarning + ModuleWarning DrawWarning ImageWarning XServerWarning RegistryWarning + ConfigureWarning ErrorException ResourceLimitError TypeError + OptionError DelegateError MissingDelegateError CorruptImageError + FileOpenError BlobError StreamError CacheError CoderError + ModuleError DrawError ImageError XServerError RegistryError + ConfigureError FatalErrorException + ); + +$VERSION = '7.00'; + +sub AUTOLOAD { + # This AUTOLOAD is used to 'autoload' constants from the constant() + # XS function. If a constant is not found then control is passed + # to the AUTOLOAD in AutoLoader. + + my $constname; + ($constname = $AUTOLOAD) =~ s/.*:://; + die "&${AUTOLOAD} not defined. The required ImageMagick libraries are not installed or not installed properly.\n" if $constname eq 'constant'; + my $val = constant($constname, @_ ? $_[0] : 0); + if ($! != 0) { + if ($! =~ /Invalid/) { + $AutoLoader::AUTOLOAD = $AUTOLOAD; + goto &AutoLoader::AUTOLOAD; + } + else { + my($pack,$file,$line) = caller; + die "Your vendor has not defined PerlMagick macro $pack\:\:$constname, used at $file line $line.\n"; + } + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} + +bootstrap Image::Magick $VERSION; + +# Preloaded methods go here. + +sub new +{ + my $this = shift; + my $class = ref($this) || $this || "Image::Magick"; + my $self = [ ]; + bless $self, $class; + $self->set(@_) if @_; + return $self; +} + +sub New +{ + my $this = shift; + my $class = ref($this) || $this || "Image::Magick"; + my $self = [ ]; + bless $self, $class; + $self->set(@_) if @_; + return $self; +} + +# Autoload methods go after =cut, and are processed by the autosplit program. + +END { UNLOAD () }; 1; __END__ =head1 NAME -Image::Magick - objected-oriented Perl interface to ImageMagick for default quantum (Q16HDRI). Use it to read, manipulate, or write an image or image sequence from within a Perl script. +Image::Magick - objected-oriented Perl interface to ImageMagick. Use it to read, manipulate, or write an image or image sequence from within a Perl script. =head1 SYNOPSIS diff --git a/PerlMagick/Makefile.PL b/PerlMagick/Makefile.PL new file mode 100644 index 000000000..7e11c47cb --- /dev/null +++ b/PerlMagick/Makefile.PL @@ -0,0 +1,265 @@ +# Copyright 1999-2013 ImageMagick Studio LLC, a non-profit organization +# dedicated to making software imaging solutions freely available. +# +# You may not use this file except in compliance with the License. You may +# obtain a copy of the License at +# +# http://www.imagemagick.org/script/license.php +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Exercise all regression tests: +# +# make test +# +# Exersise one regression test: +# +# make TEST_VERBOSE=1 TEST_FILES=t/filter.t test +# + +use ExtUtils::MakeMaker; +use Config; +use File::Spec::Functions qw/catfile catdir devnull catpath splitpath/; +use Cwd; + +sub AutodetectWin32gcc { + my $wrkdir = getcwd(); + my $devnull = devnull(); + + my @incdir = (); + my @libdir = ($wrkdir); + my @bindir = (); + + #try to get configuration info via identify or convert utilities + my $conf = `identify -list Configure 2>$devnull` || `convert -list Configure 2>$devnull`; + foreach my $line (split '\n', $conf) { + if ($line =~ /^Path:\s+(.*)/) { + my ($vol,$dir,$file) = splitpath($1); + next unless $dir; + my $dirpath = catpath( $vol, $dir); + my (@l,@b,@i) = ( (),(),() ); + + # try to detect 'lib' dir + push @l, catfile($dirpath,'lib'); + push @l, catfile($dirpath,'..','lib'); + push @l, catfile($dirpath,'..','..','lib'); + push @l, catfile($dirpath,'..','..','..','lib'); + foreach (@l) { push @libdir, $_ if (-d $_) }; + + # try to detect 'bin' dir + push @b, catfile($dirpath); + push @b, catfile($dirpath,'bin'); + push @b, catfile($dirpath,'..'); + push @b, catfile($dirpath,'..','bin'); + push @b, catfile($dirpath,'..','..'); + push @b, catfile($dirpath,'..','..','bin'); + push @b, catfile($dirpath,'..','..','..'); + push @b, catfile($dirpath,'..','..','..','bin'); + foreach (@b) { push @bindir, $_ if (-e "$_/convert.exe" || -e "$_/identify.exe") }; + + # try to detect 'include' dir + push @i, catfile($dirpath,'include'); + push @i, catfile($dirpath,'include','ImageMagick'); + push @i, catfile($dirpath,'..','include'); + push @i, catfile($dirpath,'..','include','ImageMagick'); + push @i, catfile($dirpath,'..','..','include'); + push @i, catfile($dirpath,'..','..','include','ImageMagick'); + push @i, catfile($dirpath,'..','..','..','include'); + push @i, catfile($dirpath,'..','..','..','include','ImageMagick'); + foreach (@i) { push @incdir, $_ if (-e "$_/MagickCore/MagickCore.h") }; + } + }; + + foreach my $bin (@bindir) { + opendir(my $bindir, $bin) or die qq{Cannot opendir $bin: $!}; + my @dlls = map {catfile($bin, $_)} grep /^\S*magick[^\+]\S*?\.dll$/i, readdir $bindir; + foreach my $d (@dlls) { + unlink "$wrkdir/libMagickCore.def", "$wrkdir/libMagickCore.a"; + system("pexports \"$d\" >\"$wrkdir/libMagickCore.def\" 2>$devnull"); + open(DEF, "<$wrkdir/libMagickCore.def"); + my @found = grep(/MagickCoreGenesis/, ); #checking if we have taken the right DLL + close(DEF); + next unless(@found); + print STDERR "Gonna create 'libMagickCore.a' from '$d'\n"; + system("dlltool -D \"$d\" -d \"$wrkdir/libMagickCore.def\" -l \"$wrkdir/libMagickCore.a\" 2>$devnull"); + last if -s "$wrkdir/libMagickCore.a"; + } + last if -s "$wrkdir/libMagickCore.a"; + } + + unless(@incdir && @libdir && @bindir && (-s "$wrkdir/libMagickCore.a")) { + print STDERR <$devnull` || `convert -list Configure 2>$devnull`; + my @delegates = (); + foreach my $line (split '\n', $conf) { + next unless $line =~ /^DELEGATES\s+/; + (undef, @delegates) = split /\s+/, $line; + last; + }; + return @delegates; +} + +# Compute test specification +my $delegate_tests='t/*.t'; +my @tested_delegates = qw/bzlib djvu fftw fontconfig freetype jpeg jng jp2 lcms mpeg png rsvg tiff x11 xml wmf zlib/; +my @supported_delegates = AutodetectDelegates(); +# find the intersection of tested and supported delegates +my %seen_delegates = (); +$seen_delegates{$_}++ for @supported_delegates; +foreach my $delegate (@tested_delegates) { + if ( $seen_delegates{$delegate} ) { + if ( -d "t/$delegate" ) { + if ( defined($ENV{'DISPLAY'}) && ($^O ne 'MSWin32') ) { + if ( defined $ENV{'DISPLAY'} ) { + $delegate_tests .= " t/$delegate/*.t"; + } + next; + } + $delegate_tests .= " t/$delegate/*.t"; + } + } +} + +# defaults for LIBS & INC & CCFLAGS params that we later pass to Writemakefile +my $INC_magick = '-I../ -I.. -DMAGICKCORE_HDRI_ENABLE=1 -DMAGICKCORE_QUANTUM_DEPTH=16 -I/usr/include/libxml2 -I"' . $Config{'usrinc'} . '/ImageMagick"'; +my $LIBS_magick = '-L../MagickCore/.libs -lMagickCore-Q16HDRI -lperl -lm'; +my $CCFLAGS_magick = "$Config{'ccflags'} -I/usr/include/freetype2 -fopenmp -g -O2 -Wall -pthread -DMAGICKCORE_HDRI_ENABLE=1 -DMAGICKCORE_QUANTUM_DEPTH=16"; +my $LDFLAGS_magick = "-L../MagickCore/.libs -lMagickCore-Q16HDRI $Config{'ldflags'} "; +my $LDDLFLAGS_magick = "-L../MagickCore/.libs -lMagickCore-Q16HDRI $Config{'lddlflags'} "; + +if (($^O eq 'MSWin32') && ($Config{cc} =~ /gcc/)) { + my($Ipaths, $Lpaths) = AutodetectWin32gcc(); + + # + # Setup for strawberry perl. + # + $INC_magick = "$Ipaths"; + $LIBS_magick = "-lMagickCore-Q16HDRI"; + $CCFLAGS_magick = "$Config{'ccflags'}"; + $LDFLAGS_magick = "$Config{'ldflags'} $Lpaths "; + $LDDLFLAGS_magick = "$Config{'lddlflags'} $Lpaths "; +} + +# See lib/ExtUtils/MakeMaker.pm for details of how to influence +# the contents of the Makefile that is written. +WriteMakefile + ( + # Module description + 'ABSTRACT' => 'ImageMagick PERL Extension', + + # Perl module name is Image::Magick + 'NAME' => 'Image::Magick', + + # Module author + 'AUTHOR' => 'ImageMagick Studio LLC', + + # Module version + 'VERSION' => '7.00', + + # Preprocessor defines + 'DEFINE' => ' -D_LARGE_FILES=1 -DHAVE_CONFIG_H', # e.g., '-DHAVE_SOMETHING' + + # Header search specfication and preprocessor flags + 'INC' => $INC_magick, + + # C compiler + #'CC' => 'gcc -std=gnu99 -std=gnu99', + + # C pre-processor flags (e.g. -I & -D options) + # 'CPPFLAGS' => "$Config{'cppflags'} -DMAGICKCORE_HDRI_ENABLE=1 -DMAGICKCORE_QUANTUM_DEPTH=16 -I/usr/include/libxml2", + + # C compiler flags (e.g. -O -g) + 'CCFLAGS' => $CCFLAGS_magick, + + # Linker + #'LD' => $Config{'ld'} == $Config{'cc'} ? 'gcc -std=gnu99 -std=gnu99' : $Config{'ld'}, + + # Linker flags for building an executable + 'LDFLAGS' => $LDFLAGS_magick, + + # Linker flags for building a dynamically loadable module + 'LDDLFLAGS' => $LDDLFLAGS_magick, + + # Install PerlMagick binary into ImageMagick bin directory + 'INSTALLBIN' => '/usr/local/bin', + + # Library specification + 'LIBS' => [ $LIBS_magick ], + + # Perl binary name (if a Perl binary is built) + 'MAP_TARGET' => 'PerlMagick', + + # Let CFLAGS drive optimization flags by setting OPTIMIZE to empty + # 'OPTIMIZE' => '', + + # Use same compiler as ImageMagick + 'PERLMAINCC' => ' -fopenmp', + 'AR' => 'ar', + 'LD' => '', + + # Set Perl installation prefix to ImageMagick installation prefix +# 'PREFIX' => '/usr/local', + + # Include delegate directories in tests + test => { TESTS => $delegate_tests}, + + ($Config{'archname'} =~ /-object$/i ? ('CAPI' => 'TRUE') : ()), +); + + +# +# Substitutions for "makeaperl" section. +# +sub MY::makeaperl { + package MY; # so that "SUPER" works right + my $inherited = shift->SUPER::makeaperl(@_); + + # Stinky ExtUtils::MM_Unix likes to append its own library path to $(CC), + # prior to any user-specified library path so that an installed library is + # used rather than the library just built. This substitution function + # tries to insert our library path first. Also, use the same compiler used + # to build perlmain.c to link so that a C++ compiler may be used if + # necessary. + $inherited =~ s:MAP_LINKCMD\s.*\s*\$\(CC\):MAP_LINKCMD = \$(PERLMAINCC) -L/usr/local/lib: ; + $inherited; + }