cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 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; |
cristy | e9d0a41 | 2009-10-09 01:49:39 +0000 | [diff] [blame] | 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"); |
cristy | 93ebefb | 2009-12-08 00:51:55 +0000 | [diff] [blame^] | 79 | my @found = grep(/MagickCoreGenesis/, <DEF>); #checking if we have taken the right DLL |
cristy | e9d0a41 | 2009-10-09 01:49:39 +0000 | [diff] [blame] | 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; |
cristy | e9d0a41 | 2009-10-09 01:49:39 +0000 | [diff] [blame] | 120 | |
cristy | 739df91 | 2009-10-24 16:10:18 +0000 | [diff] [blame] | 121 | return ($inc, $lib); |
cristy | e9d0a41 | 2009-10-09 01:49:39 +0000 | [diff] [blame] | 122 | } |
| 123 | |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 124 | |
| 125 | # Compute test specification |
| 126 | my $delegate_tests='t/*.t'; |
| 127 | my $delegate; |
cristy | e637813 | 2009-10-26 20:05:17 +0000 | [diff] [blame] | 128 | foreach $delegate (qw/bzlib djvu fftw fontconfig freetype jpeg jng jp2 lcms mpeg png rsvg tiff x11 xml wmf zlib/) { |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 129 | if ( -d "t/$delegate" ) { |
cristy | 739df91 | 2009-10-24 16:10:18 +0000 | [diff] [blame] | 130 | if ( defined($ENV{'DISPLAY'}) && ($^O ne 'MSWin32') ) { |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 131 | if ( defined $ENV{'DISPLAY'} ) { |
| 132 | $delegate_tests .= " t/$delegate/*.t"; |
| 133 | } |
| 134 | next; |
| 135 | } |
| 136 | $delegate_tests .= " t/$delegate/*.t"; |
| 137 | } |
| 138 | } |
| 139 | |
cristy | e9d0a41 | 2009-10-09 01:49:39 +0000 | [diff] [blame] | 140 | # defaults for LIBS & INC & CCFLAGS params that we later pass to Writemakefile |
cristy | e637813 | 2009-10-26 20:05:17 +0000 | [diff] [blame] | 141 | my $INC_magick = '-I../ -I.. -I/usr/include/freetype2 -I/usr/include/libxml2 -I"' . $Config{'usrinc'} . '/ImageMagick"'; |
cristy | 6bf78be | 2009-10-16 20:13:48 +0000 | [diff] [blame] | 142 | my $LIBS_magick = '-L../magick/.libs -lMagickCore -lperl -lm'; |
cristy | e9d0a41 | 2009-10-09 01:49:39 +0000 | [diff] [blame] | 143 | my $CCFLAGS_magick = "$Config{'ccflags'} -fopenmp -g -O2 -Wall -W -pthread"; |
cristy | 739df91 | 2009-10-24 16:10:18 +0000 | [diff] [blame] | 144 | my $LDFLAGS_magick = "-L../magick/.libs -lMagickCore $Config{'ldflags'} "; |
| 145 | my $LDDLFLAGS_magick = "-L../magick/.libs -lMagickCore $Config{'lddlflags'} "; |
cristy | e9d0a41 | 2009-10-09 01:49:39 +0000 | [diff] [blame] | 146 | |
| 147 | if (($^O eq 'MSWin32') && ($Config{cc} =~ /gcc/)) { |
cristy | 739df91 | 2009-10-24 16:10:18 +0000 | [diff] [blame] | 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 "; |
cristy | e9d0a41 | 2009-10-09 01:49:39 +0000 | [diff] [blame] | 158 | } |
| 159 | |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 160 | # See lib/ExtUtils/MakeMaker.pm for details of how to influence |
| 161 | # the contents of the Makefile that is written. |
| 162 | WriteMakefile |
| 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 |
cristy | 18304f9 | 2009-11-22 15:48:26 +0000 | [diff] [blame] | 174 | 'VERSION' => '6.5.8', |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 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 |
cristy | e9d0a41 | 2009-10-09 01:49:39 +0000 | [diff] [blame] | 180 | 'INC' => $INC_magick, |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 181 | |
| 182 | # C compiler |
cristy | c64f2b5 | 2009-09-27 01:27:54 +0000 | [diff] [blame] | 183 | #'CC' => 'gcc -std=gnu99', |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 184 | |
| 185 | # C pre-processor flags (e.g. -I & -D options) |
cristy | e637813 | 2009-10-26 20:05:17 +0000 | [diff] [blame] | 186 | # 'CPPFLAGS' => "$Config{'cppflags'} -I/usr/include/freetype2 -I/usr/include/libxml2", |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 187 | |
| 188 | # C compiler flags (e.g. -O -g) |
cristy | e9d0a41 | 2009-10-09 01:49:39 +0000 | [diff] [blame] | 189 | 'CCFLAGS' => $CCFLAGS_magick, |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 190 | |
| 191 | # Linker |
cristy | c64f2b5 | 2009-09-27 01:27:54 +0000 | [diff] [blame] | 192 | #'LD' => $Config{'ld'} == $Config{'cc'} ? 'gcc -std=gnu99' : $Config{'ld'}, |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 193 | |
| 194 | # Linker flags for building an executable |
cristy | 739df91 | 2009-10-24 16:10:18 +0000 | [diff] [blame] | 195 | 'LDFLAGS' => $LDFLAGS_magick, |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 196 | |
| 197 | # Linker flags for building a dynamically loadable module |
cristy | 739df91 | 2009-10-24 16:10:18 +0000 | [diff] [blame] | 198 | 'LDDLFLAGS' => $LDDLFLAGS_magick, |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 199 | |
| 200 | # Install PerlMagick binary into ImageMagick bin directory |
| 201 | 'INSTALLBIN' => '/usr/local/bin', |
| 202 | |
| 203 | # Library specification |
cristy | e9d0a41 | 2009-10-09 01:49:39 +0000 | [diff] [blame] | 204 | 'LIBS' => [ $LIBS_magick ], |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 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 |
cristy | 2744bd9 | 2009-11-08 22:57:52 +0000 | [diff] [blame] | 213 | 'PERLMAINCC' => ' -fopenmp', |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 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 | # |
| 228 | sub 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 | } |