root/ImageMagick/trunk/PerlMagick/Makefile.PL

Revision 550, 8.3 KB (checked in by cristy, 2 weeks ago)
Line 
1#  Copyright 1999-2009 ImageMagick Studio LLC, a non-profit organization
2#  dedicated to making software imaging solutions freely available.
3#
4#  You may not use this file except in compliance with the License.  You may
5#  obtain a copy of the License at
6#
7#    http://www.imagemagick.org/script/license.php
8#
9#  Unless required by applicable law or agreed to in writing, software
10#  distributed under the License is distributed on an "AS IS" BASIS,
11#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12#  See the License for the specific language governing permissions and
13#  limitations under the License.
14#
15#  Exercise all regression tests:
16
17#    make test
18#
19#  Exersise one regression test:
20#
21#    make TEST_VERBOSE=1 TEST_FILES=t/filter.t test
22#
23
24use ExtUtils::MakeMaker;
25use Config;
26use File::Spec::Functions qw/catfile catdir devnull catpath splitpath/;
27use Cwd;
28
29sub AutodetectWin32gcc {
30  my $wrkdir = getcwd();
31  my $devnull = devnull();
32 
33  my @incdir = ();
34  my @libdir = ($wrkdir);
35  my @bindir = ();
36 
37  #try to get configuration info via identify or convert utilities
38  my $conf = `identify -list Configure 2>$devnull` || `convert -list Configure 2>$devnull`;
39  foreach my $line (split '\n', $conf) {
40    if ($line =~ /^Path:\s+(.*)/) {
41      my ($vol,$dir,$file) = splitpath($1);
42      next unless $dir;
43      my $dirpath = catpath( $vol, $dir);
44      my (@l,@b,@i) = ( (),(),() );
45
46      # try to detect 'lib' dir
47      push @l, catfile($dirpath,'..','lib');
48      push @l, catfile($dirpath,'..','..','lib');
49      push @l, catfile($dirpath,'..','..','..','lib');
50      foreach (@l) { push @libdir, $_ if (-d $_) };
51
52      # try to detect 'bin' dir
53      push @b, catfile($dirpath,'..');
54      push @b, catfile($dirpath,'..','bin');
55      push @b, catfile($dirpath,'..','..');
56      push @b, catfile($dirpath,'..','..','bin');
57      push @b, catfile($dirpath,'..','..','..');
58      push @b, catfile($dirpath,'..','..','..','bin');
59      foreach (@b) { push @bindir, $_ if (-e "$_/convert.exe" || -e "$_/identify.exe") };
60
61      # try to detect 'include' dir
62      push @i, catfile($dirpath,'..','include');
63      push @i, catfile($dirpath,'..','include','ImageMagick');
64      push @i, catfile($dirpath,'..','..','include');
65      push @i, catfile($dirpath,'..','..','include','ImageMagick');
66      push @i, catfile($dirpath,'..','..','..','include');
67      push @i, catfile($dirpath,'..','..','..','include','ImageMagick');
68      foreach (@i) { push @incdir, $_ if (-e "$_/magick/MagickCore.h") };
69    }
70  };
71 
72  foreach my $bin (@bindir) {
73    opendir(my $bindir, $bin) or die qq{Cannot opendir $bin: $!};
74    my @dlls = map {catfile($bin, $_)} grep /^\S*magick[^\+]\S*?\.dll$/i, readdir $bindir;
75    foreach my $d (@dlls) {
76      unlink "$wrkdir/libMagickCore.def", "$wrkdir/libMagickCore.a";
77      system("pexports \"$d\" >\"$wrkdir/libMagickCore.def\" 2>$devnull");
78      open(DEF, "<$wrkdir/libMagickCore.def");
79      my @found = grep(/InitializeMagickResources/, <DEF>); #checking if we have taken the right DLL
80      close(DEF);
81      next unless(@found);
82      print STDERR "Gonna create 'libMagickCore.a' from '$d'\n";
83      system("dlltool -D \"$d\" -d \"$wrkdir/libMagickCore.def\" -l \"$wrkdir/libMagickCore.a\" 2>$devnull");
84      last if -s "$wrkdir/libMagickCore.a";
85    }
86    last if -s "$wrkdir/libMagickCore.a";
87  }
88 
89  unless(@incdir && @libdir && @bindir && (-s "$wrkdir/libMagickCore.a")) {
90    print STDERR <<EOF
91################################### WARNING! ###################################
92# It seems that you are trying to install Perl::Magick on a MS Windows box with
93# perl + gcc compiler (e.g. strawberry perl), however we cannot find ImageMagick
94# binaries installed on your system.
95#
96# Please check the following prerequisites:
97#
98# 1) You need to have installed ImageMagick Windows binaries from
99#    http://www.imagemagick.org/script/binary-releases.php#windows
100#
101# 2) We only support dynamic (DLL) ImageMagick binaries
102#    note: it is not possible to mix 32/64-bit binaries of perl and ImageMagick
103#
104# 3) During installation select that you want to install ImageMagick's
105#    development files (libraries+headers)
106#
107# 4) You also need to have ImageMagick's directory in your PATH
108#    note: we are checking the presence of convert.exe and/or identify.exe tools
109#
110# 5) You might need Visual C++ Redistributable Package installed on your system
111#    see instructions on ImageMagick's Binary Release webpage
112#
113# We are gonna continue, but chances for successful build are very low!
114################################################################################
115EOF
116  }
117   
118  my $inc = join ' ', map "-I\"$_\"", @incdir;
119  my $lib = join ' ', map "-L\"$_\"", @libdir;
120
121  return ($inc, $lib);
122}
123
124
125# Compute test specification
126my $delegate_tests='t/*.t';
127my $delegate;
128foreach $delegate (qw/bzlib djvu fftw fontconfig freetype jpeg jng jp2 lcms mpeg png rsvg tiff x11 xml wmf zlib/) {
129  if ( -d "t/$delegate" ) {
130    if ( defined($ENV{'DISPLAY'}) && ($^O ne 'MSWin32') ) {
131      if ( defined $ENV{'DISPLAY'} ) {
132        $delegate_tests .= " t/$delegate/*.t";
133      }
134      next;
135    }
136    $delegate_tests .= " t/$delegate/*.t";
137  }
138}
139
140# defaults for LIBS & INC & CCFLAGS params that we later pass to Writemakefile
141my $INC_magick = '-I../ -I.. -I/usr/include/freetype2 -I/usr/include/libxml2 -I"' . $Config{'usrinc'} . '/ImageMagick"';
142my $LIBS_magick = '-L../magick/.libs -lMagickCore -lperl -lm';
143my $CCFLAGS_magick = "$Config{'ccflags'} -fopenmp -g -O2 -Wall -W -pthread";
144my $LDFLAGS_magick   = "-L../magick/.libs -lMagickCore $Config{'ldflags'} ";
145my $LDDLFLAGS_magick = "-L../magick/.libs -lMagickCore $Config{'lddlflags'} ";
146
147if (($^O eq 'MSWin32') && ($Config{cc} =~ /gcc/)) {
148  my($Ipaths, $Lpaths) = AutodetectWin32gcc();
149
150  #
151  # Setup for strawberry perl.
152  #
153  $INC_magick       = "$Ipaths";
154  $LIBS_magick      = "-lMagickCore";
155  $CCFLAGS_magick   = "$Config{'ccflags'}";
156  $LDFLAGS_magick   = "$Config{'ldflags'} $Lpaths ";
157  $LDDLFLAGS_magick = "$Config{'lddlflags'} $Lpaths ";
158}
159
160# See lib/ExtUtils/MakeMaker.pm for details of how to influence
161# the contents of the Makefile that is written.
162WriteMakefile
163  (
164   # Module description
165   'ABSTRACT'   => 'ImageMagick PERL Extension',
166
167   # Perl module name is Image::Magick
168   'NAME'       => 'Image::Magick',
169
170   # Module author
171   'AUTHOR' => 'ImageMagick Studio LLC',
172
173   # Module version
174   'VERSION' => '6.5.7',
175
176   # Preprocessor defines
177   'DEFINE'     => ' -D_LARGE_FILES=1 -DHAVE_CONFIG_H',     # e.g., '-DHAVE_SOMETHING'
178
179   # Header search specfication and preprocessor flags
180   'INC'        => $INC_magick,
181
182   # C compiler
183   #'CC' => 'gcc -std=gnu99',
184
185   # C pre-processor flags (e.g. -I & -D options)
186   # 'CPPFLAGS' => "$Config{'cppflags'} -I/usr/include/freetype2 -I/usr/include/libxml2",
187
188   # C compiler flags (e.g. -O -g)
189   'CCFLAGS' => $CCFLAGS_magick,
190
191   # Linker
192   #'LD' => $Config{'ld'} == $Config{'cc'} ? 'gcc -std=gnu99' : $Config{'ld'},
193
194   # Linker flags for building an executable
195   'LDFLAGS' =>  $LDFLAGS_magick,
196
197   # Linker flags for building a dynamically loadable module
198   'LDDLFLAGS' => $LDDLFLAGS_magick,
199
200   # Install PerlMagick binary into ImageMagick bin directory
201   'INSTALLBIN' => '/usr/local/bin',
202
203   # Library specification
204   'LIBS' => [ $LIBS_magick ],
205
206   # Perl binary name (if a Perl binary is built)
207   'MAP_TARGET' => 'PerlMagick',
208
209   # Let CFLAGS drive optimization flags by setting OPTIMIZE to empty
210   # 'OPTIMIZE' => '',
211
212   # Use same compiler as ImageMagick
213   'PERLMAINCC' => ' -fopenmp',
214
215   # Set Perl installation prefix to ImageMagick installation prefix
216#   'PREFIX'    => '/usr/local',
217
218   # Include delegate directories in tests
219   test => { TESTS      =>      $delegate_tests},
220
221   ($Config{'archname'} =~ /-object$/i ? ('CAPI' => 'TRUE') : ()),
222);
223
224
225#
226# Substitutions for "makeaperl" section.
227#
228sub MY::makeaperl {
229     package MY; # so that "SUPER" works right
230     my $inherited = shift->SUPER::makeaperl(@_);
231
232     # Stinky ExtUtils::MM_Unix likes to append its own library path to $(CC),
233     # prior to any user-specified library path so that an installed library is
234     # used rather than the library just built.  This substitution function
235     # tries to insert our library path first. Also, use the same compiler used
236     # to build perlmain.c to link so that a C++ compiler may be used if
237     # necessary.
238     $inherited =~ s:MAP_LINKCMD\s.*\s*\$\(CC\):MAP_LINKCMD   = \$(PERLMAINCC) -L/usr/local/lib: ;
239     $inherited;
240 }
Note: See TracBrowser for help on using the browser.