1# $Id$ 2 3use ExtUtils::MakeMaker; 4use Cwd qw(abs_path cwd); 5use strict; 6 7my $SRCDIR=$ENV{'srcdir'}; 8$SRCDIR="." unless $SRCDIR; 9my $BUILDDIR=$ENV{'builddir'}; 10$BUILDDIR="." unless $BUILDDIR; 11 12 13my $MING_TOP_SRCDIR=abs_path($SRCDIR."/../"); 14my $MING_TOP_BUILDDIR=abs_path($BUILDDIR."/../"); 15 16print "SRCDIR: ".$SRCDIR."\n"; 17print "BUILDDIR: ".$BUILDDIR."\n"; 18print "MING_TOP_SRCDIR: ".$MING_TOP_SRCDIR."\n"; 19print "MING_TOP_BUILDDIR: ".$MING_TOP_BUILDDIR."\n"; 20 21my $CONFIG_PL = ${BUILDDIR}.'/t/config.pl'; 22 23my @DEFAULT_DIR = qw(..); 24 25my @do_clean = qw { 26 SWF.h 27 Boot.xsh 28 ${CONFIG_PL} 29 ${BUILDDIR}/t/gradient.swf 30 SWF/MyConfig.pm 31}; 32 33for(@do_clean) { unlink $_ } 34 35my @SWF_MODULES_NAMES = ( 36 'Action', 37 'Bitmap', 38 'Button', 39 'Constants', 40 'DisplayItem', 41 'Fill', 42 'Font', 43 'Gradient', 44 'Morph', 45 'Movie', 46 'MovieClip', 47 'Shape', 48 'Sound', 49 'SoundInstance', 50 'SoundStream', 51 'Text', 52 'TextField', 53 'VideoStream', 54 'PrebuiltClip', 55 'FontCharacter', 56 'ButtonRecord', 57 'BinaryData', 58 'InitAction', 59 'Matrix', 60 'Shadow', 61 'Blur', 62 'FilterMatrix', 63 'Filter', 64 'CXform', 65 'BrowserFont', 66 'FontCollection', 67 'Character' 68); 69 70my @XS_OBJECTS = map "${BUILDDIR}/$_", @SWF_MODULES_NAMES; 71push @XS_OBJECTS, "${SRCDIR}/swf_util"; 72push @XS_OBJECTS, "${BUILDDIR}/SWF"; 73my $XS_OBJECTS = join ('$(OBJ_EXT) ' , (@XS_OBJECTS)) . '$(OBJ_EXT)'; 74 75my $XS_DEP_FILES = ""; 76foreach my $val ( @SWF_MODULES_NAMES ) { 77 $XS_DEP_FILES .= "$BUILDDIR/$val.xs: \n\tln -s $SRCDIR/$val.xs .\n"; 78} 79$XS_DEP_FILES .= "$BUILDDIR/SWF.xs: \n\tln -s $SRCDIR/SWF.xs .\n"; 80 81my @LD_OBJECTS = map "${BUILDDIR}/$_", @SWF_MODULES_NAMES; 82push @LD_OBJECTS, "${BUILDDIR}/swf_util", "${BUILDDIR}/SWF"; 83my $LD_OBJECTS = join ('$(OBJ_EXT) ' , (@LD_OBJECTS)) . '$(OBJ_EXT)'; 84 85my $PM_HASH; 86foreach my $val ( @SWF_MODULES_NAMES ) { 87 $PM_HASH->{"${SRCDIR}/SWF/$val.pm"} = "blib/lib/SWF/$val.pm"; 88} 89$PM_HASH->{"${BUILDDIR}/SWF.pm"} = "blib/lib/SWF.pm"; 90#also install Sprite.pm (deprecated) for compat reasons 91$PM_HASH->{"${SRCDIR}/SWF/Sprite.pm"} = "blib/lib/SWF/Sprite.pm"; 92 93my $MAN3_HASH; 94foreach my $val ( @SWF_MODULES_NAMES ) { 95 $MAN3_HASH->{"${SRCDIR}/SWF/$val.pm"} = "blib/man3/SWF::$val.3pm"; 96} 97$MAN3_HASH->{"${BUILDDIR}/SWF.pm"} = "blib/man3/SWF.3pm"; 98#also install Sprite.3pm (deprecated) for compat reasons 99$MAN3_HASH->{"${SRCDIR}/SWF/Sprite.pm"} = "blib/man3/SWF::Sprite.3pm"; 100 101#$MING_DIR is not the src-dir 102my ($MING_DIR, $ming_version); 103#foreach my $dir (@DEFAULT_DIR) { 104# next unless -d $dir; 105# my $abs_dir = abs_path($dir); 106# $ming_version = get_ming_version($dir); 107# 108# if( $ming_version ){ 109# $MING_DIR = $abs_dir; 110# print STDERR $MING_DIR."\n"; 111# last; 112# } 113#} 114# 115#$MING_DIR="../"; 116#ask_ming_dir() unless ($MING_DIR); 117 118$MING_DIR=$MING_TOP_BUILDDIR; 119my $ming_version = get_ming_version($MING_TOP_SRCDIR); 120 121 122print "\nUsing ming version $ming_version with source dir ". $MING_TOP_SRCDIR ." and build dir ". $MING_TOP_BUILDDIR .".\n\n"; 123#compile() unless ming_is_compiled(); 124print "ming library isn't compiled, it is needed for the perl module\n" unless ming_is_compiled(); 125# 2006/01/24 (peterdd) now we can look into ming_config.h to get some info. 126my $libs=get_mingconfig($MING_TOP_BUILDDIR."/src/ming_config.h"); 127write_swf_h($MING_DIR."/src/"); 128write_config_test ($MING_DIR."/src/"); 129write_bootxs(); 130 131sub MY::postamble { 132 "Makefile.PL: $SRCDIR/Makefile.PL\n\tln -s $SRCDIR/Makefile.PL .\n" . 133 "$XS_DEP_FILES"; 134} 135 136 137WriteMakefile( 138 'NAME' => 'SWF', 139 'VERSION_FROM' => $BUILDDIR.'/SWF.pm', 140 ( $] < 5.005 ? () : 141 ( 142 ABSTRACT => 'Perl interface to Ming - a library for generating SWF ("Flash") format movies.', 143 AUTHOR => 'Soheil Seyfaie (soheil at users.sourceforge.net)', 144 ) 145 ), 146 clean => { 147 FILES => "@do_clean", 148 }, 149 'OBJECT' => "$XS_OBJECTS", 150 'LDFROM' => "$LD_OBJECTS", 151 'INC' => "-I$MING_TOP_SRCDIR/src -I$BUILDDIR -I$MING_TOP_BUILDDIR/src -I$SRCDIR", 152 'LIBS' => [ '-L'.$MING_TOP_BUILDDIR . '/src/.libs -lming '.$libs ], 153 'PM' => $PM_HASH, 154 'MAN3PODS' => $MAN3_HASH, 155 'TYPEMAPS' => ["$SRCDIR/typemap"], 156); 157 158sub MY::install { 159 my $self = shift; 160 write_myconfig_file($self->{INSTALLSITEARCH}); 161 return $self->MM::install; 162} 163 164sub ming_is_compiled 165{ 166 my $libming = $MING_TOP_BUILDDIR."/src/.libs/libming.a"; 167 168 if ( -e $libming ) 169 { 170 return 1; 171 } 172 else 173 { 174 print "$libming doesn't exist.\n"; 175 return undef; 176 } 177} 178 179# unused. At least it should take into account the configure flags by 180# running ./config.status 181sub compile{ 182 print "Compiling ming ...\n"; 183 my $cur_dir = cwd; 184 chdir $MING_TOP_BUILDDIR; 185 system $MING_TOP_SRCDIR."./configure"; 186 system "make"; 187 chdir $cur_dir; 188} 189 190sub ask_ming_dir{ 191 while(1) { 192 193 print <<EOF; 194 195You need ming source code to install this software. If you haven't installed 196ming before, please download it from http://www.opaque.net (Please read the 197README file). 198 199EOF 200 print "Please tell me where I can find your Ming src (type q to quit): "; 201 my $src_dir = prompt("", ""); 202 exit(0) if $src_dir eq "q"; 203 if(-d $src_dir) { 204 $ming_version = get_ming_version($src_dir); 205 if($ming_version){ 206 $MING_TOP_SRCDIR = $src_dir; 207 last; 208 } 209 } 210 else { 211 print "Can't stat '$src_dir'\n"; 212 } 213 } 214} 215 216## Find Ming version inside the configure.in found in the directory 217## given as first argument 218sub get_ming_version{ 219 my $d = shift; 220 my $filename = shift || "configure.in"; 221 222 my $file = "$d/$filename"; 223 print "Checking $file\n"; 224 225 return undef unless (-e $file); 226 #print "File exists\n"; 227 228 local *FH; 229 open FH, "$file" or die "can't open $file $!"; 230 231 my ($majorversion,$minorversion,$microversion); 232 foreach my $i (<FH>) { 233 if($i =~ /^MAJOR_VERSION=/) { $i =~ s/^MAJOR_VERSION=(.*)/$1/; chomp($majorversion=$i);} 234 elsif($i =~ /^MINOR_VERSION=/) { $i =~ s/^MINOR_VERSION=(.*)/$1/; chomp($minorversion=$i);} 235 elsif($i =~ /^MICRO_VERSION=/) { $i =~ s/^MICRO_VERSION=(.*)/$1/; chomp($microversion=$i);} 236 } 237 close(FH); 238 my $version=$majorversion.'.'.$minorversion.'.'.$microversion; 239 print "SWF::VERSION = $version\n"; 240 if( $version =~ /^\./ ) {return undef;} 241 else {return $version;} 242} 243 244# peterdd: Someone should provide a better approach to detect the needed libs 245sub get_mingconfig{ 246 my $file=shift; 247 my $lib=""; 248 print "Checking ming config $file :\n"; 249 open(FH, "$file") or die "can't open $file $!"; 250 while(<FH>){ 251 next unless /^#define/; 252 if (/USE_ZLIB/ and /1$/) { $lib.=" -lz"}; 253 if (/USE_GIF/ and /1$/) {$lib.=" -lungif"}; 254 if (/USE_PNG/ and /1$/) {$lib.=" -lpng"}; 255 if (/USE_FREETYPE/ and /1$/) {$lib.=" -lfreetype"}; 256 } 257 close(FH); 258 return $lib; 259 260} 261 262sub write_myconfig_file{ 263 my $dir = shift; 264 local *FH; 265 mkdir "SWF"; 266 open FH, ">SWF/MyConfig.pm" or die "can't open MyConfig $!"; 267 print FH<<EOConf; 268# 269# SWF Configuration 270# 271 272package SWF::MyConfig; 273 274%Conf = ( 275 INSTALLSITEARCH => '$dir', 276 ); 2771; 278EOConf 279 280} 281 282sub write_bootxs (){ 283 local *FH; 284 open FH, ">${BUILDDIR}/Boot.xsh" or die "can't open Boot.xsh $!"; 285 print FH "BOOT:\n{\n"; 286 print FH join "\n", map "extern void boot_SWF__$_(CV *cv);", @SWF_MODULES_NAMES; 287 print FH "\n", join "\n", map "callXS(boot_SWF__$_, cv, mark);", @SWF_MODULES_NAMES; 288 print FH "\n}\n"; 289 close FH; 290} 291 292# We don't really need this function anymore. 293# We may add $dir to INC of WriteMakefile() 294sub write_swf_h { 295 local *FH; 296 open FH, ">SWF.h" or die "can't open SWF.h $!"; 297 print FH <<EOF; 298#include "ming.h" 299EOF 300 close FH; 301} 302 303 304sub write_config_test { 305 my $dir = shift; 306 $dir = abs_path($dir); 307 unlink ${CONFIG_PL}; 308 mkdir $BUILDDIR."/t"; 309 local *FH; 310 open FH, ">${CONFIG_PL}" or die "can't open ${CONFIG_PL} $!"; 311 print FH <<EOF; 312# ==================================================================== 313# Copyright (c) 2000-2003 by Soheil Seyfaie. All rights reserved. 314# This program is free software; you can redistribute it and/or modify 315# it under the same terms as Perl itself. 316# ==================================================================== 317 318 319use strict; 320 321{ 322 my \$MING_DIR = '$dir'; 323 sub ming_dir(){return \$MING_DIR}; 324} 325 326 327EOF 328 329print FH <<'EOF'; 330{ 331 my $test_no = 1; 332 333 # syntax: ok(\$n == 1); 334 sub ok { 335 print "not " if $_[0]; 336 print "ok $test_no\n"; 337 $test_no++; 338 } 339 340 sub test_ok ($$) { 341 my($got, $want) = @_; 342 return ok() if $got eq $want; 343 warn "Test $test_no: wanted '$want', got '$got'\n"; 344 ok(1); 345 } 346 sub skip_test { 347 print "1..0\n"; 348 exit; 349 } 350} 351 352EOF 353 close FH; 354} 355 356 357 358 359 360