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