Subversion Repositories DevTools

Rev

Blame | Last modification | View Log | RSS feed

# -*- mode: perl; indent-width: 4; -*-
##############################################################################
# Copyright (c) ERG Transit Systems. 1996-2004
#
# File:         PLATFORM/amx
#
# Contents:     AMX support
#
#               Defines rules to build the following:
#
#                   SCF     Software configuration
#                   TCF     Target configuration
#                   PCF     AMX/ES configuration (CJ8xx/386 only)
#                   INS     Insight configuration module
#
# Revision History:
#   30/08/99    APY     ToolsetGenerate/ToolsetObjs
#   09/12/99    APY     ToolsetDir
#   09/03/00    APY     Missed ToolsetGenerate/Objs statements for 
#                       amx_xxx (AMX/EP) builds.
#   13/11/00    APY     ${exe} includes embedded '.'
#   29/03/02    APY     pd386 toolset
###############################################################################

AmxInit();

###############################################################################
#.  AMX platform runtime configuration
#
###############################################################################
sub AmxInit
{
    Init( "amx" );
    PlatformDefines( "amx.def" );
}


###############################################################################
#   AmxLib( $name, $amx, $insight )
#       Builds the rules required to build AMX application objects
#       into a library
#
#  Rules:
#       $(OBJDIR)/${name}.${a}: \       (assumed image from caller)
#               objs ...
#       obj:        source
#               $(CC)|$(AS)
#       source:     axm
#               $(AXM)
#....

sub AmxLib
{
    my( $name, $amx, $insight ) = @_;

    return 0 if (! $amx);
    AmxCfgRules( $name, $amx, ${a}, $insight );
}


###############################################################################
#   AmxLink( $name, $amx, $insight, \@objs, \@libraries )
#       Builds the rules required to link an AMX application
#
#  Rules:
#       $(BINDIR)/${name}${exe}: \      (assumed image from caller)
#               objs ...
#       obj:        source
#               $(CC)|$(AS)
#       source:     axm
#               $(AXM)
#
#  Returns:
#       Appends additional objects and libraries required to build
#       an AMX based application.
#....

sub AmxLinkStd
{
    my( $name, $pObjs, $pLibs ) = @_;

    AmxStdRules( $name );
    AmxStdStuff( $name, $pObjs, $pLibs );
}

sub AmxLinkCfg
{
    my( $name, $amx, $insight, $pObjs, $pLibs ) = @_;

    return 0 if (! $amx);

#.. Rules for generated modules
#
    AmxStdRules( $name );
    AmxCfgRules( $name, $amx, ${exe}, $insight );

#.. Objects and libraries required for builds
#
    AmxStdStuff( $name, $pObjs, $pLibs );
    AmxCfgStuff( $name, $amx, $insight, $pObjs, $pLibs );
}


###############################################################################
#   AmxStdStuff( $name, $amx, $insight, \@objs, \@libraries )
#       Appends additional objects and libraries required to build
#       an AMX based application.
#..

sub AmxStdStuff
{
    my( $name, $pObjs, $pLibs ) = @_;

# Objects
#
#       Toolset         Objects
#       wc386           amx_xxx, cjXXXwc
#       pd386           amx_xxx, cjXXXpd
#       mri68k          cjXXXuf
#..
    if ( $ScmToolset eq "wc386" )
    {
        @$pObjs = ( "\$(OBJDIR)/${name}/amx_xxx", @$pObjs );
        push( @$pObjs, "\$(amx_libdir)/obj\$(amx_calling)/\$(amx_name)wc" );
    }
    elsif ( $ScmToolset eq "pd386" )
    {
        @$pObjs = ( "\$(OBJDIR)/${name}/amx_xxx", @$pObjs );
    }
    elsif ( $ScmToolset eq "mri68k" )
    {
        push( @$pObjs, "\$(amx_libdir)/\$(amx_name)uf" );
    }
    else
    {
        Message( "AMX: unknown toolset '$ScmToolset'\n" );
    }

# Libraries,
#   Note:   Libraries must be pushed (after) APP/EOS libraries.
#..
                                                      # AMX kernel
    push( @$pLibs, "\$(amx_libdir)/\$(amx_name)\$(amx_calling)" );

    push( @$pLibs, "--ifdef=amx_compat" );            # AMX v1 compat
    push( @$pLibs, "\$(amx_libdir)/\$(amx_name)cv\$(amx_calling)" );

    push( @$pLibs, "--ifdef=amx_filesystem" );        # AMX/FS optional
    push( @$pLibs, "\$(amxfs_libdir)/\$(amx_fsname)\$(amx_calling)" );
}


###############################################################################
#   AmxCfgStuff( $name, $amx, $insight, \@objs, \@libraries )
#       Appends additional objects and libraries required to build
#       an AMX module into an application.
#..

sub AmxCfgLink
{
    my( $name, $amx, $insight, $pObjs, $pLibs ) = @_;

    @$pObjs = ( "\$(OBJDIR)/${name}/amx_icf", @$pObjs )
        if ( $insight );
    @$pObjs = ( "\$(OBJDIR)/${name}/amx_pcf", @$pObjs )
        if ( $ScmToolset eq "wc386" );
    @$pObjs = ( "\$(OBJDIR)/${name}/amx_tcf", @$pObjs );
    @$pObjs = ( "\$(OBJDIR)/${name}/amx_scf", @$pObjs );
}


###############################################################################
#   AmxStdRules( $name, $amx, $insight )
#       Builds the rules required to build an AMX application
#
#   Rules:
#       objs ...
#
#   ToolsetRules:
#
#       obj:        source
#               $(CC)|$(AS)
#       source:     axm
#               $(AXM)
#....

sub AmxStdRules
{
    my( $name ) = @_;

#.. Add to callers dependencies
#
    MakePrint( "\\\n\t\t\$(OBJDIR)/${name}/amx_xxx.${o}" )
        if ( $ScmToolset eq "wc386" || $ScmToolset eq "pd386" );

#.. Toolset
#
    if ( $ScmToolset eq "wc386" || $ScmToolset eq "pd386" )
    {
        ToolsetRule(
                "\$(OBJDIR)/${name}/amx_xxx.${o}:       \$(OBJDIR)/${name}/amx_xxx.c\n" .
                "\t\$(CC)\n" .
                "\$(OBJDIR)/${name}/amx_xxx.c:          \$(SCM_PLATFORM).pl\n" .
                "\t@\$(mkdir) -p \$(OBJDIR)/${name}\n" .
                "\t\$(amx_xxx)\n" );

        ToolsetDir( "\$(OBJDIR)/${name}" );
        ToolsetGenerate( "\$(OBJDIR)/${name}/amx_xxx.c" );
        ToolsetObj( "\$(OBJDIR)/${name}/amx_xxx" );
    }
}


###############################################################################
#   AmxCfgRules( $name, $amx, $ext, $insight )
#       Builds the rules required to build AMX configuration objects.
#
#   Rules:
#       objs ...
#
#   ToolsetRules:
#
#       obj:        source
#               $(CC)|$(AS)
#       source:     axm
#               $(AXM)
#....

sub AmxCfgRules
{
    my( $name, $amx, $ext, $insight ) = @_;
    my( $scf, $tcf ) = @_;

    $scf = MakeSrcResolve( "${amx}.scf" );      # resolve source name
    $tcf = MakeSrcResolve( "${amx}.tcf" );

#.. Add to callers dependencies
#
    MakePrint( "\\\n\t\t\$(OBJDIR)/${name}/amx_scf.${o}" .
               "\\\n\t\t\$(OBJDIR)/${name}/amx_tcf.${o}" );

#.. Object rules
#
    ToolsetRule(
        "##################################################################\n" .
        "#      AMX configuration for ${name}.${ext}\n" .
        "#..\n" .
        "\n" .
        "\$(OBJDIR)/${name}/amx_scf.${o}:       \$(OBJDIR)/${name}/amx_scf.c\n" .
            "\t\$(CC)\n" .
        "\$(OBJDIR)/${name}/amx_tcf.${o}:       \$(OBJDIR)/${name}/amx_tcf.${s}\n" .
            "\t\$(AS)\n" .
        "\$(OBJDIR)/${name}/amx_scf.c:  $scf\n" .
            "\t@\$(mkdir) -p \$(OBJDIR)/${name}\n" .
            "\t\$(amx_scf)\n" .
        "\$(OBJDIR)/${name}/amx_tcf.${s}:       $tcf\n" .
            "\t\$(amx_tcf)\n" );

    ToolsetDir( "\$(OBJDIR)/${name}" );
    ToolsetGenerate( "\$(OBJDIR)/${name}/amx_scf.c" );
    ToolsetObj( "\$(OBJDIR)/${name}/amx_scf" );
    ToolsetGenerate( "\$(OBJDIR)/${name}/amx_tcf.${s}" );      # Object
    ToolsetGenerate( "\$(OBJDIR)/${name}/amx_tcf.lst" );       # List file
    ToolsetObj( "\$(OBJDIR)/${name}/amx_tcf" );

    if ( $ScmToolset eq "wc386" )                              # AMX/ET
    {
    #.. Add to callers dependencies
    #
        MakePrint( "\\\n\t\t\$(OBJDIR)/${name}/amx_pcf.${o}" );

    #.. Object rules
    #
        ToolsetRule(
            "\$(OBJDIR)/${name}/amx_pcf.${o}:   \$(OBJDIR)/${name}/amx_pcf.${s}\n" .
                "\t\$(AS)\n" .
            "\$(OBJDIR)/${name}/amx_pcf.${s}:   $scf\n" .
                "\t\$(amx_pcf)\n" );

        ToolsetGenerate("\$(OBJDIR)/${name}/amx_pcf.${s}");    # Object
        ToolsetGenerate("\$(OBJDIR)/${name}/amx_pcf.lst");     # List file
        ToolsetObj("\$(OBJDIR)/${name}/amx_pcf");
    }

    if ( $insight )
    {
    #.. Add to callers dependencies
    #
        MakePrint( "\\\n\t\$(OBJDIR)/${name}/amx_icf.${o}" );

    #.. Object rules
    #
        ToolsetRule(
            "\$(OBJDIR)/${name}/amx_icf.${o}:   \$(OBJDIR)/${name}/amx_icf.c\n" .
            "\$(OBJDIR)/${name}/amx_icf.c:      $scf\n" .
                "\t\$(amx_icf)\n" );

        ToolsetGenerate( "\$(OBJDIR)/${name}/amx_icf.c}" );
        ToolsetObj( "\$(OBJDIR)/${name}/amx_icf" );
    }

    ToolsetRule( "\n#\n" );
}


###############################################################################
#   AmxLibISP( $name, $cfg )
#       Builds the rules required to build AMX ISP into a library
#
#   AmxLinkISP( $name, $cfg, \@objs, \@libs )
#       Builds the rules required to build AMX ISP into an application
#
#  Rules:
#       $(OBJDIR)/${name}${exe}|${a}: \                 (assumed)
#               objs ...
#       obj:        source
#               $(CC)|$(AS)
#       source:     axm
#               $(AXM)
#....

sub AmxLibISP
{
    my( $name, $cfg ) = @_;
    AmxIntRules( $name, ${a}, $cfg );
}


sub AmxLinkISP
{
    my( $name, $cfg, $pObjs, $pLibs ) = @_;

    AmxIntRules( $name, ${exe}, $cfg );
    push( @$pObjs, "\$(OBJDIR)/${name}/${cfg}.${o}" );
}


###############################################################################
#   AmxISPRules( $name, $cfg )
#       Builds the rules required to build an AMX ISP module
#
#   ToolsetRules:
#
#       obj:        source
#               $(AS)
#       source:     axm
#               $(AXM)
#....

sub AmxIntRules
{
    my( $name, $ext, $cfg ) = @_;
    my( $icf );

#.. Add to callers dependencies
#
    MakePrint( "\\\n\t\t\$(OBJDIR)/${name}/${cfg}.${o}" );

#.. Objects rules
#
    $icf = MakeSrcResolve( "${cfg}.icf" );      # resolve source name

    ToolsetRule(
        "##################################################################\n" .
        "#      AMX Interrupt Service Procedure (ISP) for ${name}.${ext}\n" .
        "#..\n" .
        "\n" .
        "\$(OBJDIR)/${name}/${cfg}.${o}:        \$(OBJDIR)/${name}/${cfg}.${s}\n" .
            "\t\$(AS)\n" .
        "\$(OBJDIR)/${name}/${cfg}.${s}:        $icf\n" .
            "\t@\$(mkdir) -p \$(OBJDIR)/${name}\n" .
            "\t\$(amx_int)\n" );

    ToolsetDir( "\$(OBJDIR)/${name}" );
    ToolsetGenerate( "\$(OBJDIR)/${name}/${cfg}.${s}" );       # Object
    ToolsetGenerate( "\$(OBJDIR)/${name}/${cfg}.lst" );        # List file
    ToolsetObj( "\$(OBJDIR)/${name}/${cfg}" );

    ToolsetRule("\n#\n");
}