Rev 261 | Blame | Compare with Previous | Last modification | View Log | RSS feed
# -*- mode: perl; tabs: 8; indent-width: 4; show-tabs: yes; -*-## Module name : mri68k# Module type : Makefile system# Compiler(s) : ANSI C# Environment(s): AMX/EOS## ! WARNING - do not detab !## Description:# MRI 68k toolset## Version Who Date Description# 1.0 APY 07/05/99 Created# 1.3 APY 06/12/99 NetTcp/NetUdp linker options# 09/12/99 ToolsetProg()# 1.5 06/01/00 Linker --Kdb support# 07/01/00 ifeq "$(IFLAG)" "3"# around -include directives# 14/03/99 vpath2() for remove abs depend issues# 15/03/00 Wasn't build dependency list for binaries.# 1.9 APY 16/03/00 --Section switch# 1.10 APY 06/04/00 MRI version (4.4) support# 26/04/00 --NetTcpx# APY 13/11/00 ${exe} now embeddes '.' if required.# 2.0 APY 26/02/02 Build system +v2 support.# - reconstructed isp creation# - replaced ToolsetProg() with ToolsetGenerate().# - ToolsetCC and ToolsetCXX switch processing# 30/04/02 --Isp must allow multiple specifications.# 07/05/02 --Section## $Name: $# $Source: /cvsroot/etm/devl/CFG/TOOLSET/MRI68K,v $# $Revision: 1.3 $ $Date: 2004/09/03 10:25:23 $ $State: Exp $# $Author: ayoung $ $Locker: $#............................................................................################################################################################ ToolsetInit()# Runtime initialisation###############################################################################ToolsetInit();$MriVersion = "4.3"; # Compiler versionsub ToolsetInit{my( @args ) = @ScmToolsetArgs; # Toolset arguments#.. Parse arguments#Debug( "mri68k(@args)" );foreach $_ ( @args ) {if (/^--Version=(.*)/) { # Compiler version$MriVersion = "$1";} else { # Unknown optionMessage( "mri68k: unknown option $_ -- ignored\n" );}}#.. Standard.rul requirements#$s = 'asm'; # Assembler source file$o = 'obj'; # Object file$a = 'lib'; # Library file$exe = ""; # Dummy, real image is either 'abs' or 'bin'#.. Define MRI environment#Init( "mri", "mri2" );ToolsetDefine( "#################################################" );ToolsetDefine( "# MRI compiler version" );ToolsetDefine( "#" );ToolsetDefine( "mri_ver = $MriVersion" );ToolsetDefine( "" );ToolsetDefine( "#" );ToolsetDefines( "mri68k.def" );ToolsetRules( "mri68k.rul" );ToolsetRules( "standard.rul" );}################################################################################ ToolsetCC( $source, $obj, \@args )# This subroutine takes the user options and builds the rule(s)# required to compile the source file 'source' to 'obj'################################################################################sub ToolsetCC{my( $source, $obj, $pArgs ) = @_;Debug( "CC: $source -> $obj" );foreach ( @$pArgs ) {Debug( "option: $_" );if ( /--Shared$/ ) { # Building a 'shared' object$cflags = "$cflags \$(SHCFLAGS)";Debug( "CC: as shared object" );} else { # unknown optionMessage( "CC: unknown option $_ -- ignored\n" );}}MakePrint( "\n\t\$(CC)\n" );MakePrint( "\$(OBJDIR)/$i.${o}:\tCFLAGS +=$cflags\n" )if ( $cflags );}################################################################################ ToolsetCCDepend( $depend, \@sources )# This subroutine takes the user options and builds the# rule(s) required to build the dependencies for the source# files 'sources' to 'depend'.################################################################################sub ToolsetCCDepend{MakePrint( "\t\$(CCDEPEND)\n" );}################################################################################ ToolsetCXX( $source, $obj, \@args )# This subroutine takes the user options and builds the rule(s)# required to compile the source file 'source' to 'obj'################################################################################sub ToolsetCXX{my( $source, $obj, $pArgs ) = @_;my( $cflags ) = "";Debug( "CCX: $source -> $obj" );foreach ( @$pArgs ) {Debug( "option: $_" );if ( /--Shared$/ ) { # Building a 'shared' object$cflags = "$cflags \$(SHCXXFLAGS)";Debug( "CCX: as shared object" );} else {Message( "CCX: unknown option $_ -- ignored\n" );}}MakePrint( "\n\t\$(CXX)\n" );MakePrint( "\$(OBJDIR)/$i.${o}:\tCXXFLAGS +=$cflags\n" )if ( $cflags );}################################################################################ ToolsetCXXDepend( $depend, \@sources )# This subroutine takes the user options and builds the# rule(s) required to build the dependencies for the source# files 'sources' to 'depend'.################################################################################sub ToolsetCXXDepend{ToolsetCCDepend();}################################################################################ ToolsetAS( $source, $obj, \@args )# This subroutine takes the user options and builds the rule(s)# required to compile the source file 'source' to 'obj'################################################################################sub ToolsetAS{my( $source, $obj, $pArgs ) = @_;foreach $_ ( @$pArgs ) {Message( "CC: unknown option $_ -- ignored\n" );}MakePrint( "\n\t\$(AS)\n" );}sub ToolsetASDepend{}################################################################################ ToolsetAR( $name, \@args, \@objs )# This subroutine takes the user options and builds the rules# required to build the library 'name'.## Arguments:# --Amx[=prefix] local AMX configuration (defaults to platform)# --Isp=name ISP module# --[wlib|386lib] Librarian (todo)## Output:# [ $(LIBDIR)/name$.${a}: .... ]# $(AR)################################################################################sub ToolsetAR{my( $name, $pArgs, $pObjs ) = @_;my( $amx, @isp, $insight );local( $name_ld );#.. Parse arguments#$amx = $insight = 0; # optionsforeach $_ ( @$pArgs ) {if (/^--Amx$/) { # Local AMX config$amx = "\$(SCM_PLATFORM)";} elsif (/^--Amx=(.*)/) { # Specific AMX config$amx = "$1";} elsif (/^--Isp=(.*)/) { # ISP modulepush( @isp, "$1" );} elsif (/^--Insight$/) { # Enable insight$insight = 1;} elsif (/^--Insight=(.*)/) { # Specific insight$insight = "$1";} else {Message( "AR: unknown option $_ -- ignored\n" );}}#.. Standard library builds, plus AMX configuration#MakeEntry( "\$(LIBDIR)/$name\$(SCM_TYPE).${a}:\t","", "\\\n\t\t", ".${o} ", @$pObjs );#.. Build library with AMX configuration#foreach (@isp) {AmxLibISP( $name, $_ );}AmxLib( $name, $amx, $insight )if ( $amx );#.. Build library rule (just append to standard rule)#MakePrint( "\n\t\$(AR)\n\n" );}################################################################################ ToolsetLD( $name, \@args, \@objs, \@libraries )# This subroutine takes the user options and builds the rules# required to link the program 'name'.## Arguments:# EOS specific:# --Eos EOS application# --Eosx Extended EOS application# --EosRom EOS BOOTROM application# --EosRomx Extended EOS BOOTROM application# --NetUdp[P] Networking with UDP support# --NetTcp[P] Networking with TCP support (static routing)# --NetTcpx[P] Networking with TCP support (router)# --Kdb Kernel debugger## AMX specific:# --Amx[=prefix] Local AMX configuration (defaults to platform)# --Isp=name ISP module# --Insight[=prefix] Enable insight (default to platform.icf)# (incomplete)## Linker specific:# --Bin=LoadAddr Download image# --Abs Absoluate image (Powerscope/VisionClick)# --Section=... Linker sector order directives## Output: (also mri68k.rul)## $(BINDIR)/name${exe}:# $(BINDIR)/name.dep \# $(BINDIR)/name.[abs|bin]## .PHONY: $(BINDIR)/name${exe}:## $(BINDIR)/name.dep: $(SCM_PLATFORM).mk# $(LDDEPEND)## ifeq "$(IFLAG)" "3"# -include "$(BINDIR)/name.dep"# endif## $(BINDIR)/name.[abs|bin]# objs ...# {$(LDABS)|$(LDBIN)}## name_ld += ... Linker command file# :## name_dp += ... Dependency list# :################################################################################sub ToolsetLD{my( $name, $pArgs, $pObjs, $pLibs ) = @_;my( $linker, $flags, $amx, $insight );my( $laddr, $lsize, $section );my( $cond );local( $varname );#.. Parse arguments#$amx = $flags = $insight = 0; # generic options$section = ""; $laddr = 0; # toolset optionsforeach $_ ( @$pArgs ){#.. EOS#if (/--Eos$/) { # EOS standard$flags = $flags | $EOS_LNK;} elsif (/^--Eosx$/) { # EOS extended$flags = $flags | $EOS_LNK | $EOS_EXT;} elsif (/^--EosRom$/) { # ROM image$flags = $flags | $EOS_LNK | $EOS_ROM;} elsif (/^--EosRomx$/) { # ROM image extended$flags = $flags | $EOS_LNK | $EOS_ROM | $EOS_EXT;} elsif (/^--NetUdp$/) {$flags = $flags | $NET_UDP;} elsif (/^--NetTcp$/) { # TCP with static router$flags = $flags | $NET_TCP;} elsif (/^--NetTcpx$/) { # TCP with router$flags = $flags | $NET_TCP | $NET_ROUTER;} elsif (/^--NetUdpP$/) {$flags = $flags | $NET_UDP | $NET_PROD;} elsif (/^--NetTcpP$/) { # TCP with static router$flags = $flags | $NET_TCP | $NET_PROD;} elsif (/^--NetTcpxP$/) { # TCP with router$flags = $flags | $NET_TCP | $NET_ROUTER | $NET_PROD;} elsif (/^--Kdb/) { # Kernel debugger$flags = $flags | $EOS_KDB;#.. AMX#} elsif (/^--Amx$/) { # Local AMX config$amx = "\$(SCM_PLATFORM)";} elsif (/^--Amx=(.*)/) { # Specific AMX config$amx = "$1";} elsif (/^--Isp=(.*)/) { # ISP moduleif ( ! $flags && ! $amx ) {Message( "LD: --Isp requires either a EOS or AMX application");} else {AmxLinkISP( $name, "$1", $pObjs, $pLibs );}} elsif (/^--Insight$/) { # Enable insight$insight = "\$(SCM_PLATFORM)";} elsif (/^--Insight=(.*)/) { # Specific insight$insight = "$1";#.. Target specific#} elsif (/^--Abs/) { # Absolute image$lsize = $lsize = "";} elsif (/^--Bin$/) { # Binary 'S-Record' image$flags = $flags | $EOS_BIN;$laddr = "0"; # Load address} elsif (/^--Bin=(.*)/) { # Download image$flags = $flags | $EOS_BIN;$laddr = "$1"; # Load address} elsif (/^--Bin=(.*),(.*)/) { # Download image$flags = $flags | $EOS_BIN;$laddr = "$1"; # Load address$lsize = "$2"; # Image size} elsif (/^--Section=(.*)/) { # Section directives$section = "$1";#.. Toolset specific#} else {Message( "LD: unknown option $_ -- ignored\n" );}}#.. Command file, EOS and/or AMX dependencies## Library search order,# Application# EOS# AMX# Toolset#if ( $flags & $EOS_LNK ) {EosLink( $name, $flags, $pObjs, $pLibs );if ( $amx ) {AmxLinkCfg( $name, $amx, $insight, $pObjs, $pLibs );} else {AmxLinkStd( $name, $pObjs, $pLibs );}} elsif ( $amx ) {AmxLinkCfg( $name, $amx, $insight, $pObjs, $pLibs );}push( @$pLibs, "\$(mri)/68020/mcc68kab" );#.. Link rules#if ($flags & $EOS_BIN){MakePrint( "\\\n\t\t\$(BINDIR)/${name}.dep " ."\\\n\t\t\$(BINDIR)/${name}.bin\n\n" .".PHONY:\t\t\t\$(BINDIR)/${name}${exe}\n\n" );MakePrint( "\$(BINDIR)/${name}.dep:\t\$(SCM_PLATFORM).mk\n"."\t\$(LDDEPEND)\n\n" );MakePrint( "ifeq \"\$(IFLAG)\" \"3\"\n" ."-include\t\$(BINDIR)/${name}.dep\n" ."endif\n\n" );MakePrint( "\$(BINDIR)/${name}.bin:\tLADDR=$laddr\n" )if ( $laddr );MakePrint( "\$(BINDIR)/${name}.bin:\tLSIZE=$lsize\n" )if ( $lsize );MakePrint( "\$(BINDIR)/${name}.bin:" );foreach $i ( @$pObjs ) {MakePrint( " \\\n\t\t$i.${o}" );}MakePrint( "\n\t\$(LDBIN)\n" );}else{MakePrint( "\\\n\t\t\$(BINDIR)/${name}.dep " ."\\\n\t\t\$(BINDIR)/${name}.abs\n\n" .".PHONY:\t\t\t\$(BINDIR)/${name}${exe}\n\n" );MakePrint( "\$(BINDIR)/${name}.dep:\t\$(SCM_PLATFORM).mk\n"."\t\$(LDDEPEND)\n\n" );MakePrint( "ifeq \"\$(IFLAG)\" \"3\"\n" ."-include\t\$(BINDIR)/${name}.dep\n" ."endif\n\n" );MakePrint( "\$(BINDIR)/${name}.abs:" );foreach $i ( @$pObjs ) {MakePrint( " \\\n\t\t$i.${o}" );}MakePrint( "\n\t\$(LDABS)\n" );}MakePrint( "\n" );#.. Cleanup rules#ToolsetGenerate( "\$(BINDIR)/${name}.ld" );ToolsetGenerate( "\$(BINDIR)/${name}.dep" );if ($laddr) {ToolsetGenerate( "\$(BINDIR)/${name}.bin" );} else {ToolsetGenerate( "\$(BINDIR)/${name}.abs" );}ToolsetGenerate( "\$(BINDIR)/${name}.map" );#.. Linker command file## Now the fun part... piecing together a variable $(name_ld)# which ends up in the command file.#$varname = "${name}_ld";sub VarCmd {MakeQuote ("$varname += @_\\n\n");}sub VarPrt {MakePrint ("@_\n");}VarCmd("CASE"); #preserve symbols caseVarCmd("WARN 356"); #warning for undef sectionsVarCmd("CHIP CPU32"); #68xxx (68332/68340/68341)VarCmd("INITDATA vars"); #initialise 'vars' sectionif ($section) {VarPrt("#.. User specified section directives");VarCmd("$section");} else {if (($flags & $EOS_LNK) || $amx) {if ($flags & $EOS_ROM) { #BOOTROMif ($flags & $EOS_BIN) {VarPrt("#.. Linking an EOS-AMX/ROM image (Binary image)");} else {VarPrt("#.. Linking an EOS-AMX/ROM image (Powerscope image)");}VarCmd("extern _BootVectors"); #create an external referenceVarCmd("alias code CODE"); #CODE aliasVarCmd("align vectors 4"); #align on quad boundariesVarCmd("align ramVectors 4"); #..VarCmd("align header 4"); #..VarCmd("align (CODE)=4"); #..VarCmd("align (DATA)=4"); #..VarCmd("align (ROMDATA)=4"); #..if ($flags & $EOS_ROM) {VarCmd("order SysRom"); #boot ROM/flash} else {VarCmd("order SysRam");}VarCmd("order vectors,header,startup,code");VarCmd("order const,literals,strings,??INITDATA");if ($flags & $EOS_ROM) {# Note: Shall generate a order warning if the ROM load address# is NOT positioned at $0.## eg. "(374) ORDER command could not be obeyed for section SysRam."#..VarCmd("order SysRam,PLoadEnv"); #program loader RAM}VarCmd("order preserve,protected,ramVectors");VarCmd("order vars,zerovars"); #MRI specificVarCmd("order ioports,tags"); #..VarCmd("order 0") #..if ($MriVersion ne "4.4");VarCmd("order BootStack,BootData");} else { #applicationif ($flags & $EOS_BIN) {VarPrt("#.. Linking an EOS-AMX/Application image (Binary image)");} else {VarPrt("#.. Linking an EOS-AMX/Application image (Powerscope image)");}VarCmd("extern _AsReset"); #create an external referenceVarCmd("alias code CODE"); #CODE aliasVarCmd("align vectors 4"); #align on quad boundariesVarCmd("align ramVectors 4"); #..VarCmd("align header 4"); #..VarCmd("align (CODE)=4"); #..VarCmd("align (DATA)=4"); #..VarCmd("align (ROMDATA)=4"); #..VarCmd("order SysRam"); #define sections to go into RAM#EOS/AS (start of RAM)VarCmd("order preserve,protected,ramVectors");VarCmd("order vars,zerovars"); #MRI specificVarCmd("order ioports,tags"); #..VarCmd("order 0") #..if ($MriVersion ne "4.4");VarCmd("order stack"); #application stackif ($flags & $EOS_BIN) {VarCmd("order SysFlash"); #code image into FLASH}VarCmd("order header,vectors"); #EOS/AS (start of FLASH)VarCmd("order startup,code"); #..VarCmd("order const"); #constant data sectionsVarCmd("order literals");VarCmd("order strings");VarCmd("order ??INITDATA"); #data to copy into RAM}} else {VarPrt("#.. Link a generic 68k image");VarCmd("sect vectors 0000");VarCmd("sectsize vectors= 1024");VarCmd("common stack= 1024");VarCmd("sectsize stack= 4096");VarCmd("order vectors,stack,code");VarCmd("order literals,strings,const");VarCmd("order ??INITDATA,vars,zerovars");}}VarPrt("#.. The following are cmdfile macros, with libraries");VarPrt("# repeated due to single pass linker wierdness");foreach $i ( @$pObjs ) {VarCmd("LOAD @(dosify,$i.${o})" );}# Libraries$cond = "";foreach $_ ( @$pLibs ) {if (/^--ifdef=(.*)/) { # .. conditionals$cond = "$1";VarPrt( "ifdef $cond" );next;} elsif (/^--ifndef=(.*)/) {$cond = "$1";VarPrt( "ifndef $cond" );next;} elsif (/^--*/) { # .. unknownMessage( "LD: unknown lib option $_ -- ignored\n" );next;}# .. entryVarCmd("LOAD @(dosify,@(vpath2,$_.${a},MRI_LIB))" );if ($cond) { # .. end conditionVarPrt("endif\t# $cond");$cond = "";}}# single pass linker wierdnessforeach $_ ( @$pLibs ) {if (/^--ifdef=(.*)/) { # .. conditionals$cond = "$1";VarPrt( "ifdef $cond" );next;} elsif (/^--ifndef=(.*)/) {$cond = "$1";VarPrt( "ifndef $cond" );next;} elsif (/^--*/) { # .. unknown (warning only once)next;}# .. entryVarCmd("LOAD @(dosify,@(vpath2,$_.${a},MRI_LIB))" );if ($cond) { # .. end conditionVarPrt("endif\t# $cond");$cond = "";}}VarPrt("#.. Map file options");VarCmd("LISTABS INTERNALS, PUBLICS");VarCmd("LISTMAP LENGTH 64"); # map file page length");VarCmd("LISTMAP CROSSREF,INTERNALS,PUBLICS/by_addr");VarCmd("DEBUG_SYMBOLS");VarCmd("END");VarPrt( "" );#.. Dependency link,## Now piece together a variable $(name_dp) which ends up in# the command file building the application dependency list.#$varname = "${name}_dp";$cond = "";foreach $_ ( @$pLibs ) {if (/^--ifdef=(.*)/) { # .. conditionals$cond = "$1";VarPrt( "ifdef $cond\n" );next;} elsif (/^--ifndef=(.*)/) {$cond = "$1";VarPrt( "ifndef $cond\n" );next;} elsif (/^--*/) { # .. unknown (warning only once)next;}# .. entryif ($laddr) {VarCmd("\$(BINDIR)/${name}.bin: @(vpath2,$_.${a},MRI_LIB)" );} else {VarCmd("\$(BINDIR)/${name}.abs: @(vpath2,$_.${a},MRI_LIB)" );}if ($cond) { # .. end conditionVarPrt("endif\t# $cond\n");$cond = "";}}#end ...}#.. Successful termination1;