The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

# Copyright (c) 2004-2005 Nokia.  All rights reserved.
# This utility is licensed under the same terms as Perl itself.

use strict;
use lib "symbian";

print "Configuring...\n";
print "Configuring with: Perl version $] ($^X)\n";

do "sanity.pl" or die $@;

my %VERSION = %{ do "version.pl" or die $@ };

printf "Configuring for:  Perl version $VERSION{REVISION}.%03d%03d\n",
  $VERSION{VERSION}, $VERSION{SUBVERSION};

my $VERSION = "$VERSION{REVISION}$VERSION{VERSION}$VERSION{SUBVERSION}";
my $R_V_SV  = "$VERSION{REVISION}.$VERSION{VERSION}.$VERSION{SUBVERSION}";

my ($SYMBIAN_ROOT, $SYMBIAN_VERSION, $SDK_NAME, $SDK_VARIANT, $SDK_VERSION) =
    @{ do "sdk.pl" or die $@ };
my %PORT = %{ do "port.pl" or die $@ };

if ($SYMBIAN_ROOT eq 'C:\Symbian\Series60_1_2_CW') {
    ( $SYMBIAN_VERSION, $SDK_VERSION ) = qw(6.1 1.2);
}

my $WIN = $ENV{WIN} ; # 'wins', 'winscw' (from sdk.pl)
my $ARM = 'thumb';    # 'thumb', 'armv5'
my $S60SDK = $ENV{S60SDK}; # qw(1.2 2.0 2.1 2.6) (from sdk.pl)
    if ($SDK_VARIANT eq 'S60' && $S60SDK =~ /^5\./) {
        $ARM = 'armv5';    # 'thumb', 'armv5' # Configuration for S60 5th Edition SDK v1.0
    }
my $S80SDK = $ENV{S80SDK}; # qw(2.0) (from sdk.pl)
my $S90SDK = $ENV{S90SDK}; # qw(1.1) (from sdk.pl)
my $UIQSDK = $ENV{UIQSDK}; # qw(2.0 2.1) (from sdk.pl)

my $UREL = $ENV{UREL}; # from sdk.pl
$UREL =~ s/-ARM-/$ARM/;
my $UARM = $ENV{UARM}; # from sdk.pl

die "$0: SDK not recognized\n"
  if !defined($SYMBIAN_VERSION) ||
     !defined($SDK_VERSION) ||
     (!defined($S60SDK) && !defined($S80SDK) && !defined($S90SDK) && !defined($UIQSDK));

die "$0: does not know which Windows compiler to use\n"
    unless defined $WIN;

print "Symbian $SYMBIAN_VERSION SDK $SDK_VARIANT $SDK_VERSION ($WIN) installed at $SYMBIAN_ROOT\n";

my $CWD = do "cwd.pl" or die $@;
print "Build directory $CWD\n";

die "$0: '+' in cwd does not work with Series 60 SDK 1.2\n"
    if defined $S60SDK && $S60SDK eq '1.2' && $CWD =~ /\+/;

my @unclean;
my @mmp;

sub create_mmp {
    my ( $target, $type, @x ) = @_;
    my $miniperl = $target eq 'miniperl';
    my $perl     = $target eq 'perl';
    my $mmp        = "$target.mmp";
    my $targetpath = $miniperl
      || $perl ? "TARGETPATH\t\\System\\Apps\\Perl" : "";
    if ( open( my $fh, ">$mmp" ) ) {
        print "\t$mmp\n";
        push @mmp,     $mmp;
        push @unclean, $mmp;
        print $fh <<__EOF__;
TARGET		$target.$type
TARGETTYPE	$type
__EOF__
        if ($SDK_VARIANT eq 'S60' && $S60SDK =~ /^5\./) {
            print $fh "UID\t0 0xEA3E9181\n" if $miniperl;
            print $fh "UID\t0 0xED04DD86\n" if $perl;
            print $fh "UID\t0x1000008d 0xE8667302\n" unless $miniperl || $perl; 
            print $fh "CAPABILITY\tNONE\n";
        } else {
            print $targetpath; 
            print $fh "EPOCHEAPSIZE\t1024 8388608"; 
            print $fh "EPOCSTACKSIZE\t65536"; 
        }
        print $fh <<__EOF__;
EXPORTUNFROZEN
SRCDBG
__EOF__
        if ($SDK_VARIANT eq 'S60') {
            print $fh "MACRO\t__SERIES60__\n";
            print $fh "MACRO\t__SERIES60_1X__\n" if $S60SDK =~ /^1\./;
            print $fh "MACRO\t__SERIES60_2X__\n" if $S60SDK =~ /^2\./;
            print $fh "MACRO\t__SERIES60_3X__\n" if $S60SDK =~ /^5\./; 
	}
        if ($SDK_VARIANT eq 'S80') {
	    print $fh "MACRO\t__SERIES80__\n";
	    print $fh "MACRO\t__SERIES80_1X__\n" if $S80SDK =~ /^1\./;
	    print $fh "MACRO\t__SERIES80_2X__\n" if $S80SDK =~ /^2\./;
	}
        if ($SDK_VARIANT eq 'S90') {
	    print $fh "MACRO\t__SERIES90__\n";
	}
        if ($SDK_VARIANT eq 'UIQ') {
	    print $fh "MACRO\t__UIQ__\n";
	    print $fh "MACRO\t__UIQ_1X__\n" if $UIQSDK =~ /^1\./;
	    print $fh "MACRO\t__UIQ_2X__\n" if $UIQSDK =~ /^2\./;
	}
        my ( @c, %c );
        @c = map  { glob } qw(*.c);       # Find the .c files.
        @c = map  { lc } @c;              # Lowercase the names.
        @c = grep { !/malloc\.c/ } @c;    # Use the system malloc.
        @c = grep { !/madly\.c/ } @c;     # mad is undef.
        @c = grep { !/main\.c/ } @c;      # main.c must be explicit.
        push @c, map { lc } @x;
        @c = map { s:^\.\./::; $_ } @c;    # Remove the leading ../
        @c = map { $c{$_}++ } @c;          # Uniquefy.
        @c = sort keys %c;                 # Beautify.

        for (@c) {
            print $fh "SOURCE\t\t$_\n";
        }
        print $fh <<__EOF__;
SOURCEPATH	$CWD
USERINCLUDE	$CWD
USERINCLUDE	$CWD\\ext\\DynaLoader
USERINCLUDE	$CWD\\symbian
SYSTEMINCLUDE	\\epoc32\\include\\libc
SYSTEMINCLUDE	\\epoc32\\include
LIBRARY		euser.lib
LIBRARY		estlib.lib
LIBRARY		eikcore.lib
LIBRARY		cone.lib
LIBRARY		efsrv.lib
__EOF__
        if ( $miniperl || $perl || $type eq 'dll' ) {
            print $fh <<__EOF__;
LIBRARY		charconv.lib
LIBRARY		hal.lib
LIBRARY		estor.lib
__EOF__
        }
	if ($SDK_VARIANT =~ /^S[689]0$/) {
            print $fh <<__EOF__;
LIBRARY		commonengine.lib
__EOF__
	}
	if (defined $S60SDK) {
	    print $fh <<__EOF__;
LIBRARY		avkon.lib
LIBRARY		commondialogs.lib 
__EOF__
        }
	if ((defined $S80SDK) or (defined $S90SDK)) {
	    print $fh <<__EOF__;
LIBRARY		eikctl.lib
LIBRARY		eikcoctl.lib
LIBRARY		eikdlg.lib
LIBRARY		ckndlg.lib
__EOF__
        }
	if (defined $UIQSDK) {
	    print $fh <<__EOF__;
LIBRARY		eikctl.lib
LIBRARY		eikcoctl.lib
LIBRARY		eikdlg.lib
LIBRARY		qikctl.lib
__EOF__
        }
        if ( $type eq 'exe' ) {
            print $fh <<__EOF__;
STATICLIBRARY	ecrt0.lib
__EOF__
        }
        if ($miniperl) {
            print $fh <<__EOF__;
MACRO		PERL_MINIPERL
__EOF__
        }
        if ($perl) {
            print $fh <<__EOF__;
MACRO		PERL_PERL
__EOF__
        }
        print $fh <<__EOF__;
MACRO		PERL_CORE
MACRO		MULTIPLICITY
MACRO		PERL_IMPLICIT_CONTEXT
__EOF__
        unless ( $miniperl || $perl ) {
            print $fh <<__EOF__;
MACRO		PERL_GLOBAL_STRUCT
MACRO		PERL_GLOBAL_STRUCT_PRIVATE
__EOF__
    }
        unless ($miniperl || $perl ) {
            if ($SDK_VARIANT eq 'S60' && $S60SDK =~ /^5\./) {
                print $fh "START RESOURCE\tsymbian\\PerlUi.rss\nEND\n";
            } else {
                print $fh "RESOURCE\tsymbian\\PerlUi.rss";
            }
	}
        close $fh;
    }
    else {
        warn "$0: failed to open $mmp for writing: $!\n";
    }
}

sub create_bld_inf {
    if ( open( BLD_INF, ">bld.inf" ) ) {
        print "\tbld.inf\n";
        push @unclean, "bld.inf";
        print BLD_INF <<__EOF__;
PRJ_PLATFORMS
${WIN} ${ARM}
PRJ_MMPFILES
__EOF__
        for (@mmp) { print BLD_INF $_, "\n" }
        close BLD_INF;
    }
    else {
        warn "$0: failed to open bld.inf for writing: $!\n";
    }
}

my %config;

sub load_config_sh {
    if ( open( CONFIG_SH, "symbian/config.sh" ) ) {
        while (<CONFIG_SH>) {
            if (/^(\w+)=['"]?(.*?)["']?$/) {
                my ( $var, $val ) = ( $1, $2 );
                $val =~ s/x.y.z/$R_V_SV/gi;
                $val =~ s/thumb/$ARM/gi;
		$val = "C:$val" if (defined($S90SDK) and ($val =~ /^(\/|\\\\)system[\/\\]/i));
                $val = "'$SYMBIAN_VERSION'" if $var eq 'osvers';
                $val = "'$SDK_VERSION'"     if $var eq 'sdkvers';
                $config{$var} = $val;
            }
        }
        close CONFIG_SH;
    }
    else {
        warn "$0: failed to open symbian\\config.sh for reading: $!\n";
    }
}

sub create_config_h {
    load_config_sh();
    if ( open( CONFIG_H, ">config.h" ) ) {
        print "\tconfig.h\n";
        push @unclean, "config.h";
        if ( open( CONFIG_H_SH, "config_h.SH" ) ) {
            while (<CONFIG_H_SH>) {
                last if /\#ifndef _config_h_/;
            }
            print CONFIG_H <<__EOF__;
/*
 * Package name      : perl
 * Source directory  : .
 * Configuration time: 
 * Configured by     : 
 * Target system     : symbian
 */

#ifndef _config_h_
__EOF__
            while (<CONFIG_H_SH>) {
                last if /!GROK!THIS/;
                s/\$(\w+)/exists $config{$1} ? $config{$1} : (warn "$0: config.sh missing '$1'\n", "")/eg;
                s/^#undef\s+(\S+).+/#undef $1/g;
                s:\Q/**/::;
                print CONFIG_H;
            }
            close CONFIG_H_SH;
        }
        else {
            warn "$0: failed to open ../config_h.SH for reading: $!\n";
        }
        close CONFIG_H;
    }
    else {
        warn "$0: failed to open config.h for writing: $!\n";
    }
}

sub create_DynaLoader_cpp {
    print "\text\\DynaLoader\\DynaLoader.cpp\n";
    system(
q[xsubpp ext\DynaLoader\dl_symbian.xs >ext\DynaLoader\DynaLoader.cpp]
      ) == 0
      or die "$0: creating DynaLoader.cpp failed: $!\n";
    push @unclean, 'ext\DynaLoader\DynaLoader.cpp';

}

sub create_symbian_port_h {
    print "\tsymbian\\symbian_port.h\n";
    if ( open( SYMBIAN_PORT_H, ">symbian/symbian_port.h" ) ) {
	my ($sdkmajor, $sdkminor);
        if ($SDK_VARIANT eq 'S60') {
	    $S60SDK =~ /^(\d+)\.(\d+)$/;
	    ($sdkmajor, $sdkminor) = ($1, $2);
	}
        if ($SDK_VARIANT eq 'S80') {
	    $S80SDK =~ /^(\d+)\.(\d+)$/;
	    ($sdkmajor, $sdkminor) = ($1, $2);
	}
        if ($SDK_VARIANT eq 'S90') {
	    $S90SDK =~ /^(\d+)\.(\d+)$/;
	    ($sdkmajor, $sdkminor) = ($1, $2);
	}
        if ($SDK_VARIANT eq 'UIQ') {
	    $UIQSDK =~ /^(\d+)\.(\d+)$/;
	    ($sdkmajor, $sdkminor) = ($1, $2);
	}
        print SYMBIAN_PORT_H <<__EOF__;
/* Copyright (c) 2004-2005, Nokia.  All rights reserved. */

#ifndef __symbian_port_h__
#define __symbian_port_h__

#define PERL_SYMBIANPORT_MAJOR $PORT{dll}->{MAJOR}
#define PERL_SYMBIANPORT_MINOR $PORT{dll}->{MINOR}
#define PERL_SYMBIANPORT_PATCH $PORT{dll}->{PATCH}

#define PERL_SYMBIANSDK_FLAVOR	L"$SDK_VARIANT"
#define PERL_SYMBIANSDK_MAJOR	$sdkmajor
#define PERL_SYMBIANSDK_MINOR	$sdkminor

#endif /* #ifndef __symbian_port_h__ */
__EOF__
        close(SYMBIAN_PORT_H);
	push @unclean, 'symbian\symbian_port.h';
    }
    else {
        warn "$0: failed to open symbian/symbian_port.h for writing: $!\n";
    }
}

sub create_perlmain_c {
    print "\tperlmain.c\n";
    system(
q[perl -ne "print qq[    char *file = __FILE__;\n] if /dXSUB_SYS/;print unless /PERL_UNUSED_CONTEXT/;print qq[    newXS(\"DynaLoader::boot_DynaLoader\", boot_DynaLoader, file);\n] if /dXSUB_SYS/;print qq[EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);\n] if /Do not delete this line/" miniperlmain.c > perlmain.c]
      ) == 0
      or die "$0: Creating perlmain.c failed: $!\n";
    push @unclean, 'perlmain.c';
}

sub create_PerlApp_pkg {
    print "\tsymbian\\PerlApp.pkg\n";
    if ( open( PERLAPP_PKG, ">symbian\\PerlApp.pkg" ) ) {
	my $ProductId =
	    defined $S60SDK ?
qq[;Supports Series 60 v0.9\n(0x101F6F88), 0, 0, 0, {"Series60ProductID"}\n] :
            defined $S80SDK ?
qq[;Supports Series 80 v2.0\n(0x101F8ED2), 0, 0, 0, {"Series80ProductID"}\n] :
            defined $S90SDK ?
qq[;Supports Series 90 v1.1\n(0x101FBE05), 0, 0, 0, {"Series90ProductID"}\n] :
            defined $UIQSDK && $SDK_VERSION =~  /^(\d)\.(\d)$/ ?
qq[;Supports UIQ v2.1\n(0x101F617B), $1, $2, 0, {"UIQ21ProductID"}\n] :
            ";Supports Series NN";
	my $APPS = $UREL;
	if (($SDK_VARIANT eq 'S60' && $SDK_VERSION ne '1.2' || $WIN eq 'winscw') || defined $S80SDK || defined $S90SDK) { # Do only if not in S60 1.2 VC.
	    $APPS =~ s!\\epoc32\\release\\(.+)\\$UARM$!\\epoc32\\data\\z\\system\\apps\\PerlApp!i;
	}
	# TODO: in S60 3.0 there will be no more recognizers.
	my $mdl = qq["$UREL\\PerlRecog.mdl"-"!:\\system\\recogs\\PerlRecog.mdl";];
	my $AIF = $SDK_VARIANT =~ /^S[689]0/ ? qq["$APPS\\PerlApp.aif"-"!:\\system\\apps\\PerlApp\\PerlApp.aif"] : "";
        print PERLAPP_PKG <<__EOF__;
; !!!!!!   DO NOT EDIT THIS FILE   !!!!!!
; This file is built by symbian\\config.pl.
; Any changes made here will be lost!
;
; PerlApp.pkg
;
; Note that the demo_pl needs to be run to create the demo .pl scripts.
;
; Languages
&EN;

; Standard SIS file header
#{"PerlApp"},(0x102015F6),0,2,0

$ProductId

; Files
"$UREL\\PerlApp.APP"-"!:\\system\\apps\\PerlApp\\PerlApp.app"
$mdl
"$APPS\\PerlApp.rsc"-"!:\\system\\apps\\PerlApp\\PerlApp.rsc"
$AIF
__EOF__
        if ( open( DEMOS, "perl symbian\\demo_pl list |" ) ) {
            while (<DEMOS>) {
                chomp;
		if (defined $S90SDK) {
                    print PERLAPP_PKG qq["$_"-"!:\\Mydocs\\Perl\\$_"\n];
		} else {
                    print PERLAPP_PKG qq["$_"-"!:\\Perl\\$_"\n];
	        }
            }
            close(DEMOS);
        }
        close(PERLAPP_PKG);
    }
    else {
        die "$0: symbian\\PerlApp.pkg: $!\n";
    }
    push @unclean, 'symbian\PerlApp.pkg';
}

print "Creating...\n";
create_mmp(
    'miniperl',             'exe',
    'miniperlmain.c',       'symbian\symbian_stubs.c',
    'symbian\PerlBase.cpp',
    'symbian\PerlUi.cpp',
    'symbian\PerlUtil.cpp',
    'symbian\symbian_utils.cpp',
);
create_mmp(
    "perl",                      'exe',
    'perlmain.c',                'symbian\symbian_stubs.c',
    'symbian\symbian_utils.cpp',
    'symbian\PerlBase.cpp',
    'symbian\PerlUi.cpp',
    'symbian\PerlUtil.cpp',
    'ext\DynaLoader\DynaLoader.cpp',
);

create_mmp(
    "perl$VERSION",              'dll',
    'symbian\symbian_dll.cpp',   'symbian\symbian_stubs.c',
    'symbian\symbian_utils.cpp',
    'symbian\PerlBase.cpp',
    'symbian\PerlUi.cpp',
    'symbian\PerlUtil.cpp',
    'ext\DynaLoader\DynaLoader.cpp',
);

create_bld_inf();
create_config_h();
create_perlmain_c();
create_symbian_port_h();
create_DynaLoader_cpp();
create_PerlApp_pkg();

if ( open( PERLAPP_MMP, ">symbian/PerlApp.mmp" ) ) {
    my @MACRO;
    my @LIB;
    push @MACRO, 'PERL_IMPLICIT_CONTEXT';
    push @MACRO, 'MULTIPLICITY';
    if (defined $S60SDK) {
        push @MACRO, '__SERIES60__';
        push @MACRO, '__SERIES60_1X__' if $S60SDK =~ /^1\./;
        push @MACRO, '__SERIES60_2X__' if $S60SDK =~ /^2\./;
	push @LIB, <<__EOF__;
LIBRARY		avkon.lib
LIBRARY		commondialogs.lib 
__EOF__
    }
    if (defined $S80SDK) {
        push @MACRO, '__SERIES80__';
        push @MACRO, '__SERIES80_1X__' if $S80SDK =~ /^1\./;
        push @MACRO, '__SERIES80_2X__' if $S80SDK =~ /^2\./;
	push @LIB, <<__EOF__;
LIBRARY		eikctl.lib
LIBRARY		eikcoctl.lib
LIBRARY		eikdlg.lib
LIBRARY		ckndlg.lib
__EOF__
    }
    if (defined $S90SDK) {
        push @MACRO, '__SERIES90__';
	push @LIB, <<__EOF__;
LIBRARY		eikctl.lib
LIBRARY		eikcoctl.lib
LIBRARY		eikdlg.lib
LIBRARY		ckndlg.lib
__EOF__
    }
    if (defined $UIQSDK) {
        push @MACRO, '__UIQ__';
        push @MACRO, '__UIQ_1X__' if $UIQSDK =~ /^1\./;
        push @MACRO, '__UIQ_2X__' if $UIQSDK =~ /^2\./;
	push @LIB, <<__EOF__;
LIBRARY		eikctl.lib
LIBRARY		eikcoctl.lib
LIBRARY		eikdlg.lib
LIBRARY		qikctl.lib
__EOF__
    }
    print PERLAPP_MMP <<__EOF__;
// !!!!!!   DO NOT EDIT THIS FILE   !!!!!!
// This file is built by symbian\\config.pl.
// Any changes made here will be lost!
TARGET            PerlApp.app
TARGETTYPE        app
UID               0x100039CE 0x102015F6
TARGETPATH        \\system\\apps\\PerlApp
SRCDBG
EXPORTUNFROZEN
SOURCEPATH        .
SOURCE            PerlApp.cpp 

USERINCLUDE       .
USERINCLUDE       ..
USERINCLUDE       \\symbian\\perl\\$R_V_SV\\include

SYSTEMINCLUDE     \\epoc32\\include
SYSTEMINCLUDE     \\epoc32\\include\\libc

LIBRARY           apparc.lib
LIBRARY           bafl.lib
LIBRARY           charconv.lib 
LIBRARY           cone.lib
LIBRARY           efsrv.lib
LIBRARY           eikcore.lib
LIBRARY           estlib.lib 
LIBRARY           euser.lib
LIBRARY           perl$VERSION.lib
@LIB
RESOURCE          perlapp.rss
__EOF__
    if (@MACRO) {
	for my $macro (@MACRO) {
	    print PERLAPP_MMP <<__EOF__;
MACRO             $macro
__EOF__
        }
    }
    if ($SDK_VARIANT =~ /^S[689]0$/) {
        print PERLAPP_MMP <<__EOF__;
AIF               PerlApp.aif . PerlAppAif.rss 
__EOF__
    }
    close(PERLAPP_MMP);
    push @unclean, 'symbian\PerlApp.mmp';
}
else {
    warn "$0: failed to create symbian\\PerlApp.mmp";
}

if ( open( MAKEFILE, ">Makefile" ) ) {
    my $perl = "perl$VERSION";
    my $windef1 = "$SYMBIAN_ROOT\\Epoc32\\Build$CWD\\$perl\\$WIN\\$perl.def";
    my $windef2 = "..\\BWINS\\${perl}u.def";
    my $armdef1 = "$SYMBIAN_ROOT\\Epoc32\\Build$CWD\\$perl\\$ARM\\$perl.def";
    my $armdef2 = "..\\BMARM\\${perl}u.def";
    my $MF = $WIN eq 'wins' ? 'vc6' : $WIN eq 'winscw' ? 'cw_ide' : "UNKNOWN";
    print "\tMakefile\n";
    print MAKEFILE <<__EOF__;
help:
	\@echo === Perl for Symbian ===
	\@echo Useful targets:
	\@echo all win arm clean
	\@echo perldll.sis perlext.sis perlsdk.zip

WIN	= ${WIN}
ARM	= ${ARM}

all:	build

build:	rename_makedef build_${WIN} build_arm

@unclean: symbian\\config.pl
	perl symbian\\config.pl

build_${WIN}:	abld.bat perldll_${WIN}

build_vc6:	abld.bat perldll_wins

build_vc7:	abld.bat perldll_wins

build_cw:	abld.bat perldll_winscw

build_arm:	abld.bat perl_arm miniperl_arm perldll_arm

miniperl_win miniperl_${WIN}:	miniperl.mmp abld.bat rename_makedef
	abld build ${WIN} udeb miniperl

miniperl_arm:	miniperl.mmp abld.bat rename_makedef
	abld build \$(ARM) $UARM miniperl

miniperl:	miniperl_${WIN} miniperl_arm

perl:	perl_${WIN} perl_arm

perl_win perl_${WIN}:	perl.mmp abld.bat rename_makedef
	abld build ${WIN} perl

perl_arm:	perl.mmp abld.bat rename_makedef
	abld build \$(ARM) $UARM perl

perldll_win perldll_${WIN}: perl${VERSION}_${WIN} freeze_${WIN} perl${VERSION}_${WIN}

perl${VERSION}_win perl${VERSION}_${WIN}:	perl$VERSION.mmp abld.bat rename_makedef
	abld build ${WIN} perl$VERSION

perldll_arm: perl${VERSION}_arm freeze_arm perl${VERSION}_arm

perl${VERSION}_arm:	perl$VERSION.mmp abld.bat rename_makedef
	abld build \$(ARM) $UARM perl$VERSION

perldll perl$VERSION:	perldll_${WIN} perldll_arm

win ${WIN}:	miniperl_${WIN} perl_${WIN} perldll_${WIN}

thumb arm:	miniperl_arm perl_arm perldll_arm

rename_makedef:
	-ren makedef.pl nomakedef.pl

# Symbian SDK has a makedef.pl of its own,
# and we don't need Perl's.
rerename_makedef:
	-ren nomakedef.pl makedef.pl

symbian\\PerlUi.rss: symbian\\PerlUi$SDK_VARIANT.rss
	copy symbian\\PerlUi$SDK_VARIANT.rss symbian\\PerlUi.rss

abld.bat abld: bld.inf symbian\\PerlUi.rss
	bldmake bldfiles

vc6:	win.mf vc6.mf build_vc6

vc7:	win.mf vc7.mf build_vc7

cw:	win.mf cw.mf build_cw

${WIN}_miniperl.mf: abld.bat symbian\\config.pl
	abld makefile ${MF} miniperl
	echo > ${WIN}_miniperl.mf

${WIN}_perl.mf: abld.bat symbian\\config.pl
	abld makefile ${MF} perl
	echo > ${WIN}_perl.mf

${WIN}_${VERSION}.mf: abld.bat symbian\\config.pl
	abld makefile ${MF} perl${VERSION}
	echo > ${WIN}_${VERSION}.mf

symbian\\${WIN}.mf:
	cd symbian; make ${WIN}.mf

${WIN}.mf: ${WIN}_miniperl.mf ${WIN}_perl.mf ${WIN}_${VERSION}.mf symbian\\${WIN}.mf

arm_miniperl.mf: abld.bat symbian\\config.pl
	echo > arm_miniperl.mf

arm_perl.mf: abld.bat symbian\\config.pl
	echo > arm_perl.mf

arm_${VERSION}.mf: abld.bat symbian\\config.pl
	echo > arm_${VERSION}.mf

arm.mf: arm_miniperl.mf arm_perl.mf arm_${VERSION}.mf

win.mf:  vc6.mf cw.mf
	echo > win.mf

vc6.mf: abld.bat symbian\\config.pl
	abld makefile vc6
	echo > vc6.mf

vc7.mf: abld.bat symbian\\config.pl
	abld makefile vc7
	echo > vc7.mf

cw.mf: abld.bat symbian\\config.pl
	abld makefile cw_ide
	echo > cw.mf

PM  = lib\\Config.pm lib\\Cross.pm lib\\lib.pm ext\\DynaLoader\\DynaLoader.pm ext\\DynaLoader\\XSLoader.pm ext\\Errno\\Errno.pm
POD = lib\\Config.pod

pm:	\$(PM)

XLIB	= -Ixlib\\symbian

XSBOPT	= --win=\$(WIN) --arm=\$(ARM)

lib\\Config.pm:
	copy symbian\\config.sh config.sh
__EOF__
    if (defined $S90SDK) {
        print MAKEFILE <<__EOF__;
	perl -pi.bak -e "s:x\\.y\\.z+:$R_V_SV:g; s!='(\\\\\\\\system)!='C:\\1!" config.sh
__EOF__
    } else {
        print MAKEFILE <<__EOF__;
	perl -pi.bak -e "s:x\\.y\\.z+:$R_V_SV:g" config.sh
__EOF__
    };
    print MAKEFILE <<__EOF__;
	perl \$(XLIB) configpm --cross=symbian
	copy xlib\\symbian\\Config.pm lib\\Config.pm
	perl -pi.bak -e "s:x\\.y\\.z:$R_V_SV:g" lib\\Config.pm
	perl -pi.bak -e "s:5\\.\\d+\\.\\d+:$R_V_SV:g" lib\\Config.pm
	-perl -pi.bak -e "s:x\\.y\\.z:$R_V_SV:g" xlib\\symbian\\Config_heavy.pl

lib\\lib.pm:
	perl lib\\lib_pm.PL

ext\\DynaLoader\\DynaLoader.pm:
	-del /f ext\\DynaLoader\\DynaLoader.pm
	perl -Ixlib\\symbian ext\\DynaLoader\\DynaLoader_pm.PL
	perl -pi.bak -e "s/__END__//" DynaLoader.pm
	copy /y DynaLoader.pm ext\\DynaLoader\\DynaLoader.pm
	-del /f DynaLoader.pm DynaLoader.pm.bak

ext\\DynaLoader\\XSLoader.pm:
	perl \$(XLIB) symbian\\xsbuild.pl \$(XSBOPT) XSLoader

ext\\Errno\\Errno.pm:
	perl \$(XLIB) symbian\\xsbuild.pl \$(XSBOPT) Errno

miniperlexe.sis:	miniperl_arm symbian\\makesis.pl
	perl \$(XLIB) symbian\\makesis.pl miniperl

perlexe.sis:	perl_arm symbian\\makesis.pl
	perl \$(XLIB) symbian\\makesis.pl perl


allsis: all miniperlexe.sis perlexe.sis perldll.sis perllib.sis perlext.sis perlapp.sis

perldll.sis perl$VERSION.sis:	perldll_arm pm symbian\\makesis.pl
	perl \$(XLIB) symbian\\makesis.pl perl${VERSION}dll

perl${VERSION}lib.sis perllib.sis:	\$(PM)
	perl \$(XLIB) symbian\\makesis.pl perl${VERSION}lib

perl${VERSION}ext.sis perlext.sis:	perldll_arm buildext_sis
	perl symbian\\makesis.pl perl${VERSION}ext

EXT = 	Compress::Raw::Zlib Cwd Data::Dumper Devel::Peek Digest::MD5 Errno Fcntl File::Glob Filter::Util::Call IO List::Util MIME::Base64 PerlIO::scalar PerlIO::via SDBM_File Socket Storable Time::HiRes XSLoader attributes

buildext: perldll symbian\\xsbuild.pl lib\\Config.pm
	perl \$(XLIB) symbian\\xsbuild.pl \$(XSBOPT) \$(EXT)

buildextcpp: perldll symbian\\xsbuild.pl lib\\Config.pm
	perl \$(XLIB) symbian\\xsbuild.pl --csuffix .cpp \$(XSBOPT) \$(EXT)

buildext_sis: perldll.sis symbian\\xsbuild.pl lib\\Config.pm
	perl \$(XLIB) symbian\\xsbuild.pl \$(XSBOPT) --sis \$(EXT)

buildextcpp_sis: perldll.sis symbian\\xsbuild.pl lib\\Config.pm
	perl \$(XLIB) symbian\\xsbuild.pl --csuffix .cpp \$(XSBOPT) --sis \$(EXT)

cleanext: symbian\\xsbuild.pl
	perl \$(XLIB) symbian\\xsbuild.pl \$(XSBOPT) --clean \$(EXT)

distcleanext: symbian\\xsbuild.pl
	perl \$(XLIB) symbian\\xsbuild.pl \$(XSBOPT) --distclean \$(EXT)

sis makesis:	miniperl perl perldll pm buildext perlapp.sis
	perl \$(XLIB) symbian\\makesis.pl

APIDIR = \\Symbian\\perl\\$R_V_SV

sdkinstall:
	-mkdir \\Symbian\\perl
	-mkdir \\Symbian\\perl\\$R_V_SV
	-mkdir \$(APIDIR)\\include
	-mkdir \$(APIDIR)\\include\\symbian
	-mkdir \$(APIDIR)\\lib
	-mkdir \$(APIDIR)\\lib\\ExtUtils
	-mkdir \$(APIDIR)\\pod
	-mkdir \$(APIDIR)\\bin
	-mkdir \$(BINDIR)
	copy /y *.h   \$(APIDIR)\\include
	-copy /y *.inc \$(APIDIR)\\include
	copy /y lib\\ExtUtils\\xsubpp  \$(APIDIR)\\lib\\ExtUtils
	copy /y lib\\ExtUtils\\typemap \$(APIDIR)\\lib\\ExtUtils
	copy /y lib\\ExtUtils\\ParseXS.pm \$(APIDIR)\\lib\\ExtUtils
	copy /y symbian\\xsbuild.pl    \$(APIDIR)\\bin
	copy /y symbian\\sisify.pl     \$(APIDIR)\\bin
	copy /y symbian\\PerlBase.h    \$(APIDIR)\\include
	copy /y symbian\\PerlUi.h      \$(APIDIR)\\include
	copy /y symbian\\PerlUtil.h    \$(APIDIR)\\include
	copy /y symbian\\symbian*.h    \$(APIDIR)\\include\\symbian
	copy /y symbian\\PerlBase.pod  \$(APIDIR)\\pod
	copy /y symbian\\PerlUtil.pod  \$(APIDIR)\\pod

RELDIR  = $SYMBIAN_ROOT\\epoc32\\release
RELWIN = \$(RELDIR)\\\$(WIN)\\udeb
RELARM = \$(RELDIR)\\\$(ARM)\\$UARM
SDKZIP = perl${VERSION}sdk.zip


\$(SDKZIP) perlsdk.zip: perldll sdkinstall
	-del /f perl${VERSION}sdk.zip
	zip -r perl${VERSION}sdk.zip \$(RELWIN)\\perl$VERSION.* \$(RELARM)\\perl$VERSION.* \$(APIDIR)
	\@echo perl${VERSION}sdk.zip created.

PERLSIS = perl${VERSION}.SIS perl${VERSION}lib.SIS perl${VERSION}ext.SIS
ALLSIS  = \$(PERLSIS) perlapp.sis
ETC     = README.symbian symbian\\PerlBase.pod symbian\\PerlUtil.pod symbian\\sisify.pl symbian\\TODO

perl${VERSION}dist.zip perldist.zip: \$(ALLSIS) \$(SDKZIP) \$(ETC)
	-del /f perl${VERSION}dist.zip
	zip -r perl${VERSION}dist.zip \$(ALLSIS) \$(SDKZIP) \$(ETC)

perlapp:	sdkinstall perlapp_${WIN} perlapp_arm

perlapp_arm_minimal sisify_hex perlappmin.hex perlrscmin.hex:	sdkinstall config.h
	cd symbian; make perlapp_arm USERDEFS=-DCreatePerlAppMinimal
	perl symbian\\hexdump.pl

perlapp_win perlapp_${WIN}: config.h
	cd symbian; make perlapp_${WIN}

perlapp_arm: config.h
	cd symbian; make perlapp_arm

perlapp_arm_clean:
	cd symbian; make clean

perlapp_demo_extract:
	cd symbian; make perlapp_demo_extract

perlapp.sis: perlapp_arm
	cd symbian; make perlapp.sis

perlapp.zip:
	cd symbian; zip perlapp.zip PerlApp.* PerlRecog.* PerlBase.* PerlUtil.* demo_pl

zip:	perlsdk.zip perlapp.zip

freeze:	freeze_${WIN} freeze_arm

freeze_${WIN}:
	abld freeze ${WIN} perl$VERSION

freeze_arm:
	abld freeze \$(ARM) perl$VERSION

defrost:	defrost_${WIN} defrost_arm

defrost_${WIN}:
	-del /f $windef1
	-del /f $windef2

defrost_arm:
	-del /f $armdef1
	-del /f $armdef2

clean_${WIN}: abld.bat
	abld clean ${WIN}

clean_arm: abld.bat
	abld clean \$(ARM)

clean:	clean_${WIN} clean_arm rerename_makedef
	-del /f \$(PM)
	-del /f \$(POD)
	-del /f lib\\Config.pm.bak
	-del /f xlib\\symbian\\Config_heavy.pl
	-rmdir /s /q xlib
	-del /f config.sh
	-del /f DynaLoader.pm ext\\DynaLoader\\DynaLoader.pm
	-del /f ext\\DynaLoader\\Makefile
	-del /f ext\\SDBM_File\\sdbm\\Makefile
	-del /f symbian\\*.lst
	-del /f abld.bat @unclean *.pkg *.sis *.zip
	-del /f symbian\\abld.bat symbian\\*.sis symbian\\*.zip
	-del /f symbian\\perl5*.pkg symbian\\miniperl.pkg
	-del arm_*.mf ${WIN}_*.mf vc*.mf cw*.mf
	-del symbian\\Makefile
	-del symbian\\PerlUi.rss symbian\\PerlApp.rss
	-del perlappmin.hex perlrscmin.hex
	-perl symbian\\xsbuild.pl \$(XSBOPT) --clean \$(EXT)
	-rmdir /s /q perl${VERSION}_Data
	-cd symbian; make clean

reallyclean: abld.bat
	abld reallyclean

distclean: defrost reallyclean clean
	-perl symbian\\xsbuild.pl \$(XSBOPT) --distclean \$(EXT)
	-del /f config.h config.sh.bak symbian\\symbian_port.h
	-del /f Makefile symbian\\PerlApp.mmp
	-del /f BMARM\\*.def
	-del /f *.cwlink *.resources *.pref
	-del /f perl${VERSION}.xml perl${VERSION}.mcp uid.cpp
	-rmdir /s /q BMARM
	cd symbian; make distclean
	-del /f symbian\\Makefile
__EOF__
    close MAKEFILE;
}
else {
    warn "$0: failed to create Makefile: $!\n";
}

if ( open( MAKEFILE, ">symbian/Makefile")) {
    my $wrap = defined $S60SDK && $S60SDK eq '1.2' && $WIN ne '${WIN}cw';
    my $ABLD = $wrap ? 'perl b.pl': 'abld';
    print "\tsymbian/Makefile\n";
    my $MF = $WIN eq 'wins' ? 'vc6' : $WIN eq 'winscw' ? 'cw_ide' : "UNKNOWN";
    print MAKEFILE <<__EOF__;
WIN = $WIN
ARM = $ARM
ABLD = $ABLD
MF = $MF

abld.bat:
	bldmake bldfiles

perlapp_${WIN}: abld.bat ..\\config.h PerlApp.h PerlApp.cpp
	copy PerlUi$SDK_VARIANT.rss PerlApp.rss
	bldmake bldfiles
	\$(ABLD) build ${WIN} udeb

perlapp_arm: ..\\config.h PerlApp.h PerlApp.cpp
	copy PerlUi$SDK_VARIANT.rss PerlApp.rss
	bldmake bldfiles
	\$(ABLD) build ${ARM} $UARM

$MF:
	abld makefile $MF

win.mf:
	bldmake bldfiles
	abld makefile $MF

perlapp_demo_extract:
	perl demo_pl extract

perlapp.sis: perlapp_arm perlapp_demo_extract
	-del /f perlapp.SIS
	makesis perlapp.pkg
	copy /y perlapp.SIS ..\\perlapp.SIS

clean:
	-perl demo_pl cleanup
	-del /f perlapp.sis
	-del /f b.pl
	-del PerlApp.rss
	abld clean $WIN
	abld clean thumb
	-del Makefile

distclean: clean
	-del /f *.cwlink *.resources *.pref
	-del /f PerlApp.xml PerlApp.mcp uid.cpp
	-rmdir /s /q PerlApp_Data
	-del /f abld.bat
__EOF__
    close(MAKEFILE);
    if ($wrap) {
	if ( open( B_PL, ">symbian/b.pl")) {
	    print B_PL <<'__EOF__';
# abld.pl wrapper.

# nmake doesn't like MFLAGS and MAKEFLAGS being set to -w and w.
delete $ENV{MFLAGS};
delete $ENV{MAKEFLAGS};

system("abld @ARGV");
__EOF__
	    close(B_PL);
	} else {
	    warn "$0: failed to create symbian/b.pl: $!\n";
	}
    }
} else {
    warn "$0: failed to create symbian/Makefile: $!\n";
}

print "Deleting...\n";
for my $config (
		# Do not delete config.h here.
		"config.sh",
		"lib\\Config.pm",
		"xlib\\symbian\\Config.pm",
		"xlib\\symbian\\Config_heavy.pl",
		"symbian\\PerlUi.rss",
		"symbian\\PerlApp.rss",
		) {
    print "\t$config\n";
    unlink($config);
}

print <<__EOM__;
Configuring done.
Now you can run:
    make all
    make allsis
__EOM__

1;    # Happy End.