| 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 | |
|---|
| 121 | return ($inc, $lib); |
|---|
| 122 | } |
|---|
| 123 | |
|---|
| 124 | |
|---|
| 125 | # Compute test specification |
|---|
| 126 | my $delegate_tests='t/*.t'; |
|---|
| 127 | my $delegate; |
|---|
| 128 | foreach $delegate (qw/@DELEGATES@/) { |
|---|
| 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 |
|---|
| 141 | my $INC_magick = '-I../ -I@top_srcdir@ @CPPFLAGS@ -I"' . $Config{'usrinc'} . '/ImageMagick"'; |
|---|
| 142 | my $LIBS_magick = '-L../magick/.libs -lMagickCore -lperl @MATH_LIBS@'; |
|---|
| 143 | my $CCFLAGS_magick = "$Config{'ccflags'} @CFLAGS@"; |
|---|
| 144 | my $LDFLAGS_magick = "-L../magick/.libs -lMagickCore $Config{'ldflags'} @LDFLAGS@"; |
|---|
| 145 | my $LDDLFLAGS_magick = "-L../magick/.libs -lMagickCore $Config{'lddlflags'} @LDFLAGS@"; |
|---|
| 146 | |
|---|
| 147 | if (($^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. |
|---|
| 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 |
|---|
| 174 | 'VERSION' => '@PACKAGE_VERSION@', |
|---|
| 175 | |
|---|
| 176 | # Preprocessor defines |
|---|
| 177 | 'DEFINE' => '@LFS_CPPFLAGS@ @DEFS@', # e.g., '-DHAVE_SOMETHING' |
|---|
| 178 | |
|---|
| 179 | # Header search specfication and preprocessor flags |
|---|
| 180 | 'INC' => $INC_magick, |
|---|
| 181 | |
|---|
| 182 | # C compiler |
|---|
| 183 | #'CC' => '@CC@', |
|---|
| 184 | |
|---|
| 185 | # C pre-processor flags (e.g. -I & -D options) |
|---|
| 186 | # 'CPPFLAGS' => "$Config{'cppflags'} @CPPFLAGS@", |
|---|
| 187 | |
|---|
| 188 | # C compiler flags (e.g. -O -g) |
|---|
| 189 | 'CCFLAGS' => $CCFLAGS_magick, |
|---|
| 190 | |
|---|
| 191 | # Linker |
|---|
| 192 | #'LD' => $Config{'ld'} == $Config{'cc'} ? '@CC@' : $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' => '@BIN_DIR@', |
|---|
| 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' => '@PERLMAINCC@ @OPENMP_CFLAGS@', |
|---|
| 214 | |
|---|
| 215 | # Set Perl installation prefix to ImageMagick installation prefix |
|---|
| 216 | # 'PREFIX' => '@prefix@', |
|---|
| 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@MAGICKCORE_PATH@: ; |
|---|
| 239 | $inherited; |
|---|
| 240 | } |
|---|