]> granicus.if.org Git - imagemagick/blob - PerlMagick/Makefile.PL
(no commit message)
[imagemagick] / PerlMagick / Makefile.PL
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
24 use ExtUtils::MakeMaker;
25 use Config;
26 use File::Spec::Functions qw/catfile catdir devnull catpath splitpath/;
27 use Cwd;
28
29 sub 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 ################################################################################
115 EOF
116   }
117    
118   my $inc = join ' ', map "-I\"$_\"", @incdir;
119   my $lib = join ' ', map "-L\"$_\"", @libdir;
120   $lib .= " -lMagickCore";
121
122   return ($inc, $lib, '-O2');
123 }
124
125
126 # Compute test specification
127 my $delegate_tests='t/*.t';
128 my $delegate;
129 foreach $delegate (qw/bzlib djvu fftw fontconfig freetype jpeg jng jp2 lcms mpeg png rsvg tiff x11 xml wmf zlib/) {
130   if ( -d "t/$delegate" ) {
131     if ($delegate =~ /x11/) {
132       if ( defined $ENV{'DISPLAY'} ) {
133         $delegate_tests .= " t/$delegate/*.t";
134       }
135       next;
136     }
137     $delegate_tests .= " t/$delegate/*.t";
138   }
139 }
140
141 # defaults for LIBS & INC & CCFLAGS params that we later pass to Writemakefile
142 my $INC_magick = '-I../ -I.. -I/usr/include/freetype2 -I/usr/include/libxml2 -I"' . $Config{'usrinc'} . '/ImageMagick"';
143 my $LIBS_magick = '-L../magick/.libs -lMagickCore -L../wand/.libs -lperl -lm';
144 my $CCFLAGS_magick = "$Config{'ccflags'} -fopenmp -g -O2 -Wall -W -pthread";
145
146 if (($^O eq 'MSWin32') && ($Config{cc} =~ /gcc/)) {
147   # a special setup for strawberry perl
148   ($INC_magick, $LIBS_magick, $CCFLAGS_magick) = AutodetectWin32gcc();
149 }
150
151 # See lib/ExtUtils/MakeMaker.pm for details of how to influence
152 # the contents of the Makefile that is written.
153 WriteMakefile
154   (
155    # Module description
156    'ABSTRACT'   => 'ImageMagick PERL Extension',
157
158    # Perl module name is Image::Magick
159    'NAME'       => 'Image::Magick',
160
161    # Module author
162    'AUTHOR' => 'ImageMagick Studio LLC',
163
164    # Module version
165    'VERSION' => '6.5.7',
166
167    # Preprocessor defines
168    'DEFINE'     => ' -D_LARGE_FILES=1 -DHAVE_CONFIG_H',     # e.g., '-DHAVE_SOMETHING' 
169
170    # Header search specfication and preprocessor flags
171    'INC'        => $INC_magick,
172
173    # C compiler
174    #'CC' => 'gcc -std=gnu99',
175
176    # C pre-processor flags (e.g. -I & -D options)
177    # 'CPPFLAGS' => "$Config{'cppflags'} -I/usr/include/freetype2 -I/usr/include/libxml2",
178
179    # C compiler flags (e.g. -O -g)
180    'CCFLAGS' => $CCFLAGS_magick,
181
182    # Linker
183    #'LD' => $Config{'ld'} == $Config{'cc'} ? 'gcc -std=gnu99' : $Config{'ld'},
184
185    # Linker flags for building an executable
186    'LDFLAGS' =>  "-L../magick/.libs -lMagickCore $Config{'ldflags'} ",
187
188    # Linker flags for building a dynamically loadable module
189    'LDDLFLAGS' => "-L../magick/.libs -lMagickCore $Config{'lddlflags'} ",
190
191    # Install PerlMagick binary into ImageMagick bin directory
192    'INSTALLBIN' => '/usr/local/bin',
193
194    # Library specification
195    'LIBS' => [ $LIBS_magick ],
196
197    # Perl binary name (if a Perl binary is built)
198    'MAP_TARGET' => 'PerlMagick',
199
200    # Let CFLAGS drive optimization flags by setting OPTIMIZE to empty
201    # 'OPTIMIZE' => '',
202
203    # Use same compiler as ImageMagick
204    'PERLMAINCC' => ' -fopenmp',
205
206    # Set Perl installation prefix to ImageMagick installation prefix
207 #   'PREFIX'    => '/usr/local',
208
209    # Include delegate directories in tests
210    test => { TESTS      =>      $delegate_tests},
211
212    ($Config{'archname'} =~ /-object$/i ? ('CAPI' => 'TRUE') : ()),
213 );
214
215
216 #
217 # Substitutions for "makeaperl" section.
218 #
219 sub MY::makeaperl {
220      package MY; # so that "SUPER" works right
221      my $inherited = shift->SUPER::makeaperl(@_);
222
223      # Stinky ExtUtils::MM_Unix likes to append its own library path to $(CC),
224      # prior to any user-specified library path so that an installed library is
225      # used rather than the library just built.  This substitution function
226      # tries to insert our library path first. Also, use the same compiler used
227      # to build perlmain.c to link so that a C++ compiler may be used if
228      # necessary.
229      $inherited =~ s:MAP_LINKCMD\s.*\s*\$\(CC\):MAP_LINKCMD   = \$(PERLMAINCC) -L/usr/local/lib: ;
230      $inherited;
231  }