# -*- 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"); }