merge 2.13.0 (candidate 2) from default wip
authorJon Chatten
Wed, 07 Apr 2010 12:34:10 +0100
branchwip
changeset 457 9bebdb95e0de
parent 455 6cc6d1d59188 (current diff)
parent 427 d8edd94cd8e2 (diff)
child 461 0c5ca7f6d8ae
merge 2.13.0 (candidate 2) from default
sbsv2/raptor/RELEASE-NOTES.html
sbsv2/raptor/lib/config/rvct.xml
sbsv2/raptor/lib/config/variants.xml
sbsv2/raptor/lib/flm/e32abiv2.flm
sbsv2/raptor/python/raptor.py
sbsv2/raptor/python/raptor_make.py
sbsv2/raptor/test/smoke_suite/annofile2log.py
--- a/.hgtags	Tue Apr 06 11:42:16 2010 +0100
+++ b/.hgtags	Wed Apr 07 12:34:10 2010 +0100
@@ -3,3 +3,5 @@
 007900c31eef0363e705cf15d131740d4eeb6208 stable
 007900c31eef0363e705cf15d131740d4eeb6208 stable
 976aca38ffe5ce30d7753ea77a8de44e5cbd0dc8 stable
+976aca38ffe5ce30d7753ea77a8de44e5cbd0dc8 stable
+7006bcce52990f33d0c20c51bebc2b58ed36db60 stable
--- a/sbsv2/raptor/RELEASE-NOTES.html	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/RELEASE-NOTES.html	Wed Apr 07 12:34:10 2010 +0100
@@ -33,7 +33,17 @@
 <h3>Defect Fixes</h3>
 <ul>
 
-<li>to be integrated</li>
+<li>                                                                  DPDEF143018      - Raptor doesn't handle spaces in GCCE installation directory correctly                                                </li>
+<li>                                                                  DPDEF143101      - GCC-E isn't tested as part of the tool checking mechanism                                                            </li>
+<li>                                                                  DPDEF141195      - Raptor doesn't handle spaces in tool paths                                                                           </li>
+<li><a href="http://developer.symbian.org/bugs/show_bug.cgi?id=2172"> SF Bug 2172 </a> - [Raptor] Resource builds warn on encountering trigraph-like strings                                                  </li>
+<li><a href="http://developer.symbian.org/bugs/show_bug.cgi?id=2308"> SF Bug 2308 </a> - [Raptor] PLUGIN3 TARGETTYPEs don't set resource output offsets correctly                                             </li>
+<li>                                                                  Fix: in copylogfromannofile mode, ensure that the build id and duration are included in the log.  These are not critical but are useful </li>
+<li>                                                                  Fix: remove unnecessary empty lines in log output in copylogfromannofile mode                                                           </li>
+<li><a href="http://developer.symbian.org/bugs/show_bug.cgi?id=1939"> SF Bug 1939 </a> - [Raptor] PAGED keyword in MMP files should imply byte pair compressed                                                </li>
+<li>                                                                  DPDEF144648      - Raptor failed to build tools_deb objects under Windows XP                                                            </li>
+<li><a href="http://developer.symbian.org/bugs/show_bug.cgi?id=2134"> SF Bug 2134 </a> - [Raptor] Raptor does not pass overridden make variables into its makefiles                                           </li>
+<li>                                                                  Fix : do not allow data to be paged implicitly                                                                                          </li>
 
 </ul>
 
@@ -42,14 +52,15 @@
 version 2.12.5
 
 Defect Fixes:
-- Fix: Workaround for emake engine log corruption when clockskew errors occur (annofile2log). 
-
+- Fix: Workaround for emake engine log corruption when clockskew errors occur (annofile2log).
   Allow Raptor to obtain log from emake annotation file where it is uncorrupted.  A new 
-  Make engine option "copyannofile2log" enables/disables this mode for emake. If this option is disabled
+  Make engine option "copylogfromannofile" enables/disables this mode for emake. If this option is disabled
   or if no annotation file is specified for the build then Raptor reads logs directly as normal.
+- SF Bug 2125 - [Raptor] - tracecompiler what output incorrect if mmp basename contains '.' e.g. fred.prd.mmp 
 - SF Bug 2191 - [Raptor] - When forcesuccess is enabled, exit status for a failed recipe is "retry" but should be "failed"
 - Fix: extend tracecompiler tests to Linux
 - Fix: Amendment to SF Bug 1511 fix - removal of blanked DEFFILE keyword from e32abiv2ani.flm
+- Fix: improve robustness to bad -c options
 
 
 version 2.12.4
--- a/sbsv2/raptor/lib/config/arm.xml	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/lib/config/arm.xml	Wed Apr 07 12:34:10 2010 +0100
@@ -1,51 +1,62 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <build xmlns="http://symbian.com/xml/build" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symbian.com/xml/build ../../schema/build/2_0.xsd">
-	<!-- build configurations for ARM compilers -->
+	<!-- build variants for ARM toolchain builds -->
 	<var name="arm" extends="root">
 		<varRef ref="default.interfaces"/>
 		<varRef ref="default.locations"/>
-		<env name="EFREEZE" default="$(PERL) $(EPOCROOT)/epoc32/tools/efreeze.pl" type="tool"/>
-		<!-- picked up from the Environment -->
-		<env name="ELF2E32" default="$(EPOCROOT)/epoc32/tools/elf2e32$(DOTEXE)" type="tool"/>
+		
+		<!-- tools and scripts -->
 		<env name="BMCONV" default="$(EPOCROOT)/epoc32/tools/bmconv$(DOTEXE)" type="tool"/>
 		<env name="CHECKLIB" default="$(EPOCROOT)/epoc32/tools/checklib$(DOTEXE)" type="tool"/>
-		<env name="TRANASM" default="$(PERL) $(EPOCROOT)/epoc32/tools/tranasm.pl" type="tool"/>
 		<env name="CPPFILT" default="$(GCCPREFIX)c++filt$(DOTEXE)" type="tool"/>
+		<env name="EFREEZE" default="$(PERL) $(EPOCROOT)/epoc32/tools/efreeze.pl" type="script"/>
+		<env name="ELF2E32" default="$(EPOCROOT)/epoc32/tools/elf2e32$(DOTEXE)" type="tool"/>
+		<env name="PREPDEF" default="$(PERL) $(EPOCROOT)/epoc32/tools/prepdef.pl" type="script"/>
 		<env name="RCOMP" default="$(EPOCROOT)/epoc32/tools/rcomp$(DOTEXE)" type="tool"/>
-		<env name="PREPDEF" default="$(PERL) $(EPOCROOT)/epoc32/tools/prepdef.pl" type="path"/>
-		<env name="STRINGTABLE" default="$(PERL) $(EPOCROOT)/epoc32/tools/stringtable.pl" type="path"/>
-		<!-- RANSLEEP is a program that can be used to cause a random delay in milliseconds. This is only useful in parallel builds.  See the PERTURBSTARTTIME switch for more details.  -->
+		<!-- RANSLEEP is a program that can be used to cause a random delay in milliseconds. This is only useful in parallel builds. See the PERTURBSTARTTIME switch for more details.  -->
 		<env name="RANSLEEP" default="$(SBS_HOME)/bin/$(HOSTPLATFORM_DIR)/ransleep$(DOTEXE)" type="tool"/>
-		<set name="BLDINF_OUTPUTPATH" value="$(SBS_BUILD_DIR)"/>
-		<set name="CDEFS" value=""/>	
-		<!-- arm specific interfaces -->
+		<env name="SBSV1MAKE" default="$(EPOCROOT)/epoc32/tools/make$(DOTEXE)" type="tool"/>
+		<env name="STRINGTABLE" default="$(PERL) $(EPOCROOT)/epoc32/tools/stringtable.pl" type="script"/>
+		<env name="TRANASM" default="$(PERL) $(EPOCROOT)/epoc32/tools/tranasm.pl" type="script"/>
+			
+		<!-- interfaces -->
 		<set name="INTERFACE.extension" value="Symbian.extension"/>
-		<!-- link to bld.inf and mmp platform names -->
-		<set name="ARMMACROS" value="__MARM_ARMV5__ $(ARMMACROS.CONFIG) $(ARMMACROS.VAR)"/>
+		
+		<!-- macros -->
 		<set name="ARMMACROS.CONFIG" value=""/>
 		<set name="ARMMACROS.VAR" value=""/>
+		<set name="ARMMACROS" value="__MARM_ARMV5__ $(ARMMACROS.CONFIG) $(ARMMACROS.VAR)"/>
+		<set name="PLATMACROS.WINDOWS" value="$(PLATMACROS.TOOLCHAIN) EPOC32 MARM EABI GENERIC_MARM MARM_ARMV5 $(PLATMACROS.CONFIG) $(PLATMACROS.VAR)"/>
+		<set name="PLATMACROS.LINUX" value="$(PLATMACROS.WINDOWS)"/>
+		<set name="PLATMACROS.CONFIG" value=""/>
+		<set name="PLATMACROS.VAR" value=""/>
+		<set name="PLATMACROS.TOOLCHAIN" value=""/>
+		
+		<set name="BLDINF_OUTPUTPATH" value="$(SBS_BUILD_DIR)"/>
 		<set name="CAPABILITY" value=""/>
+		<set name="CDEFS" value="__SUPPORT_CPP_EXCEPTIONS__ _UNICODE __SYMBIAN32__ __EPOC32__ __MARM__ __EABI__ __PRODUCT_INCLUDE__=&quot;$(PRODUCT_INCLUDE)&quot; $(MMPDEFS) $(ARMMACROS)"/>
 		<set name="CODE_SEGMENT_START" value=""/>
 		<set name="DEFAULT_STDCPP_NEWLIB" value="stdnew.dso"/>
 		<set name="DEFAULT_SYMBIAN_NEWLIB" value="scppnwdl.dso"/>
+		<set name="DUMPBCINFO" value=""/>
+		<set name="EPOCSTACKSIZE" value=""/>
 		<set name="FULLVARIANTPATH" value="$(VARIANTPLATFORM)/$(VARIANTTYPE)"/>
 		<set name="HEADER_FILES_CONTROL_OPTION" value=""/>
 		<set name="LIBRARY_DEBUG" value=""/>
 		<set name="MMPDEFS" value=""/>
 		<set name="NMAKE" value="nmake"/>
 		<set name="NMAKEFLAGS" value="-nologo -x - "/>
+		<set name="NO_UNALIGNED_ACCESS" value="$(CC.NO_UNALIGNED_ACCESS)"/>
 		<set name="OUTPUTPATH" value="$(SBS_BUILD_DIR)"/>
 		<set name="PERTURBSTARTTIME" value=""/>
-		<!-- add a random delay before starting armcc or armlink to ease contention for licensesthe maximum time to delay in milliseconds. RANSLEEP program must be available.   -->
+		<!-- add a random delay before starting armcc or armlink to ease contention for licenses the maximum time to delay in milliseconds. RANSLEEP program must be available.   -->
 		<set name="PERTURBMSECS" value="500"/>
 		<!-- the maximum time to delay in milliseconds -->
-		<set name="BLDINF_OUTPUTPATH" value="$(SBS_BUILD_DIR)"/>
+		<set name="POSTLINKER_COMPRESSION_DEFAULT" value="inflate"/>
 		<set name="RELEASEPATH" value="$(EPOCROOT)/epoc32/release"/>
 		<set name="RESOLVED_DEFFILE" value=""/>
 		<set name="RUNTIME_LIBS_PATH" value="$(EPOCROOT)/epoc32/release/armv5/lib"/>
-		<set name="SBSV1MAKE" value="$(EPOCROOT)/epoc32/tools/make$(DOTEXE)"/>
 		<set name="SID" value=""/>
-		<set name="EPOCSTACKSIZE" value=""/>
 		<set name="STATIC_LIBRARY_DIR" value="$(EPOCROOT)/epoc32/release/$(VARIANTPLATFORM)/$(VARIANTTYPE)"/>
 		<set name="STATIC_RUNTIME_DIR" value="$(EPOCROOT)/epoc32/release/$(VARIANTPLATFORM)/$(VARIANTTYPE)"/>
 		<set name="SYMBIAN_CC_MESSAGE_OPTION" value="$(CC_WARNINGS_CONTROL_OPTION) $(CC_ERRORS_CONTROL_OPTION)"/>
@@ -57,16 +68,9 @@
 		<set name="SYSTEMINCLUDE" value=""/>
 		<set name="TARGET" value=""/>
 		<set name="UNIX_SLASH_FOR_CC_ABS_PATHS" value="0"/>
-		<set name="UNRESOLVED_SYMBOL_REF_OPTION" value=""/>
-		<set name="DUMPBCINFO" value=""/>
-		<set name="NO_UNALIGNED_ACCESS" value="$(CC.NO_UNALIGNED_ACCESS)"/>
-		<set name="PLATMACROS.WINDOWS" value="$(PLATMACROS.TOOLCHAIN) EPOC32 MARM EABI GENERIC_MARM MARM_ARMV5 $(PLATMACROS.CONFIG) $(PLATMACROS.VAR)"/>
-		<set name="PLATMACROS.LINUX" value="$(PLATMACROS.WINDOWS)"/>
-		<set name="PLATMACROS.CONFIG" value=""/>
-		<set name="PLATMACROS.VAR" value=""/>
-		<set name="PLATMACROS.TOOLCHAIN" value=""/>
-		<set name="POSTLINKER_COMPRESSION_DEFAULT" value="inflate"/>		
+		<set name="UNRESOLVED_SYMBOL_REF_OPTION" value=""/>	
 	</var>
+	
 	<var name="v5">
 		<set name="TRADITIONAL_PLATFORM" value="ARMV5"/>
 		<set name="VARIANTPLATFORM" value="armv5"/>
--- a/sbsv2/raptor/lib/config/gcc.xml	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/lib/config/gcc.xml	Wed Apr 07 12:34:10 2010 +0100
@@ -1,33 +1,33 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <build xmlns="http://symbian.com/xml/build" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symbian.com/xml/build ../../schema/build/2_0.xsd">
-
-	<!-- build configurations for GCC compilers -->
+	<!-- build variants for GCC toolchains -->
 	<var name="tools2_base" extends="root">
-
 		<varRef ref="default.interfaces"/>
 		<varRef ref="default.locations"/>
-		<!-- picked up from the Environment -->
+		
+		<!-- toolchain tools -->
 		<env name='RANLIB' default='$(GCCPREFIX)ranlib$(DOTEXE)' type='tool'/>
 		<env name='GCC' default='$(GCCPREFIX)g++$(DOTEXE)' type='tool'/>
 		<env name='AR' default='$(GCCPREFIX)ar$(DOTEXE)' type='tool'/>
+		
+		<set name='COMPILER' value='$(GCC) -c' type='tool' versionCommand='$(GCC) -v' versionResult='gcc version (3.[456])|(4.[0-9])'/>
+		<set name='LINKER' value='$(GCC)'/>
+
+		<!-- tools and scripts -->
+		<env name='JAVATC' default='$(JAVA_HOME)/bin/java' type='tool'/> <!-- Java used by Trace Compiler -->
 
 		<!-- interfaces -->
 		<set name="INTERFACE.exe" value="Tools.exe"/>
 		<set name="INTERFACE.lib" value="Tools.lib"/>
 
-		<!-- Java used by Trace Compiler -->
-		<env name='JAVA_HOME' default='' type='path'/>
-		<env name='JAVATC' default='$(JAVA_HOME)/bin/java' type='tool'/>
-
 		<!-- link to bld.inf and mmp platform names -->
 		<set name='TRADITIONAL_PLATFORM' value='TOOLS2'/>
+
+		<!-- Java used by Trace Compiler -->
+		<set name='CFLAGS' value='-fdefer-pop -fmerge-constants -fthread-jumps -floop-optimize -fif-conversion -fif-conversion2 -fguess-branch-probability -fcprop-registers -foptimize-sibling-calls -fstrength-reduce -fcse-follow-jumps -fcse-skip-blocks -frerun-cse-after-loop -frerun-loop-opt -fgcse -fgcse-lm -fgcse-sm -fgcse-las -fdelete-null-pointer-checks -fexpensive-optimizations -fregmove -fschedule-insns -fschedule-insns2 -fsched-interblock -fsched-spec -fcaller-saves -fpeephole2 -freorder-blocks -freorder-functions -fstrict-aliasing -funit-at-a-time -falign-functions -falign-jumps -falign-loops -falign-labels -fcrossjumping -pipe -Wall -Wno-ctor-dtor-privacy -Wno-unknown-pragmas -m32'/>
+		<env name='JAVA_HOME' default='' type='path'/>		
 		<set name='VARIANTPLATFORM' value='tools2'/>
 
-		<!-- used by FLM code -->
-		<set name='COMPILER' value='$(GCC) -c' type='tool' versionCommand='$(GCC) -v' versionResult='gcc version (3.[456])|(4.[0-9])'/>
-
-		<set name='CFLAGS' value='-fdefer-pop -fmerge-constants -fthread-jumps -floop-optimize -fif-conversion -fif-conversion2 -fguess-branch-probability -fcprop-registers -foptimize-sibling-calls -fstrength-reduce -fcse-follow-jumps -fcse-skip-blocks -frerun-cse-after-loop -frerun-loop-opt -fgcse -fgcse-lm -fgcse-sm -fgcse-las -fdelete-null-pointer-checks -fexpensive-optimizations -fregmove -fschedule-insns -fschedule-insns2 -fsched-interblock -fsched-spec -fcaller-saves -fpeephole2 -freorder-blocks -freorder-functions -fstrict-aliasing -funit-at-a-time -falign-functions -falign-jumps -falign-loops -falign-labels -fcrossjumping -pipe -Wall -Wno-ctor-dtor-privacy -Wno-unknown-pragmas -m32'/>
-
 		<!-- msys based programs sometimes don't search the path properly.
 		COMPILER_PATH can be set to tell gcc where to find
 		as.exe (sometimes it doesn't and a build step fails).
@@ -39,8 +39,6 @@
 
 		<!-- macro definitions set by mmps etc -->
 		<set name='CDEFS' value='$(MMPDEFS)'/>
-
-
 		<set name='CDEFS.DEFAULT' value='__SYMBIAN32__ __TOOLS__ __TOOLS2__ __EXE__ __SUPPORT_CPP_EXCEPTIONS__ __PRODUCT_INCLUDE__="$(PRODUCT_INCLUDE)"'/>
 		<set name='CDEFS.WIN32' value='$(CDEFS.DEFAULT) _WIN32 WIN32 _WINDOWS __TOOLS2_WINDOWS__'/>
 		<set name='CDEFS.LINUX' value='$(CDEFS.DEFAULT) __LINUX__ __TOOLS2_LINUX__'/>
@@ -58,7 +56,6 @@
 		<!-- always use stlport headers -->
 		<set name='SYSTEMINCLUDE' value='$(EPOCINCLUDE)/tools/stlport'/>
 
-		<set name='LINKER' value='$(GCC)'/>
 		<set name='LFLAGS' value=''/>
 		<set name='STATICLIBRARY' value='stlport.5.1'/>
 		<set name='LIBS' value=''/>
--- a/sbsv2/raptor/lib/config/gcce.xml	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/lib/config/gcce.xml	Wed Apr 07 12:34:10 2010 +0100
@@ -1,15 +1,15 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <build xmlns="http://symbian.com/xml/build" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symbian.com/xml/build ../../schema/build/2_0.xsd">
-	<!-- GCCE build variant for ARM compilers -->
-	<!-- This is called gcce_base in case someone wants to use "gcce" as a configuration name -->
+	<!-- build variant for GCCE ARM toolchains -->
 	<var name="gcce_base">
 		<set name="TOOLCHAIN" value="GCCE"/>
 		<set name="PLATMACROS.TOOLCHAIN" value="GCCE"/>
 
+		<!-- toolchain tools -->
+		<set name="GCCEAR" value="$(GCCEBIN)/arm-none-symbianelf-ar$(DOTEXE)"/>
+		<set name="GCCEASM" value="$(GCCEBIN)/arm-none-symbianelf-as$(DOTEXE)"/>
 		<set name="GCCECC" value="$(GCCEBIN)/arm-none-symbianelf-g++$(DOTEXE)"/>
 		<set name="GCCELD" value="$(GCCEBIN)/arm-none-symbianelf-g++$(DOTEXE)"/>
-		<set name="GCCEASM" value="$(GCCEBIN)/arm-none-symbianelf-as$(DOTEXE)"/>
-		<set name="GCCEAR" value="$(GCCEBIN)/arm-none-symbianelf-ar$(DOTEXE)"/>
 		<set name="FROMELF" value="$(GCCEBIN)/arm-none-symbianelf-readelf$(DOTEXE)"/>
 
 		<set name="CC" value="$(GCCECC)"/>
@@ -123,6 +123,6 @@
 		<set name="USERINCLUDE" value=""/>
 		<set name="VFE_OPTION" value=""/>
 
-		<append name="CDEFS" value='__SUPPORT_CPP_EXCEPTIONS__ _UNICODE __SYMBIAN32__ __GCCE__ __EPOC32__ __MARM__ __EABI__ __PRODUCT_INCLUDE__="$(PRODUCT_INCLUDE)" $(MMPDEFS) $(ARMMACROS)'/>
+		<append name="CDEFS" value="__GCCE__"/>
 	</var>
 </build>
--- a/sbsv2/raptor/lib/config/gccxml.xml	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/lib/config/gccxml.xml	Wed Apr 07 12:34:10 2010 +0100
@@ -1,21 +1,20 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <build xmlns="http://symbian.com/xml/build" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symbian.com/xml/build ../../schema/build/2_0.xsd">
-	<!-- build configurations for the gccxml_cc1plus C++ language processor -->
+	<!-- build variants for the gccxml_cc1plus C++ language processor -->
 	<var name="gccxml_base" extends="root">
 		<varRef ref="default.interfaces"/>
 		<varRef ref="default.locations"/>
-		<!-- picked up from the Environment -->
+		
+		<!-- tools and scripts -->
+		<env name='BMCONV' default="$(EPOCROOT)/epoc32/tools/bmconv$(DOTEXE)" type='tool'/>
+		<set name='CC' value="$(EPOCROOT)/epoc32/tools/gccxml_cc1plus$(DOTEXE)" type='tool'/>
 		<env name='CPP' default='$(GNUCPP)' type='tool'/>
-		<env name='BMCONV' default="$(EPOCROOT)/epoc32/tools/bmconv$(DOTEXE)" type='tool'/>
-		<env name='CREATERFIFILE' default='$(PERL) $(SBS_HOME)/bin/createrfifile.pl ' type='path'/>
+		<env name='CREATERFIFILE' default='$(PERL) $(SBS_HOME)/bin/createrfifile.pl ' type='script'/>
 		<env name='GNUAWK' default='$(GNUPREFIX)gawk$(DOTEXE)' type='tool' versionCommand='$(GNUAWK) --version' versionResult='GNU Awk [3-9].*'/>
-		<env name='MAKEDEF' default='$(PERL) $(EPOCROOT)/epoc32/tools/makedef.pl' type='path'/>
-		<env name='PREPDEF' default='$(PERL) $(EPOCROOT)/epoc32/tools/prepdef.pl' type='path'/>
+		<env name='MAKEDEF' default='$(PERL) $(EPOCROOT)/epoc32/tools/makedef.pl' type='script'/>
+		<env name='PREPDEF' default='$(PERL) $(EPOCROOT)/epoc32/tools/prepdef.pl' type='script'/>
 		<env name='RCOMP' default='$(EPOCROOT)/epoc32/tools/rcomp$(DOTEXE)' type='tool'/>
-		<env name='RVCT22BIN' type='path'/>
-		<env name='RVCT22INC' type='path'/>
-		<env name='RVCT22LIB' type='path'/>
-		<env name='STRINGTABLE' default='$(PERL) $(EPOCROOT)/epoc32/tools/stringtable.pl' type='path'/>
+		<env name='STRINGTABLE' default='$(PERL) $(EPOCROOT)/epoc32/tools/stringtable.pl' type='script'/>
 
 		<!-- link to bld.inf and mmp platform names -->
 		<set name='TRADITIONAL_PLATFORM' value='GCCXML'/>
@@ -51,11 +50,13 @@
 		<env name='JAVATC' default='$(JAVA_HOME)/bin/java' type='tool'/>
 
 		<!-- note that gccxml_cc1plus should be version checked, but I've yet to find a reliable way of doing this -->
-		<set name='CC' value="$(EPOCROOT)/epoc32/tools/gccxml_cc1plus$(DOTEXE)" type='tool'/>
 		<set name='CDEFS' value='_UNICODE __SYMBIAN32__ __GCC32__ __EPOC32__ __MARM__ __MINGW32__ _STLP_LITTLE_ENDIAN __GCCXML__ __MARM_ARM4__ $(MMPDEFS)'/>
 		<set name='CFLAGS' value='-bi -nostdinc -Wall -Wno-ctor-dtor-privacy -Wno-unknown-pragmas -UWIN32 -fshort-wchar -quiet -w '/>
 
 		<!-- in support of TEMs - processed as if in an RVCT build -->
+		<env name='RVCT22BIN' type='toolchainpath'/>
+		<env name='RVCT22INC' type='toolchainpath'/>
+		<env name='RVCT22LIB' type='toolchainpath'/>
 		<set name='RVCTBIN' value='$(RVCT22BIN)'/>
 		<set name='RVCTINC' value='$(RVCT22INC)'/>
 		<set name='RVCTLIB' value='$(RVCT22LIB)'/>
--- a/sbsv2/raptor/lib/config/locations.xml	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/lib/config/locations.xml	Wed Apr 07 12:34:10 2010 +0100
@@ -108,7 +108,7 @@
 		<set name='BASE_USER_DEFAULT_PLATFORMS' value='ARMV5 ARMV7 WINSCW'/>
 
 		<set name='BUILD_INCLUDE' value=''/>
-		<set name='CREATEVMAP' value='$(PYTHON) $(SBS_HOME)/bin/createvmap.py' type='tool'/>
+		<set name='CREATEVMAP' value='$(PYTHON) $(SBS_HOME)/bin/createvmap.py' type='script'/>
 		<set name='CREATEVMAPCPP' value='$(SBS_BVCPP)' type='tool'/>
 		<set name='FEATURELISTFILES' value=''/>
 		<set name='FEATUREVARIANTNAME' value=''/>
--- a/sbsv2/raptor/lib/config/msvc.xml	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/lib/config/msvc.xml	Wed Apr 07 12:34:10 2010 +0100
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <build xmlns="http://symbian.com/xml/build" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symbian.com/xml/build ../../schema/build/2_0.xsd">
-	<!-- build configurations for MSVC compilers -->
+	<!-- build variants for MSVC toolchains -->
 	<var name="tools_base" extends="root">
 		<varRef ref="default.interfaces"/>
 		<varRef ref="default.locations"/>
 
-		<!-- picked up from the Environment -->
+		<!-- toolchain tools -->
 		<env name='MS_CL' default='cl.exe' type='tool' versionCommand='$(MS_CL)' versionResult='Version 12\.[0-9]{2}\.[0-9]{4}'/>
 		<env name='MS_LINK' default='link.exe' type='tool' versionCommand='$(MS_LINK)' versionResult='Version 6\.[0-9]{2}.[0-9]{4}'/>
 		<env name='MS_LIB' default='lib.exe' type='tool' versionCommand='$(MS_LIB)' versionResult='Version 6\.[0-9]{2}.[0-9]{4}'/>
@@ -17,8 +17,14 @@
 
 		<!-- link to bld.inf and mmp platform names -->
 		<set name='TRADITIONAL_PLATFORM' value='TOOLS'/>
+
+		<!-- interfaces -->
+		<set name="INTERFACE.exe" value="msvctools.exe"/>
+		<set name="INTERFACE.lib" value="msvctools.lib"/>		
+		
 		<set name='NMAKE' value='nmake'/>
 		<set name='NMAKEFLAGS' value='-nologo -x - '/>
+		
 		<!-- tools options -->
 		<set name='OPT.BROWSEDB' value='-o'/>
 		<set name='OPT.BROWSEFILE' value='-FR'/>
@@ -32,7 +38,6 @@
 		<set name='OPT.NOLOGO' value='-nologo'/>
 		<set name='OPT.OBJECTFILE' value='-Fo'/>
 		<set name='OPT.OUTFILE' value='-out:'/>
-		<set name='OPT.PDBFILE' value='-Fd'/>
 		<set name='OPT.PREINCLUDE' value='-FI '/>
 		<set name='OPT.SUBSYSTEM' value='-subsystem:'/>
 		<set name='OPT.SYSINCLUDE' value='-I '/>
@@ -44,7 +49,7 @@
 		<set name='CDEFS.REL' value='NDEBUG'/>
 		<set name='CFLAGS' value='$(OPT.COMPILE) $(OPT.NOLOGO) -Zp4 -GF'/>
 		<set name='CFLAGS.DEFAULT.WARNLEVEL' value='-W4'/>
-		<set name='CFLAGS.DEB' value='-Zi -Od'/>
+		<set name='CFLAGS.DEB' value='-Od'/>
 		<set name='CFLAGS.REL' value='-O1 -Op'/>
 		<set name='SHAREDFLAGS' value='kernel32.lib $(OPT.NOLOGO) -machine:IX86  -ignore:4089 -ignore:4005 -ignore:4098'/>
 		<set name='LD' value='$(MS_LINK)'/>
@@ -57,9 +62,6 @@
 		<set name='BROWSEFLAGS' value='$(OPT.NOLOGO)'/>
 		<set name='PLATMACROS.WINDOWS' value='VC32 TOOLS MSVC6 MSVC600'/>
 		<set name='PLATMACROS.LINUX' value='$(PLATMACROS.WINDOWS)'/>
-		<!-- interfaces -->
-		<set name="INTERFACE.exe" value="msvctools.exe"/>
-		<set name="INTERFACE.lib" value="msvctools.lib"/>
 
 		<set name='RELEASEPATHROOT' value='$(EPOCROOT)/epoc32/release'/>
 		<set name='IMPORTLIBPATH' value='$(RELEASEPATHROOT)/tools/udeb'/>
--- a/sbsv2/raptor/lib/config/rvct.xml	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/lib/config/rvct.xml	Wed Apr 07 12:34:10 2010 +0100
@@ -1,68 +1,62 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <build xmlns="http://symbian.com/xml/build" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symbian.com/xml/build ../../schema/build/2_0.xsd">
-	<!-- RVCT build variant for RVCT compilers -->
+	<!-- build variant for RVCT ARM toolchains -->
 	<var name="rvct">
 		<set name="TOOLCHAIN" value="RVCT"/>
 		<set name="PLATMACROS.TOOLCHAIN" value="ARMCC"/>
+	
+		<!-- toolchain tools -->
+		<set name="ARMAR" value="$(RVCTBIN)/armar$(DOTEXE)"/>
+		<set name="ARMASM" value="$(RVCTBIN)/armasm$(DOTEXE)"/>
+		<set name="ARMCC" value="$(RVCTBIN)/armcc$(DOTEXE)"/>
+		<set name="ARMLD" value="$(RVCTBIN)/armlink$(DOTEXE)"/>
+		<set name="FROMELF" value="$(RVCTBIN)/fromelf$(DOTEXE)"/>
+		
 		<set name="CC" value="$(ARMCC)"/>
 		<set name="LD" value="$(ARMLD)"/>
 		<set name="ASM" value="$(ARMASM)"/>
 		<set name="AR" value="$(ARMAR)"/>	
-		<set name="ARMCC" value="$(RVCTBIN)/armcc$(DOTEXE)"/>
-		<set name="ARMLD" value="$(RVCTBIN)/armlink$(DOTEXE)"/>
-		<set name="ARMASM" value="$(RVCTBIN)/armasm$(DOTEXE)"/>
-		<set name="ARMAR" value="$(RVCTBIN)/armar$(DOTEXE)"/>
-		<set name="FROMELF" value="$(RVCTBIN)/fromelf$(DOTEXE)"/>
+	
 		<set name="AAPCS_OPTION" value="--apcs /inter"/>
 		<set name="ARCHIVER_CREATE_OPTION" value="--create"/>
 		<set name="ARM_INSTRUCTION_SET" value="--arm"/>
 		<set name="ASM_OUTPUT_OPTION" value="-o"/>
 		<set name="ASSEMBLER_LISTING_OPTION" value="-S"/>
 		<set name="BPABI_OPTION" value="--bpabi"/>
+		<set name="CC.DWARF2" value="--dwarf2"/>
+		<set name="CC.DWARF3" value="--dwarf3"/>
 		<set name="CC_ERRORS_CONTROL_OPTION" value="--diag_error 1267"/>
 		<set name="CC_WARNINGS_CONTROL_OPTION" value="--diag_suppress 161,611,654,997,1152,1300,1464,1488,2523,6318,6331"/>
-		<set name="C_LANG_OPTION" value=""/>
+		<set name="CFLAGS" value=""/>
+		<set name="CIADEFS" value="__CIA__"/>
+		<set name="CODE_SEGMENT_START" value=""/>
 		<set name="COMMANDFILE_OPTION" value="--via "/>
+		<set name="COMPILER_CIA_FLAGS" value=""/>
+		<set name="COMPILER_DEFINES" value=""/>
+		<set name="COMPILER_FPU_OPTION" value="--fpu "/>
+		<set name="COMPILER_INTERWORK_DEFINES" value="__MARM_INTERWORK__"/>
+		<set name="COMPILER_SYSTEM_INCLUDE_OPTION" value="-J"/>
+		<set name="COMPILER_THUMB_DEFINES" value="__MARM_THUMB__"/>
 		<set name="COMPILE_ONLY_OPTION" value="-c"/>
 		<set name="CPP_LANG_OPTION" value="--cpp"/>
+		<set name="C_LANG_OPTION" value=""/>
+		<set name="DATA_SEGMENT_START" value="$(SPLIT_OPTION) $(RW_BASE_OPTION)"/>
 		<set name="DEBUG_OPTIMISATION" value="-O0"/>
 		<set name="DEPEND_OPTION" value="--depend_format=unix --depend"/>
 		<set name="ENUM_OPTION" value="--enum_is_int"/>
+		<set name="EXCEPTIONS" value="--exceptions --exceptions_unwind"/>
 		<set name="EXPORT_VTBL_OPTION" value="--export_all_vtbl"/>
+		<set name="EXTRA_CC_OPTION" value=""/>
 		<set name="EXTRA_LD_OPTION" value="--datacompressor=off"/>
 		<set name="FPMODE_OPTION" value="--fpmode ieee_no_fenv"/>
-		<set name="LD_ERRORS_CONTROL_OPTION" value=""/>
-		<set name="LD_WARNINGS_CONTROL_OPTION" value="--diag_suppress 6331"/>
-		<set name='LD_WARNINGS_SUPPRESSION_ARMLIBS' value='--diag_suppress 6780' />
-		<set name="LISTING_OPTION" value="-S"/>
-		<set name="EXCEPTIONS" value="--exceptions --exceptions_unwind"/>
-		<set name="NO_EXCEPTIONS" value="--no_exceptions --no_exceptions_unwind"/>
-		<set name="PREINCLUDE_OPTION" value="--preinclude"/>
-		<set name="PREPROCESSOR_OPTION" value="-E"/>
-		<set name="REL_OPTIMISATION" value="-O2"/>
-		<set name="STDLIB_OPTION" value="--no_scanlib"/>
-		<set name="RUNTIME_SYMBOL_VISIBILITY_OPTION" value="--dllimport_runtime"/>
-		<set name="RW_BASE_OPTION" value="--rw-base" /> 
-		<set name="RW_BASE" value="$(RW_BASE_OPTION) 0x400000"/>
-		<set name="CODE_SEGMENT_START" value=""/>
-		<set name="PREINCLUDE" value="$(RVCT_PRE_INCLUDE)"/>
-		<set name="CC.DWARF2" value="--dwarf2"/>
-		<set name="CC.DWARF3" value="--dwarf3"/>
+		<set name="HEADER_FILES_CONTROL_OPTION" value=""/>
+		<set name="INSTRUCTION_SET" value=""/>
 		<set name="LD.ARMV5" value=""/>
 		<set name="LD.ARMV6" value=""/>
 		<set name="LD.ARMV7" value=""/>
-		<set name="CFLAGS" value=""/>
-		<set name="CIADEFS" value="__CIA__"/>
-		<append name="CDEFS" value='__SUPPORT_CPP_EXCEPTIONS__ _UNICODE __SYMBIAN32__ __ARMCC__ __EPOC32__ __MARM__ __EABI__ __PRODUCT_INCLUDE__="$(PRODUCT_INCLUDE)" $(MMPDEFS) $(ARMMACROS)'/>
-		<set name="COMPILER_CIA_FLAGS" value=""/>
-		<set name="COMPILER_FPU_OPTION" value="--fpu "/>
-		<set name="COMPILER_DEFINES" value=""/>
-		<set name="COMPILER_INTERWORK_DEFINES" value="__MARM_INTERWORK__"/>
-		<set name="COMPILER_SYSTEM_INCLUDE_OPTION" value="-J"/>
-		<set name="COMPILER_THUMB_DEFINES" value="__MARM_THUMB__"/>
-		<set name="DATA_SEGMENT_START" value="$(SPLIT_OPTION) $(RW_BASE_OPTION)"/>
-		<set name="EXTRA_CC_OPTION" value=""/>
-		<set name="HEADER_FILES_CONTROL_OPTION" value=""/>
+		<set name="LD_ERRORS_CONTROL_OPTION" value=""/>
+		<set name="LD_WARNINGS_CONTROL_OPTION" value="--diag_suppress 6331"/>
+		<set name="LD_WARNINGS_SUPPRESSION_ARMLIBS" value="--diag_suppress 6780"/>
 		<set name="LIBPATH" value=""/>
 		<set name="LIBRARY" value=""/>
 		<set name="LICENSERETRY_OPTION" value=""/>
@@ -71,25 +65,35 @@
 		<set name="LINKER_DEFAULT_LIBS" value=""/>
 		<set name="LINKER_DEFAULT_LIB_PATHS" value=""/>
 		<set name="LINKER_ENTRY_OPTION" value="--entry"/>
+		<set name="LINKER_GROUP_END_OPTION" value=""/>
 		<set name="LINKER_GROUP_START_OPTION" value=""/>
-		<set name="LINKER_GROUP_END_OPTION" value=""/>
 		<set name="LINKER_MISC_FLAGS" value="$(LICENSERETRY_OPTION)"/>
 		<set name="LINKER_NODEBUG_OPTION" value=""/>
 		<set name="LINKER_SCRIPT_FILE_OPTION" value=""/>
+		<set name="LINKER_SYMBOLS_FILE_OPTION" value="--list"/>
 		<set name="LINKER_SYMBOLS_OPTION" value="--symbols"/> 
-		<set name="LINKER_SYMBOLS_FILE_OPTION" value="--list"/>
+		<set name="LISTING_OPTION" value="-S"/>
+		<set name="NO_EXCEPTIONS" value="--no_exceptions --no_exceptions_unwind"/>
+		<set name="NO_UNALIGNED_ACCESS" value="$(CC.NO_UNALIGNED_ACCESS)"/>
+		<set name="PREINCLUDE" value="$(RVCT_PRE_INCLUDE)"/>
+		<set name="PREINCLUDE_OPTION" value="--preinclude"/>
+		<set name="PREPROCESSOR_OPTION" value="-E"/>
+		<set name="REL_OPTIMISATION" value="-O2"/>
+		<set name="RUNTIME_SYMBOL_VISIBILITY_OPTION" value="--dllimport_runtime"/>
+		<set name="RW_BASE" value="$(RW_BASE_OPTION) 0x400000"/>
+		<set name="RW_BASE_OPTION" value="--rw-base"/> 
 		<set name="SHARED_OBJECT_OPTION" value="--dll"/>
 		<set name="SID" value=""/>
 		<set name="SO_NAME_OPTION" value="--soname"/>
 		<set name="STATIC_LIBS_PATH" value="$(RVCTLIB)/armlib"/>
 		<set name="STDCPP_INCLUDE" value="$(EPOCINCLUDE)/stdapis"/>
+		<set name="STDLIB_OPTION" value="--no_scanlib"/>
+		<set name="SUPPORTS_ABIV1_IMPLIBS" value="1"/>	
 		<set name="SYMBIAN_LD_MESSAGE_OPTION" value="$(LD_WARNINGS_CONTROL_OPTION) $(LD_ERRORS_CONTROL_OPTION)"/>
-		<set name="SUPPORTS_ABIV1_IMPLIBS" value="1"/>		
-		<set name="TARGET_RELOCATION_OPTION" value="" />
 		<set name="SYMVER_OPTION" value="--symver_soname"/>
+		<set name="TARGET_RELOCATION_OPTION" value=""/>
 		<set name="TEMP_FILES_OPTION" value=""/>
 		<set name="THUMB_INSTRUCTION_SET" value="--thumb"/>
-		<set name="INSTRUCTION_SET" value=""/>
 		<set name="TRANASM_FLAGS" value="-n -s"/>
 		<set name="TRANASM_INPUT_OPTION" value=""/>
 		<set name="TRANASM_OUTPUT_OPTION" value="-o="/>
@@ -97,10 +101,11 @@
 		<set name="UNDEFINED_SYMBOL_REF_OPTION" value=""/>
 		<set name="UNIX_SLASH_FOR_CC_ABS_PATHS" value="0"/>
 		<set name="UNRESOLVED_SYMBOL_REF_OPTION" value=""/>
+		<set name="USE_RVCT22_DELETE_WORKAROUND" value=""/>
 		<set name="USERINCLUDE" value=""/>
 		<set name="USER_LIBS_PATH_OPTION" value="--userlibpath"/>
 		<set name="VFE_OPTION" value="--no_vfe"/>
-		<set name="NO_UNALIGNED_ACCESS" value="$(CC.NO_UNALIGNED_ACCESS)"/>
-		<set name="USE_RVCT22_DELETE_WORKAROUND" value=""/>
+		
+		<append name="CDEFS" value="__ARMCC__"/>
 	</var>
 </build>
--- a/sbsv2/raptor/lib/config/variants.xml	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/lib/config/variants.xml	Wed Apr 07 12:34:10 2010 +0100
@@ -91,37 +91,40 @@
 	</var>
 	
 	<var name="gcce4_3_2" extends="gcce_base">
-		<env name="SBS_GCCE432BIN" type="path" />
+		<env name="SBS_GCCE432BIN" type="toolchainpath" />
 		<set name="GCCEBIN" value="$(SBS_GCCE432BIN)" />
+		<set name="GCCECC" value="$(GCCEBIN)/arm-none-symbianelf-g++$(DOTEXE)" type="tool" versionCommand="$(GCCECC) -dumpversion" versionResult="4.3.2"/>
 		<set name="RUNTIME_LIBS_LIST" value="drtaeabi.dso dfpaeabi.dso dfprvct3_1.dso drtrvct3_1.dso"/>
 		<set name="PLATMACROS.VAR" value="GCCE_4 GCCE_4_3"/>
 		<set name="ARMMACROS.VAR" value="__GCCE_4__ __GCCE_4_3__"/>
 	</var>
 
 	<var name="gcce4_3_3" extends="gcce_base">
-		<env name="SBS_GCCE433BIN" type="path" />
+		<env name="SBS_GCCE433BIN" type="toolchainpath" />
 		<set name="GCCEBIN" value="$(SBS_GCCE433BIN)" />
+		<set name="GCCECC" value="$(GCCEBIN)/arm-none-symbianelf-g++$(DOTEXE)" type="tool" versionCommand="$(GCCECC) -dumpversion" versionResult="4.3.3"/>
 		<set name="RUNTIME_LIBS_LIST" value="drtaeabi.dso dfpaeabi.dso dfprvct3_1.dso drtrvct3_1.dso"/>
 		<set name="PLATMACROS.VAR" value="GCCE_4 GCCE_4_3"/>
 		<set name="ARMMACROS.VAR" value="__GCCE_4__ __GCCE_4_3__"/>
 	</var>
 	
 	<var name="gcce4_4_1" extends="gcce_base">
-		<env name="SBS_GCCE441BIN" type="path" />
+		<env name="SBS_GCCE441BIN" type="toolchainpath" />
 		<set name="GCCEBIN" value="$(SBS_GCCE441BIN)" />
+		<set name="GCCECC" value="$(GCCEBIN)/arm-none-symbianelf-g++$(DOTEXE)" type="tool" versionCommand="$(GCCECC) -dumpversion" versionResult="4.4.1"/>
 		<set name="RUNTIME_LIBS_LIST" value="drtaeabi.dso dfpaeabi.dso"/>
 		<set name="PLATMACROS.VAR" value="GCCE_4 GCCE_4_4"/>
 		<set name="ARMMACROS.VAR" value="__GCCE_4__ __GCCE_4_4__"/>
 	</var>
 	
 	<var name="rvct2_2" extends="rvct">
-		<env name="RVCT22BIN" type="path"/>
-		<env name="RVCT22INC" type="path"/>
-		<env name="RVCT22LIB" type="path"/>
+		<env name="RVCT22BIN" type="toolchainpath"/>
+		<env name="RVCT22INC" type="toolchainpath"/>
+		<env name="RVCT22LIB" type="toolchainpath"/>
 		<set name="RVCTBIN" value="$(RVCT22BIN)"/>
 		<set name="RVCTINC" value="$(RVCT22INC)"/>
 		<set name="RVCTLIB" value="$(RVCT22LIB)"/>
-		<set name="ARMCC" value="&quot;$(RVCTBIN)/armcc$(DOTEXE)&quot;" type="tool" versionCommand="$(ARMCC) --vsn" versionResult="Compiler, RVCT2\.2\b"/>
+		<set name="ARMCC" value="$(RVCTBIN)/armcc$(DOTEXE)" type="tool" versionCommand="$(ARMCC) --vsn" versionResult="Compiler, RVCT2\.2\b"/>
 		<set name="OWN_LIBRARY_OPTION" value="-Ono_known_library"/>
 		<set name="RELOCATABLE_IMAGE_OPTION" value="--reloc"/>
 		<set name="SPLIT_OPTION" value="--split"/>
@@ -143,13 +146,13 @@
 	</var>
 
 	<var name="rvct3_1" extends="rvct">
-		<env name="RVCT31BIN" type="path"/>
-		<env name="RVCT31INC" type="path"/>
-		<env name="RVCT31LIB" type="path"/>
+		<env name="RVCT31BIN" type="toolchainpath"/>
+		<env name="RVCT31INC" type="toolchainpath"/>
+		<env name="RVCT31LIB" type="toolchainpath"/>
 		<set name="RVCTBIN" value="$(RVCT31BIN)"/>
 		<set name="RVCTINC" value="$(RVCT31INC)"/>
 		<set name="RVCTLIB" value="$(RVCT31LIB)"/>
-		<set name="ARMCC" value="&quot;$(RVCTBIN)/armcc$(DOTEXE)&quot;" type="tool" versionCommand="$(ARMCC) --version_number" versionResult="310[6-9]\d\d\b"/>
+		<set name="ARMCC" value="$(RVCTBIN)/armcc$(DOTEXE)" type="tool" versionCommand="$(ARMCC) --version_number" versionResult="310[6-9]\d\d\b"/>
 		<set name="OWN_LIBRARY_OPTION" value="--library_interface=aeabi_clib"/>
 		<set name="RELOCATABLE_IMAGE_OPTION" value=""/>
 		<set name="SPLIT_OPTION" value=""/>
@@ -173,13 +176,13 @@
 	</var>
 
 	<var name="rvct4_0" extends="rvct">
-		<env name="RVCT40BIN" type="path"/>
-		<env name="RVCT40INC" type="path"/>
-		<env name="RVCT40LIB" type="path"/>
+		<env name="RVCT40BIN" type="toolchainpath"/>
+		<env name="RVCT40INC" type="toolchainpath"/>
+		<env name="RVCT40LIB" type="toolchainpath"/>
 		<set name="RVCTBIN" value="$(RVCT40BIN)"/>
 		<set name="RVCTINC" value="$(RVCT40INC)"/>
 		<set name="RVCTLIB" value="$(RVCT40LIB)"/>
-		<set name="ARMCC" value="&quot;$(RVCTBIN)/armcc$(DOTEXE)&quot;" type="tool" versionCommand="$(ARMCC) --version_number" versionResult="400[4-9]\d\d\b"/>
+		<set name="ARMCC" value="$(RVCTBIN)/armcc$(DOTEXE)" type="tool" versionCommand="$(ARMCC) --version_number" versionResult="400[4-9]\d\d\b"/>
 		<set name="OWN_LIBRARY_OPTION" value="--library_interface=aeabi_clib"/>
 		<set name="RELOCATABLE_IMAGE_OPTION" value=""/>
 		<set name="SPLIT_OPTION" value=""/>
--- a/sbsv2/raptor/lib/config/winscw.xml	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/lib/config/winscw.xml	Wed Apr 07 12:34:10 2010 +0100
@@ -1,24 +1,31 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <build xmlns="http://symbian.com/xml/build" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symbian.com/xml/build ../../schema/build/2_0.xsd">
-	<!-- build configurations for Metrowerks Emulator compilers -->
+	<!-- build variants for CodeWarrior toolchains -->
 	<var name="winscw_base" extends="root">
 		<varRef ref="default.interfaces"/>
 		<varRef ref="default.locations"/>
-		<!-- picked up from the Environment -->
-		<env name='CHECKLIB' default='$(EPOCROOT)/epoc32/tools/checklib$(DOTEXE)' type='tool'/>
-		<env name='EFREEZE' default="$(PERL) $(EPOCROOT)/epoc32/tools/efreeze.pl" type='tool'/>
-		<env name='BMCONV' default="$(EPOCROOT)/epoc32/tools/bmconv$(DOTEXE)" type='tool'/>
-		<env name='MAKEDEF' default='$(PERL) $(EPOCROOT)/epoc32/tools/makedef.pl' type='path'/>
-		<env name='MWCC' default='mwccsym2$(DOTEXE)' type='tool' versionCommand='$(MWCC) -version' versionResult='Version 3.2.*'/>
-		<env name='MWLD' default='mwldsym2$(DOTEXE)' type='tool' versionCommand='$(MWLD) -version' versionResult='Version 3.2.*'/>
-		<env name='MWWINRC' default='mwwinrc$(DOTEXE)' type='tool' versionCommand='$(MWWINRC) -version' versionResult='Version 3.2.*'/>
-
-		<env name='PREPDEF' default='$(PERL) $(EPOCROOT)/epoc32/tools/prepdef.pl' type='path'/>
-		<env name='RCOMP' default='$(EPOCROOT)/epoc32/tools/rcomp$(DOTEXE)' type='tool'/>
-		<env name='STRINGTABLE' default='$(PERL) $(EPOCROOT)/epoc32/tools/stringtable.pl' type='path'/>	
+		
+		<!-- toolchain tools -->
+		<env name="MWCC" default="mwccsym2$(DOTEXE)" type="tool" versionCommand="$(MWCC) -version" versionResult="Version 3.2.*"/>
+		<env name="MWLD" default="mwldsym2$(DOTEXE)" type="tool" versionCommand="$(MWLD) -version" versionResult="Version 3.2.*"/>
+		<env name="MWWINRC" default="mwwinrc$(DOTEXE)" type="tool" versionCommand="$(MWWINRC) -version" versionResult="Version 3.2.*"/>
+		
+		<set name="CC" value="$(MWCC)"/>
+		<set name="LD" value="$(MWLD)"/>
+		<set name="RC" value="$(MWWINRC)"/>
+		
+		<!-- tools and scripts -->
+		<env name="BMCONV" default="$(EPOCROOT)/epoc32/tools/bmconv$(DOTEXE)" type="tool"/>
+		<env name="CHECKLIB" default="$(EPOCROOT)/epoc32/tools/checklib$(DOTEXE)" type="tool"/>
+		<env name="EFREEZE" default="$(PERL) $(EPOCROOT)/epoc32/tools/efreeze.pl" type="script"/>
+		<env name="MAKEDEF" default="$(PERL) $(EPOCROOT)/epoc32/tools/makedef.pl" type="script"/>
+		<env name="PREPDEF" default="$(PERL) $(EPOCROOT)/epoc32/tools/prepdef.pl" type="script"/>
+		<env name="RCOMP" default="$(EPOCROOT)/epoc32/tools/rcomp$(DOTEXE)" type="tool"/>
+		<env name="SBSV1MAKE" default="$(EPOCROOT)/epoc32/tools/make$(DOTEXE)" type="tool"/>
+		<env name="STRINGTABLE" default="$(PERL) $(EPOCROOT)/epoc32/tools/stringtable.pl" type="script"/>	
 		
 		<!-- link to bld.inf and mmp platform names -->
-		<set name='TRADITIONAL_PLATFORM' value='WINSCW'/>
+		<set name="TRADITIONAL_PLATFORM" value="WINSCW"/>
 
 		<!-- interfaces -->
 		<set name="INTERFACE.ani" value="Emulator.ani"/>
@@ -45,97 +52,96 @@
 		<set name="INTERFACE.resource" value="Emulator.resource"/>
 		<set name="INTERFACE.textnotifier2" value="Emulator.textnotifier2"/>
 		<set name="INTERFACE.var" value="Emulator.var"/>
-		<set name='CC' value='$(MWCC)'/>
-		<set name='CDEFS' value='__SYMBIAN32__ __CW32__ __WINS__ __WINSCW__ __SUPPORT_CPP_EXCEPTIONS__ _UNICODE $(MMPDEFS)'/>
-		<set name='CFLAGS' value='-c -align 4 -warnings on -w nohidevirtual,nounusedexpr -msgstyle gcc -enum int -str pool -exc ms -trigraphs on -cwd source'/>
-		<set name='CW_DEFAULT_LIBS' value='gdi32.lib user32.lib kernel32.lib'/>
-		<set name='CW_RUNTIME_STATIC' value='msl_all_static_mse_symbian_d.lib'/>
-		<set name='CW_RUNTIME_NONSTATIC' value='MSL_All_x86_Symbian_D.lib'/>
-		<set name='DEFAULT_NORMAL_NEWLIB' value='scppnwdl.lib'/>
-		<set name='DEFAULT_SYSTEM_NEWLIB' value='scppnwdl_kern.lib'/>
-		<set name='EXPORT_TYPE' value='dllexport'/>
-		<set name='LD' value='$(MWLD)'/>
-		<set name='LFLAGS' value='-msgstyle gcc -stdlib -subsystem windows'/>
-		<set name='LFLAGS_INFGEN' value='-S -show only,names,unmangled,verbose '/>
-		<set name='LFLAGS_SYMGEN' value='-S -show only,names,verbose '/>
-		<set name='LINKPATH' value='winscw/udeb'/>
-		<set name='LISTING_OPTION' value='-S'/>
-		<set name='MMPDEFS' value=''/>
-		<set name='EPOCSTACKSIZE' value=''/>
-		<set name='NMAKE' value='nmake'/>
-		<set name='NMAKEFLAGS' value='-nologo -x - '/>
-		<set name='OPT.ADDCOMMAND' value='-addcommand '/>
-		<set name='OPT.CHECKLIB.STDCPP' value='stdc++'/>
-		<set name='OPT.CHECKLIB.SYMCPP' value='symc++'/>
-		<set name='OPT.CHECKLIB.WIN32' value='--coff'/>
-		<set name='OPT.HEAPCOMMIT' value='-heapcommit='/>
-		<set name='OPT.DEFINE' value='-d '/>
-		<set name='OPT.DEFFILE' value='-f '/>
-		<set name='OPT.DEPEND' value='-gccdepends -MD '/>
-		<set name='OPT.EXPORT' value='-export '/>
-		<set name='OPT.HEAPRESERVE' value='-heapreserve='/>
-		<set name='OPT.IMAGEBASE' value='-imagebase '/>
-		<set name='OPT.IMPLIB' value='-implib '/>
-		<set name='OPT.IMPORTLIB' value='-importlib '/>
-		<set name='OPT.LIBFILE' value='-l'/>
-		<set name='OPT.LIBPATH' value='-l '/>
-		<set name='OPT.LISTING' value='-S -show source,unmangled,comments '/>
-		<set name='OPT.MENTRYPOINT' value='-m '/>
-		<set name='OPT.MAINENTRYPOINT' value='-main '/>
-		<set name='OPT.MAP' value='-map '/>
-		<set name='OPT.NOCOMPACTIMPORTLIB' value='-nocompactimportlib '/>
-		<set name='OPT.NOENTRY' value='-noentry '/>
-		<set name='OPT.NOIMPLIB' value='-noimplib '/>
-		<set name='OPT.NOSTDINC' value='-nostdinc '/>
-		<set name='OPT.OUT' value='-o '/>
-		<set name='OPT.PREINCLUDE' value='-include '/>
-		<set name='OPT.RUNTIME' value='-runtime '/>
-		<set name='OPT.SEARCH' value='-search'/>
-		<set name='OPT.SHARED' value='-shared '/>
-		<set name='OPT.SPLITINCLUDE' value='-i-'/>
-		<set name='OPT.STATICLIBRARY' value='-library '/>
-		<set name='OPT.STDINC' value='-stdinc '/>
-		<set name='OPT.STDLIB' value='-stdlib '/>
-		<set name='OPT.SYM' value='-sym '/>
-		<set name='OPT.SYSINCLUDE' value='-i '/>
-		<set name='OPT.USERINCLUDE' value='-i '/>
-		<set name='OPT.WCHAR' value='-wchar_t '/>
-		<set name='OPT.WARNINGS' value='-warnings '/>
-		<set name='OUTPUTPATH' value='$(SBS_BUILD_DIR)'/>
-		<set name='BLDINF_OUTPUTPATH' value='$(SBS_BUILD_DIR)'/>
-		<set name='RC' value='$(MWWINRC)'/>
-		<set name='RELEASEPATH' value='$(EPOCROOT)/epoc32/release'/>
-		<set name='SBSV1MAKE' value='$(EPOCROOT)/epoc32/tools/make$(DOTEXE)'/>
-		<set name='STDCPP_DEF' value='__SYMBIAN_STDCPP_SUPPORT__'/>
-		<set name='STDCPP_INCLUDE' value='$(EPOCINCLUDE)/stdapis'/>
-		<set name='STDCPP_WCHAR_DEF' value='__wchar_t_defined'/>
-		<set name='SYMLOOKUPUTIL' value='$(PERL) $(EPOCROOT)/epoc32/tools/sym_lkup_util.pl'/>
-		<set name='SYMLOOKUPARGS' value='--ignore_export_dir'/>
-		<set name='SYSTEMINCLUDE' value=''/>
-		<set name='TARGET' value='TARGET_WAS_NOT_SET_PROPERLY'/>
-		<set name='TARGETPATH' value=''/>
-		<set name='TARGETTYPE' value='TARGETTYPE_WAS_NOT_SET_PROPERLY'/>
-		<set name='USERINCLUDE' value=''/>
-		<set name='VARIANTPLATFORM' value='winscw'/>
-		<set name='PLATMACROS.WINDOWS' value='CW32 WINS WINSCW'/>
-		<set name='PLATMACROS.LINUX' value='$(PLATMACROS.WINDOWS)'/>
+		
+		<set name="BLDINF_OUTPUTPATH" value="$(SBS_BUILD_DIR)"/>
+		<set name="CDEFS" value="__SYMBIAN32__ __CW32__ __WINS__ __WINSCW__ __SUPPORT_CPP_EXCEPTIONS__ _UNICODE $(MMPDEFS)"/>
+		<set name="CFLAGS" value="-c -align 4 -warnings on -w nohidevirtual,nounusedexpr -msgstyle gcc -enum int -str pool -exc ms -trigraphs on -cwd source"/>
+		<set name="CW_DEFAULT_LIBS" value="gdi32.lib user32.lib kernel32.lib"/>
+		<set name="CW_RUNTIME_NONSTATIC" value="MSL_All_x86_Symbian_D.lib"/>
+		<set name="CW_RUNTIME_STATIC" value="msl_all_static_mse_symbian_d.lib"/>
+		<set name="DEFAULT_NORMAL_NEWLIB" value="scppnwdl.lib"/>
+		<set name="DEFAULT_SYSTEM_NEWLIB" value="scppnwdl_kern.lib"/>
+		<set name="EPOCSTACKSIZE" value=""/>
+		<set name="EXPORT_TYPE" value="dllexport"/>
+		<set name="LFLAGS" value="-msgstyle gcc -stdlib -subsystem windows"/>
+		<set name="LFLAGS_INFGEN" value="-S -show only,names,unmangled,verbose "/>
+		<set name="LFLAGS_SYMGEN" value="-S -show only,names,verbose "/>
+		<set name="LINKPATH" value="winscw/udeb"/>
+		<set name="LISTING_OPTION" value="-S"/>
+		<set name="MMPDEFS" value=""/>
+		<set name="NMAKE" value="nmake"/>
+		<set name="NMAKEFLAGS" value="-nologo -x - "/>
+		<set name="OPT.ADDCOMMAND" value="-addcommand "/>
+		<set name="OPT.CHECKLIB.STDCPP" value="stdc++"/>
+		<set name="OPT.CHECKLIB.SYMCPP" value="symc++"/>
+		<set name="OPT.CHECKLIB.WIN32" value="--coff"/>
+		<set name="OPT.DEFFILE" value="-f "/>
+		<set name="OPT.DEFINE" value="-d "/>
+		<set name="OPT.DEPEND" value="-gccdepends -MD "/>
+		<set name="OPT.EXPORT" value="-export "/>
+		<set name="OPT.HEAPCOMMIT" value="-heapcommit="/>
+		<set name="OPT.HEAPRESERVE" value="-heapreserve="/>
+		<set name="OPT.IMAGEBASE" value="-imagebase "/>
+		<set name="OPT.IMPLIB" value="-implib "/>
+		<set name="OPT.IMPORTLIB" value="-importlib "/>
+		<set name="OPT.LIBFILE" value="-l"/>
+		<set name="OPT.LIBPATH" value="-l "/>
+		<set name="OPT.LISTING" value="-S -show source,unmangled,comments "/>
+		<set name="OPT.MAINENTRYPOINT" value="-main "/>
+		<set name="OPT.MAP" value="-map "/>
+		<set name="OPT.MENTRYPOINT" value="-m "/>
+		<set name="OPT.NOCOMPACTIMPORTLIB" value="-nocompactimportlib "/>
+		<set name="OPT.NOENTRY" value="-noentry "/>
+		<set name="OPT.NOIMPLIB" value="-noimplib "/>
+		<set name="OPT.NOSTDINC" value="-nostdinc "/>
+		<set name="OPT.OUT" value="-o "/>
+		<set name="OPT.PREINCLUDE" value="-include "/>
+		<set name="OPT.RUNTIME" value="-runtime "/>
+		<set name="OPT.SEARCH" value="-search"/>
+		<set name="OPT.SHARED" value="-shared "/>
+		<set name="OPT.SPLITINCLUDE" value="-i-"/>
+		<set name="OPT.STATICLIBRARY" value="-library "/>
+		<set name="OPT.STDINC" value="-stdinc "/>
+		<set name="OPT.STDLIB" value="-stdlib "/>
+		<set name="OPT.SYM" value="-sym "/>
+		<set name="OPT.SYSINCLUDE" value="-i "/>
+		<set name="OPT.USERINCLUDE" value="-i "/>
+		<set name="OPT.WARNINGS" value="-warnings "/>
+		<set name="OPT.WCHAR" value="-wchar_t "/>
+		<set name="OUTPUTPATH" value="$(SBS_BUILD_DIR)"/>
+		<set name="RELEASEPATH" value="$(EPOCROOT)/epoc32/release"/>
+		<set name="STDCPP_DEF" value="__SYMBIAN_STDCPP_SUPPORT__"/>
+		<set name="STDCPP_INCLUDE" value="$(EPOCINCLUDE)/stdapis"/>
+		<set name="STDCPP_WCHAR_DEF" value="__wchar_t_defined"/>
+		<set name="SYMLOOKUPARGS" value="--ignore_export_dir"/>
+		<set name="SYMLOOKUPUTIL" value="$(PERL) $(EPOCROOT)/epoc32/tools/sym_lkup_util.pl"/>
+		<set name="SYSTEMINCLUDE" value=""/>
+		<set name="TARGET" value="TARGET_WAS_NOT_SET_PROPERLY"/>
+		<set name="TARGETPATH" value=""/>
+		<set name="TARGETTYPE" value="TARGETTYPE_WAS_NOT_SET_PROPERLY"/>
+		<set name="USERINCLUDE" value=""/>
+		<set name="VARIANTPLATFORM" value="winscw"/>
+		
+		<!-- macros -->
+		<set name="PLATMACROS.WINDOWS" value="CW32 WINS WINSCW"/>
+		<set name="PLATMACROS.LINUX" value="$(PLATMACROS.WINDOWS)"/>
 	</var>
 
 	<var name="winscw_udeb" extends="winscw_base">
-		<set name='FULLVARIANTPATH' value='winscw/udeb'/>
-		<set name='VARIANTTYPE' value='udeb'/>
+		<set name="FULLVARIANTPATH" value="winscw/udeb"/>
+		<set name="VARIANTTYPE" value="udeb"/>
 
-		<append name='CDEFS' value='_DEBUG'/>
-		<append name='CFLAGS' value='-g -O0 -inline off'/>
-		<append name='LFLAGS' value='-g'/>
+		<append name="CDEFS" value="_DEBUG"/>
+		<append name="CFLAGS" value="-g -O0 -inline off"/>
+		<append name="LFLAGS" value="-g"/>
 	</var>
 
 	<var name="winscw_urel" extends="winscw_base">
-		<set name='FULLVARIANTPATH' value='winscw/urel'/>
-		<set name='VARIANTTYPE' value='urel'/>
+		<set name="FULLVARIANTPATH" value="winscw/urel"/>
+		<set name="VARIANTTYPE" value="urel"/>
 
-		<append name='CDEFS' value='NDEBUG'/>
-		<append name='CFLAGS' value='-O4,s'/>
+		<append name="CDEFS" value="NDEBUG"/>
+		<append name="CFLAGS" value="-O4,s"/>
 	</var>
 
 	<group name="winscw">
--- a/sbsv2/raptor/lib/flm/e32abiv2.flm	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/lib/flm/e32abiv2.flm	Wed Apr 07 12:34:10 2010 +0100
@@ -580,8 +580,7 @@
 # Targettype is some type of DLL or EXE (or derivative)
 ifneq ($(LINK_TARGET),)
 
-escaped_located_ARMLIBS:=$(foreach L,$(ARMLIBS),$(call ruleEscape,$(wildcard $(subst $(CHAR_SPACE),?,$(RVCTLIB)/*/$(L)))))
-quoted_located_ARMLIBS:=$(foreach L,$(ARMLIBS),$(call dblquoteitem,$(wildcard $(RVCTLIB)/*/$(L))))
+located_ARMLIBS:=$(foreach L,$(ARMLIBS),$(wildcard $(RVCTLIB)/*/$(L)))
 located_STATICLIBRARIES:=$(foreach L,$(STATICLIBRARY),$(STATIC_LIBRARY_DIR)/$(L).lib)
 e32abiv2_LIBS:=$(EXPTARGET) $(LINKER_STUB_LIBRARY) $(if $(STATIC_RUNTIME_LIB),$(STATIC_RUNTIME_DIR)/$(STATIC_RUNTIME_LIB),) $(located_STATICLIBRARIES)
 # DLLS and EXEs - These objects are linked by a linker
@@ -594,12 +593,10 @@
 REDUCED_RUNTIME_LIBS_LIST:=$(subst $(TARGET).dso,,$(RUNTIME_LIBS_LIST))
 
 ifeq ($(VARIANTTYPE),udeb)
-  e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(IMPORTLIBPATH)/,$(LIBRARY_DEBUG)) $(addprefix $(RUNTIME_LIBS_PATH)/,$(REDUCED_RUNTIME_LIBS_LIST)) 
+  e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(IMPORTLIBPATH)/,$(LIBRARY_DEBUG)) $(addprefix $(RUNTIME_LIBS_PATH)/,$(REDUCED_RUNTIME_LIBS_LIST)) $(located_ARMLIBS)
 else
-  e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(IMPORTLIBPATH)/,$(LIBRARY)) $(addprefix $(RUNTIME_LIBS_PATH)/,$(REDUCED_RUNTIME_LIBS_LIST)) 
+  e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(IMPORTLIBPATH)/,$(LIBRARY)) $(addprefix $(RUNTIME_LIBS_PATH)/,$(REDUCED_RUNTIME_LIBS_LIST)) $(located_ARMLIBS)
 endif
-quoted_e32abiv2_LIBS=$(e32abiv2_LIBS) $(quoted_located_ARMLIBS)
-escaped_e32abiv2_LIBS=$(e32abiv2_LIBS) $(escaped_located_ARMLIBS)
 
 else
 # NORMAL
@@ -612,19 +609,16 @@
 ifeq ($(HAS_DEDICATED_OP_NEWDEL_LIB),1)
   e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(RUNTIME_LIBS_PATH)/,$(NEWLIB))
 endif
-quoted_e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(RUNTIME_LIBS_PATH)/,$(RUNTIME_LIBS_LIST)) $(call addquotedprefix,$(STATIC_LIBS_PATH)/,$(STATIC_LIBS_LIST)) $(quoted_located_ARMLIBS)
-escaped_e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(RUNTIME_LIBS_PATH)/,$(RUNTIME_LIBS_LIST)) $(addprefix $(call ruleEscape,$(STATIC_LIBS_PATH)/),$(STATIC_LIBS_LIST)) $(escaped_located_ARMLIBS)
+e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(RUNTIME_LIBS_PATH)/,$(RUNTIME_LIBS_LIST)) $(addprefix $(STATIC_LIBS_PATH)/,$(STATIC_LIBS_LIST)) $(located_ARMLIBS)
 
 endif
 else
 # ARM RUNTIME LIBS
 ifeq ($(VARIANTTYPE),udeb)
-  e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(IMPORTLIBPATH)/,$(LIBRARY_DEBUG)) 
+  e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(IMPORTLIBPATH)/,$(LIBRARY_DEBUG)) $(located_ARMLIBS)
 else
-  e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(IMPORTLIBPATH)/,$(LIBRARY))
+  e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(IMPORTLIBPATH)/,$(LIBRARY)) $(located_ARMLIBS)
 endif
-quoted_e32abiv2_LIBS=$(e32abiv2_LIBS) $(quoted_located_ARMLIBS)
-escaped_e32abiv2_LIBS=$(e32abiv2_LIBS) $(escaped_located_ARMLIBS)
 endif
 
 # NOTE: the groupin10 macro must be used before a call to the "startrule" macro
@@ -634,7 +628,7 @@
 # outside the relevant tags but it is also unavoidable.
 define linktarget_func
 ## The actual link target, dependencies and build step
-$(E32TARGET): $(POSTLINKDEFFILE) $(ELF2E32) $(if $(MULTIFILE_ENABLED),$(MULTIFILEOBJECT) $(CIAFILES_LINKOBJECTS),$(LINKOBJECTS)) $(escaped_e32abiv2_LIBS) $(LINKER_ENTRYPOINT_LIBDEP) $(if $(SUPPORTS_STDCPP_NEWLIB),$(CHECKLIB)) $(if $(LINKERFEEDBACK_STAGE2),$(FEEDBACKFILE),) $(if $(HAVE_ORDERONLY),|,) $(EPOCROOT)/epoc32/build/TEM_LIB
+$(E32TARGET): $(POSTLINKDEFFILE) $(ELF2E32) $(if $(MULTIFILE_ENABLED),$(MULTIFILEOBJECT) $(CIAFILES_LINKOBJECTS),$(LINKOBJECTS)) $(e32abiv2_LIBS) $(LINKER_ENTRYPOINT_LIBDEP) $(if $(SUPPORTS_STDCPP_NEWLIB),$(CHECKLIB)) $(if $(LINKERFEEDBACK_STAGE2),$(FEEDBACKFILE),) $(if $(HAVE_ORDERONLY),|,) $(EPOCROOT)/epoc32/build/TEM_LIB
 	$(if $(MULTIFILE_ENABLED),,@echo -n "" > $(VIAFILE);
 	$(call groupin10,$(LINKOBJECTS)) ;)
 	$(call startrule,linkandpostlink) \
@@ -654,7 +648,7 @@
 	  $(if $(MULTIFILE_ENABLED),$(call dblquote,$(MULTIFILEOBJECT) $(CIAFILES_LINKOBJECTS)),$(COMMANDFILE_OPTION)$(call dblquote,$(VIAFILE))) \
       $(if $(GENERATELINKERFEEDBACK),$(FEEDBACK_OPTION)$(call dblquote,$(FEEDBACKFILE))) \
 	  $(if $(LINKER_ADD_STATIC_RUNTIME),$(if $(STATIC_RUNTIME_LIB),$(LINKER_GROUP_START_OPTION) $(STATIC_RUNTIME_DIR)/$(STATIC_RUNTIME_LIB) $(LINKER_GROUP_END_OPTION),)) \
-	  $(quoted_e32abiv2_LIBS) $(LINKER_DEFAULT_LIBS) && \
+	  $(call dblquote,$(e32abiv2_LIBS)) $(LINKER_DEFAULT_LIBS) && \
 	  $(ELF2E32) \
 	  --sid=0x$(if $(SID),$(SID),$(if $(UID3),$(UID3),0)) \
 	  --version=$(VERSION) \
@@ -795,7 +789,7 @@
 			$(if $(USE_PROFILER_FEEDBACK),--profile=$(call dblquote,$(ARM_PROFILER_FILE)),) \
 			$(call makemacrodef,-D,$(COMPILER_INTERWORK_DEFINES) $(CDEFS))				\
 			$(if $(PREINCLUDE),$(PREINCLUDE_OPTION) ,)$(call concat, $(PREINCLUDE_OPTION) ,$(call dblquote,$(PREINCLUDE)))\
-			$(if $(SET_ARMINC),$(if $(RVCTINC),$(COMPILER_SYSTEM_INCLUDE_OPTION)$(call dblquoteitem,$(RVCTINC)),),)       \
+			$(if $(SET_ARMINC),$(if $(RVCTINC),$(COMPILER_SYSTEM_INCLUDE_OPTION)$(call dblquote,$(RVCTINC)),),)       \
 			$(COMPILER_SYSTEM_INCLUDE_OPTION)$$(call dblquote,$$(<D))                                                      \
 			$(if $(USERINCLUDE),$(COMPILER_SYSTEM_INCLUDE_OPTION),)$(call concat, $(COMPILER_SYSTEM_INCLUDE_OPTION),$(call dblquote,$(USERINCLUDE)))      \
 			$(if $(SYSTEMINCLUDE),$(COMPILER_SYSTEM_INCLUDE_OPTION),)$(call concat, $(COMPILER_SYSTEM_INCLUDE_OPTION),$(call dblquote,$(SYSTEMINCLUDE)))  \
@@ -891,7 +885,7 @@
 			$(OPTION_COMPILER) 						\
 			$(call makemacrodef,-D,$(COMPILER_INTERWORK_DEFINES) $(CDEFS))				\
 			$(if $(PREINCLUDE),$(PREINCLUDE_OPTION) ,)$(call concat, $(PREINCLUDE_OPTION) ,$(call dblquote,$(PREINCLUDE)))\
-			$(if $(SET_ARMINC),$(if $(RVCTINC),$(COMPILER_SYSTEM_INCLUDE_OPTION)$(call dblquoteitem,$(RVCTINC)),),)       \
+			$(if $(SET_ARMINC),$(if $(RVCTINC),$(COMPILER_SYSTEM_INCLUDE_OPTION)$(call dblquote,$(RVCTINC)),),)       \
 			$(COMPILER_SYSTEM_INCLUDE_OPTION)$$(call dblquote,$$(<D))                                                   \
 			$(if $(USERINCLUDE),$(COMPILER_SYSTEM_INCLUDE_OPTION),)$(call concat, $(COMPILER_SYSTEM_INCLUDE_OPTION),$(call dblquote,$(USERINCLUDE)))      \
 			$(if $(SYSTEMINCLUDE),$(COMPILER_SYSTEM_INCLUDE_OPTION),)$(call concat, $(COMPILER_SYSTEM_INCLUDE_OPTION),$(call dblquote,$(SYSTEMINCLUDE)))  \
@@ -1012,7 +1006,7 @@
        $(if $(PREINCLUDE),$(PREINCLUDE_OPTION) ,)$$(call concat, $(PREINCLUDE_OPTION) ,$$(call dblquote,$(PREINCLUDE))) \
        $(if $(USERINCLUDE),$(COMPILER_SYSTEM_INCLUDE_OPTION),)$$(call concat, $(COMPILER_SYSTEM_INCLUDE_OPTION),$$(call dblquote,$(USERINCLUDE))) \
        $(if $(SYSTEMINCLUDE),$(COMPILER_SYSTEM_INCLUDE_OPTION),)$$(call concat, $(COMPILER_SYSTEM_INCLUDE_OPTION),$$(call dblquote,$(SYSTEMINCLUDE))) \
-       $(if $(ARMINC),$(if $(RVCTINC), $(COMPILER_SYSTEM_INCLUDE_OPTION)$$(call dblquoteitem,$(RVCTINC)),),) )
+       $(if $(ARMINC),$(if $(RVCTINC), $(COMPILER_SYSTEM_INCLUDE_OPTION)$$(call dblquote,$(RVCTINC)),),) )
 
 
 $(e32abiv2_PREFILE): $1 $(PROJECT_META) $(if $(DEPENDFILE),,RESOURCE BITMAP EXPORT)
--- a/sbsv2/raptor/lib/flm/msvctools.flm	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/lib/flm/msvctools.flm	Wed Apr 07 12:34:10 2010 +0100
@@ -1,4 +1,4 @@
-# Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+# Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
 # All rights reserved.
 # This component and the accompanying materials are made available
 # under the terms of the License "Eclipse Public License v1.0"
@@ -28,7 +28,7 @@
 $(call makepath,$(RELEASEPATH))
 $(call makepath,$(BUILDPATH))
 
-RELEASEABLES:=$(RELEASEABLES) $(RELEASETARGET)
+RELEASABLES:=$(RELEASABLES) $(RELEASETARGET)
 
 GENDEBUGINFO:=$(if $(findstring deb,$(VARIANTTYPE)),1,)
 
@@ -58,10 +58,6 @@
 # macros
 DEFINES:=$(call makemacrodef,$(OPT.DEFINE),$(CDEFS) $(BASE_MACRO) $(CFLAGS.ADD))
 
-# other
-PDBFILE:=$(if $(GENDEBUGINFO),$(RELEASEPATH)/$(TARGET).pdb,)
-CLEANTARGETS:=$(CLEANTARGETS) $(PDBFILE)
-
 #compile
 define msvctoolscompile
   $(BUILDPATH)/$(basename $(notdir $(1))).obj: $(1) $(PROJECT_META) $(if $(HAVE_ORDERONLY),|,)  EXPORT
@@ -70,7 +66,6 @@
 	$(if $(findstring staticlib,$(BASE_TYPE)),,$(CFLAGS.LIB)) \
 	$(CFLAGS) $$(subst /,-,$(OPTION_MSVC)) \
 	$(if $(findstring /W,$(OPTION_MSVC)),,$(CFLAGS.DEFAULT.WARNLEVEL)) \
-	$(if $(PDBFILE),$$(call msvcformatarg,$(OPT.PDBFILE),$(PDBFILE)),) \
 	$(DEFINES) $(INCLUDES) \
 	$$(call msvcformatarg,$(OPT.BROWSEFILE),$(BUILDPATH)/$(basename $(notdir $(1))).sbr) \
 	$$(call msvcformatarg,$(OPT.OBJECTFILE),$$@) $(1) \
@@ -156,7 +151,7 @@
 
 ifneq ($(INSTALLPATH),)
   INSTALLTARGET:=$(INSTALLPATH)/$(TARGET).$(if $(REQUESTEDTARGETEXT),$(REQUESTEDTARGETEXT),$(TARGETTYPE))
-  RELEASEABLES:=$(RELEASEABLES) $(INSTALLTARGET)
+  RELEASABLES:=$(RELEASABLES) $(INSTALLTARGET)
 
   define msvctoolsinstall
     $(INSTALLTARGET): $(RELEASETARGET)
@@ -179,7 +174,7 @@
   BSCFILE:=$(RELEASEPATH)/$(TARGET).bsc
   BSCRESPONSEFILE:=$(BUILDPATH)/$(TARGET).brf
   CLEANTARGETS:=$(CLEANTARGETS) $(BSCRESPONSEFILE)
-  RELEASEABLES:=$(RELEASEABLES) $(BSCFILE)
+  RELEASABLES:=$(RELEASABLES) $(BSCFILE)
 
   define msvctoolsgenbrowse  
     $(BSCFILE): $(OBJFILES)
@@ -197,8 +192,8 @@
 
 # Global targets
 .PHONY:: $(ALLTARGET)
-$(ALLTARGET):: $(RELEASEABLES)
-TARGET:: $(RELEASEABLES)
+$(ALLTARGET):: $(RELEASABLES)
+TARGET:: $(RELEASABLES)
 
 ifeq ($(BASE_TYPE),staticlib)
   LIBRARY:: $(RELEASETARGET) $(INSTALLTARGET)
--- a/sbsv2/raptor/lib/flm/msvctools.xml	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/lib/flm/msvctools.xml	Wed Apr 07 12:34:10 2010 +0100
@@ -42,7 +42,6 @@
 		<param name='OPT.LISTING'/>
 		<param name='OPT.OBJECTFILE'/>
 		<param name='OPT.OUTFILE'/>
-		<param name='OPT.PDBFILE'/>
 		<param name='OPT.PREINCLUDE'/>
 		<param name='OPT.SUBSYSTEM'/>
 		<param name='OPT.SYSINCLUDE'/>
--- a/sbsv2/raptor/lib/flm/resource.flm	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/lib/flm/resource.flm	Wed Apr 07 12:34:10 2010 +0100
@@ -1,4 +1,4 @@
-# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
 # All rights reserved.
 # This component and the accompanying materials are made available
 # under the terms of the License "Eclipse Public License v1.0"
@@ -112,7 +112,7 @@
 $(call makepath,$(INTERBASE))
 
 # common pre-processor options
-CPPOPT:=-nostdinc -undef -D_UNICODE -include $(PRODUCT_INCLUDE)\
+CPPOPT:=-nostdinc -undef -Wno-trigraphs -D_UNICODE -include $(PRODUCT_INCLUDE)\
  -I$(dir $(SOURCE)) $(foreach I, $(USERINCLUDE),-I$(I) ) -I- $(foreach J,$(SYSTEMINCLUDE),-I$(J) )
 
 CREATABLEPATHS:=$(RSCDIR) $(RSGDIR) $(OUTPUTPATH)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/license.txt	Wed Apr 07 12:34:10 2010 +0100
@@ -0,0 +1,8 @@
+Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
--- a/sbsv2/raptor/python/generic_path.py	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/python/generic_path.py	Wed Apr 07 12:34:10 2010 +0100
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+# Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
 # All rights reserved.
 # This component and the accompanying materials are made available
 # under the terms of the License "Eclipse Public License v1.0"
@@ -19,6 +19,7 @@
 import sys
 import re
 import types
+import ctypes
 
 # are we on windows, and if so what is the current drive letter
 isWin = sys.platform.lower().startswith("win")
@@ -265,7 +266,37 @@
 
 		return self.path
 
+	def GetSpaceSafePath(self):
+		"""Returns a version of the path where spaces don't interfere with shell interpretation.
+		
+		This functionality only applies to Windows - paths containing spaces are assumed to be problematic
+		on non-Windows platforms.
+		
+		On Windows, the path is returned in Windows-specific 8.3 short path form - tilde are used to replace
+		spaces and fit path elements within 8.3 requirements.  As 8.3 format paths are not guaranteed to be
+		supported on all Windows installs, and can only be calculated if they exist, a newly formated path is
+		only returned if it is returned by the Windows API and tested to exist.
+		"""
+		
+		if not isWin:
+			return None
+		
+		from ctypes.wintypes import DWORD, LPSTR, MAX_PATH
 
+		GetShortPathNameA = ctypes.windll.kernel32.GetShortPathNameA
+		GetShortPathNameA.restype = DWORD
+		GetShortPathNameA.argtypes = LPSTR, LPSTR, DWORD
+		
+		buffer = ctypes.create_string_buffer(MAX_PATH)
+		GetShortPathNameA(self.path, buffer, MAX_PATH)
+		
+		spacesafe = buffer.value
+		
+		if not spacesafe or not os.path.exists(spacesafe):
+			return None
+		
+		return spacesafe
+		
 # Module functions
 
 def Join(*arguments):
--- a/sbsv2/raptor/python/plugins/filter_terminal.py	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/python/plugins/filter_terminal.py	Wed Apr 07 12:34:10 2010 +0100
@@ -161,7 +161,7 @@
 
 		# list of strings to catch recipe warnings (must be lowercase)
 		self.recipe_warning_expr = ["warning:"]
-
+		
 	def isMakeWarning(self, text):
                 """A simple test for warnings.
                 Can be extended do to more comprehensive checking."""
@@ -201,6 +201,9 @@
 		if self.raptor.quiet:
 			self.quiet = True
 		
+		# the build configurations which were reported
+		self.built_configs = []
+		
 		# keep count of errors and warnings
 		self.err_count = 0
 		self.warn_count = 0
@@ -393,7 +396,9 @@
 				self.recipeBody.append(text)
 			else:
 				self.recipelineExceeded += 1
-
+		elif text.startswith("<info>Buildable configuration '"):
+			# <info>Buildable configuration 'name'</info>
+			self.built_configs.append(text[30:-8])
 
 	def logit(self):
 		""" log a message """
@@ -432,11 +437,14 @@
 		if self.warn_count > 0 or self.err_count > 0:
 			sys.stdout.write("\n%s : warnings: %s\n" % (raptor.name,
 					self.warn_count))
-			sys.stdout.write("%s : errors: %s\n" % (raptor.name,
+			sys.stdout.write("%s : errors: %s\n\n" % (raptor.name,
 					self.err_count))
 		else:
-			sys.stdout.write("\nno warnings or errors\n")
+			sys.stdout.write("\nno warnings or errors\n\n")
 
+		for bc in self.built_configs:
+			sys.stdout.write("built " + bc + "\n")
+			
 		sys.stdout.write("\nRun time %d seconds\n" % self.raptor.runtime);
 		sys.stdout.write("\n")
 		return True
--- a/sbsv2/raptor/python/raptor.py	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/python/raptor.py	Wed Apr 07 12:34:10 2010 +0100
@@ -42,7 +42,6 @@
 import sys
 import types
 import time
-import re
 import traceback
 import pluginbox
 from xml.sax.saxutils import escape
@@ -232,8 +231,9 @@
 
 	def makefile(self, makefilename_base, engine, named = False):
 		"""Makefiles for individual mmps not feasible at the moment"""
-		pass # Cannot, currently, "unfurl an mmp" directly but do want
-		     # to be able to simulate the overall recursive unfurling of a build.
+		pass 
+		# Cannot, currently, "unfurl an mmp" directly but do want
+		# to be able to simulate the overall recursive unfurling of a build.
 
 class Component(ModelNode):
 	"""A group of projects or, in symbian-speak, a bld.inf.
@@ -321,7 +321,6 @@
 
 		# insert the start time into the Makefile name?
 
-		buildconfig = build.GetConfig("build").GenerateBuildUnits(build.cache)
 		self.configs = build.buildUnitsToBuild
 
 		# Pass certain CLI flags through to the makefile-generating sbs calls
@@ -385,8 +384,7 @@
 			makefile_path = str(build.topMakefile) + "_" + str(loop_number)
 			try:
 				os.unlink(makefile_path) # until we have dependencies working properly
-			except Exception,e:
-				# print "couldn't unlink %s: %s" %(componentMakefileName, str(e))
+			except Exception:
 				pass
 
 			# add some basic data in a component-wide variant
@@ -859,32 +857,6 @@
 
 		self.cache.Load(self.systemFLM)
 
-	def GetConfig(self, configname):
-		names = configname.split(".")
-
-		cache = self.cache
-
-		base = names[0]
-		mods = names[1:]
-
-		if base in cache.groups:
-			x = cache.FindNamedGroup(base)
-		elif base in cache.aliases:
-			x = cache.FindNamedAlias(base)
-		elif base in cache.variants:
-			x = cache.FindNamedVariant(base)
-		else:
-			raise Exception("Unknown build configuration '%s'" % configname)
-
-		x.ClearModifiers()
-
-
-		try:
-			for m in mods: x.AddModifier( cache.FindNamedVariant(m) )
-		except KeyError:
-			raise Exception("Unknown build configuration '%s'" % configname)
-		return x
-
 	def GetBuildUnitsToBuild(self, configNames):
 		"""Return a list of the configuration objects that correspond to the
 		   list of configuration names in the configNames parameter.
@@ -900,17 +872,7 @@
 			else:
 				configNames.append(self.defaultConfig)
 
-		buildUnitsToBuild = set()
-
-
-		for c in set(configNames):
-			self.Debug("BuildUnit: %s", c)
-			try:
-				x = self.GetConfig(c)
-				gb = x.GenerateBuildUnits(self.cache)
-				buildUnitsToBuild.update( gb )
-			except Exception, e:
-				self.FatalError(str(e))
+		buildUnitsToBuild = raptor_data.GetBuildUnits(configNames, self.cache, self)
 
 		for b in buildUnitsToBuild:
 			self.Info("Buildable configuration '%s'", b.name)
@@ -1003,7 +965,6 @@
 			dir = generic_path.Path(aDir)
 
 		bldInf = dir.Append(self.buildInformation)
-		componentgroup = []
 
 		if bldInf.isFile():
 			return bldInf
@@ -1150,7 +1111,7 @@
 				self.out.write(raptor_timing.Timing.discovery_string(object_type = object_type,
 						count = count))
 			except Exception, exception:
-				Error(exception.Text, function = "InfoDiscoveryTime")
+				self.Error(exception.Text, function = "InfoDiscoveryTime")
 
 	def InfoStartTime(self, object_type, task, key):
 		if self.timing:
@@ -1158,7 +1119,7 @@
 				self.out.write(raptor_timing.Timing.start_string(object_type = object_type,
 						task = task, key = key))
 			except Exception, exception:
-				Error(exception.Text, function = "InfoStartTime")
+				self.Error(exception.Text, function = "InfoStartTime")
 
 	def InfoEndTime(self, object_type, task, key):
 		if self.timing:
@@ -1166,7 +1127,7 @@
 				self.out.write(raptor_timing.Timing.end_string(object_type = object_type,
 						task = task, key = key))
 			except Exception, exception:
-				Error(exception.Text, function = "InfoEndTime")
+				self.Error(exception.Text, function = "InfoEndTime")
 
 	def Debug(self, format, *extras, **attributes):
 		"Send a debugging message to the configured channel"
@@ -1280,6 +1241,9 @@
 			self.AssertBuildOK()
 			buildUnitsToBuild = self.GetBuildUnitsToBuild(self.configNames)
 
+			if len(buildUnitsToBuild) == 0:
+				raise BuildCannotProgressException("No configurations to build.")
+			
 			self.buildUnitsToBuild = buildUnitsToBuild
 
 			# find out what components to build, and in what way
--- a/sbsv2/raptor/python/raptor_cli.py	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/python/raptor_cli.py	Wed Apr 07 12:34:10 2010 +0100
@@ -34,7 +34,7 @@
 # raptor_cli module attributes
 
 parser = OptionParser(prog = raptor.name,
-					  usage = """%prog [--help] [options] [variable=value] [target] ...
+					  usage = """%prog [--help] [options] [target] ...
 
 Targets:
 
@@ -247,13 +247,8 @@
 
 	# the leftover_args are either variable assignments of the form a=b
 	# or target names.
-	regex = re.compile("^(.+)=(.*)$")
 	for leftover in leftover_args:
-		assignment = regex.findall(leftover)
-		if len(assignment) > 0:
-			Raptor.SetEnv(assignment[0][0],assignment[0][1])
-		else:
-			Raptor.AddTarget(leftover)
+		Raptor.AddTarget(leftover)
 
 	# Define the dictionary of functions to be used.
 	# Attributes and function names can be added easily.
--- a/sbsv2/raptor/python/raptor_data.py	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/python/raptor_data.py	Wed Apr 07 12:34:10 2010 +0100
@@ -65,7 +65,7 @@
 
 # Make sure not to start up on an unsupported platform
 if not HostPlatform.IsKnown(HostPlatform.hostplatform):
-	raise Exception("raptor_data module loaded on an unrecognised platform '%s'. Expected one of %s" % (hostplatform, str(hostplatforms)))
+	raise Exception("raptor_data module loaded on an unrecognised platform '%s'. Expected one of %s" % (HostPlatform.hostplatform, str(HostPlatform.hostplatforms)))
 
 
 # raptor_data module classes
@@ -139,7 +139,13 @@
 		raise BadReferenceError()
 
 	def GetModifiers(self, cache):
-		return [ cache.FindNamedVariant(m) for m in self.modifiers ]
+		mods = []
+		for m in self.modifiers:
+			try:
+				mods.append(cache.FindNamedVariant(m))
+			except KeyError:
+				raise BadReferenceError(m)
+		return mods
 
 	def Valid(self):
 		return self.ref
@@ -710,7 +716,7 @@
 
 	def __str__(self):
 		attributes = "name='" + self.name + "' type='" + self.type + "'"
-		if default != None:
+		if self.default != None:
 			attributes += " default='" + self.default + "'"
 
 		if type == "tool":
@@ -724,19 +730,31 @@
 			value = os.environ[self.name]
 			
 			if value:
-				# if this value is a "path" or a "tool" then we need to make sure
-				# it is a proper absolute path in our preferred format.
-				if self.type == "path" or self.type == "tool":
+				if self.type in ["path", "tool", "toolchainpath"]:
+					# if this value is some sort of path or tool then we need to make sure
+					# it is a proper absolute path in our preferred format.
 					try:
 						path = generic_path.Path(value)
 						value = str(path.Absolute())
 					except ValueError,e:
-						raise BadToolValue("the environment variable %s is incorrect: %s" % (self.name, str(e)))				
-				# if this value ends in an un-escaped backslash, then it will be treated as a line continuation character
-				# in makefile parsing - un-escaped backslashes at the end of values are therefore escaped
+						raise BadToolValue("the environment variable %s is incorrect: %s" % (self.name, str(e)))
+					
+					if self.type in ["tool", "toolchainpath"]:
+						# if  we're dealing with tool-related values, then make sure that we can get "safe"
+						# versions if they contain spaces - if we can't, that's an error, as they won't
+						# survive full usage in the toolcheck or when used and/or referenced in FLMs						
+						if ' ' in value:
+							path = generic_path.Path(value)
+							spaceSafeValue = path.GetSpaceSafePath()
+						
+							if not spaceSafeValue:
+								raise BadToolValue("the environment variable %s is incorrect - it is a '%s' type but contains spaces that cannot be neutralised: %s" % (self.name, self.type, value))
+							
+							value = spaceSafeValue	
 				elif value.endswith('\\'):
-					# an odd number of backslashes means there's one to escape
-					count = len(value) - len(value.rstrip('\\'))
+					# if this value ends in an un-escaped backslash, then it will be treated as a line continuation character
+					# in makefile parsing - un-escaped backslashes at the end of values are therefore escaped					
+					count = len(value) - len(value.rstrip('\\'))	# an odd number of backslashes means there's one to escape
 					if count % 2:
 						value += '\\'	
 		except KeyError:
@@ -906,7 +924,6 @@
 		s += "</var>"
 		return s
 
-import traceback
 class VariantRef(Reference):
 
 	def __init__(self, ref=None):
@@ -918,7 +935,7 @@
 	def Resolve(self, cache):
 		try:
 			return cache.FindNamedVariant(self.ref)
-		except KeyError, e:
+		except KeyError:
 			raise BadReferenceError(self.ref)
 
 class MissingVariantException(Exception):
@@ -961,7 +978,7 @@
 					missing_variants.append(r.ref)
 				
 			if len(missing_variants) > 0:
-				raise MissingVariantException("Missing variants '%s'", " ".join(missing_variants))
+				raise MissingVariantException("Missing variants '%s'" % " ".join(missing_variants))
 
 	def GenerateBuildUnits(self, cache):
 		self.Resolve(cache)
@@ -1026,25 +1043,27 @@
 
 	def GenerateBuildUnits(self, cache):
 		units = []
-
+		
 		missing_variants = []
 		for r in self.childRefs:
-			refMods = r.GetModifiers(cache)
-
 			try:
 				obj = r.Resolve(cache=cache)
 			except BadReferenceError:
 				missing_variants.append(r.ref)
 			else:
 				obj.ClearModifiers()
+				try:
+					refMods = r.GetModifiers(cache)
+				except BadReferenceError,e:
+					missing_variants.append(str(e))
+				else:
+					for m in refMods + self.modifiers:
+						obj.AddModifier(m)
 
-				for m in refMods + self.modifiers:
-					obj.AddModifier(m)
-
-				units.extend( obj.GenerateBuildUnits(cache) )
+					units.extend( obj.GenerateBuildUnits(cache) )
 
 		if len(missing_variants) > 0:
-			raise MissingVariantException("Missing variants '%s'", " ".join(missing_variants))
+			raise MissingVariantException("Missing variants '%s'" % " ".join(missing_variants))
 
 		return units
 
@@ -1055,7 +1074,7 @@
 		Reference.__init__(self, ref)
 
 	def __str__(self):
-		return "<%s /><groupRef ref='%s' mod='%s'/>" % (prefix, self.ref, ".".join(self.modifiers))
+		return "<groupRef ref='%s' mod='%s'/>" % (self.ref, ".".join(self.modifiers))
 
 	def Resolve(self, cache):
 		try:
@@ -1063,6 +1082,81 @@
 		except KeyError:
 			raise BadReferenceError(self.ref)
 
+def GetBuildUnits(configNames, cache, logger):
+	"""expand a list of config strings like "arm.v5.urel" into a list
+	of BuildUnit objects that can be queried for settings.
+	
+	The expansion tries to be tolerant of errors in the XML so that a
+	typo in one part of a group does not invalidate the whole group.
+	"""
+	
+	# turn dot-separated name strings into Model objects (Group, Alias, Variant)
+	models = []
+		
+	for c in set(configNames):
+		ok = True
+		names = c.split(".")
+
+		base = names[0]
+		mods = names[1:]
+
+		if base in cache.groups:
+			x = cache.FindNamedGroup(base)
+		elif base in cache.aliases:
+			x = cache.FindNamedAlias(base)
+		elif base in cache.variants:
+			x = cache.FindNamedVariant(base)
+		else:
+			logger.Error("Unknown build configuration '%s'" % base)
+			continue
+
+		x.ClearModifiers()
+
+		for m in mods:
+			if m in cache.variants:
+				x.AddModifier( cache.FindNamedVariant(m) )
+			else:
+				logger.Error("Unknown build variant '%s'" % m)
+				ok = False
+				
+		if ok:
+			models.append(copy.copy(x))
+
+	# turn Model objects into BuildUnit objects
+	#
+	# all objects have a GenerateBuildUnits method but don't use
+	# that for Groups because it is not tolerant of errors (the
+	# first error raises an exception and the rest of the group is
+	# abandoned)
+	units = []
+		
+	while len(models) > 0:
+		x = models.pop()
+		try:
+			if isinstance(x, (Alias, Variant)):
+				# these we just turn straight into BuildUnits
+				units.extend(x.GenerateBuildUnits(cache))
+			elif isinstance(x, Group):
+				# deal with each part of the group separately (later)
+				for child in x.childRefs:
+					modChild = copy.copy(child)
+					modChild.modifiers = child.modifiers + [m.name for m in x.modifiers]
+					models.append(modChild)
+			elif isinstance(x, Reference):
+				# resolve references and their modifiers
+				try:
+					obj = x.Resolve(cache)
+					modObj = copy.copy(obj)
+					modObj.modifiers = x.GetModifiers(cache)
+				except BadReferenceError,e:
+					logger.Error("Unknown reference '%s'" % str(e))
+				else:
+					models.append(modObj)
+		except Exception, e:
+			logger.Error(str(e))
+
+	return units
+	
 class ToolErrorException(Exception):
 	def __init__(self, s):
 		Exception.__init__(self,s)
@@ -1364,6 +1458,9 @@
 class UninitialisedVariableException(Exception):
 	pass
 
+class RecursionException(Exception):
+	pass
+
 class Evaluator(object):
 	"""Determine the values of variables under different Configurations.
 	Either of specification and buildUnit may be None."""
@@ -1436,7 +1533,6 @@
 			for k, v in self.dict.items():
 				if v.find('$(' + k + ')') != -1:
 						raise RecursionException("Recursion Detected in variable '%s' in configuration '%s' " % (k,configName))
-						expanded = "RECURSIVE_INVALID_STRING"
 				else:
 					expanded = self.ExpandAll(v, specName, configName)
 
--- a/sbsv2/raptor/python/raptor_make.py	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/python/raptor_make.py	Wed Apr 07 12:34:10 2010 +0100
@@ -37,7 +37,19 @@
 class BadMakeEngineException(Exception):
 	pass
 
+def string_following(prefix, str):
+	"""If str starts with prefix then return the rest of str, otherwise None"""
+	if str.startswith(prefix):
+		return str[len(prefix):]
+	else:
+		return None
+
 def XMLEscapeLog(stream):
+	""" A generator that reads a raptor log from a stream and performs an XML escape
+	    on all text between tags, which is usually make output that could contain
+	    illegal characters that upset XML-based log parsers.
+	    This function yields "xml-safe" output line by line.
+	"""
 	inRecipe = False
 
 	for line in stream:
@@ -54,22 +66,49 @@
 			yield escape(line)
 
 def AnnoFileParseOutput(annofile):
+	""" A generator that extracts log output from an emake annotation file, 
+	    perform an XML-unescape on it and "yields" it line by line.  """
 	af = open(annofile, "r")
 
 	inOutput = False
-	inParseJob = False
+
+	buildid = ""
 	for line in af:
 		line = line.rstrip("\n\r")
 
+
 		if not inOutput:
-			if line.startswith("<output>"):
+			o = string_following("<output>", line)
+			if not o:
+				o = string_following('<output src="prog">', line)
+
+			if o:
 				inOutput = True	
-				yield unescape(line[8:])+'\n'
-				# This is make output so don't unescape it.
-			elif line.startswith('<output src="prog">'):
-				line = line[19:]
-				inOutput = True	
-				yield unescape(line)+'\n'
+				yield unescape(o)+'\n'
+				continue
+
+
+			o = string_following('<build id="',line)
+			if o:
+				buildid = o[:o.find('"')]
+				yield "Starting build: "+buildid+"\n"
+				continue 
+
+			o = string_following('<metric name="duration">', line)
+			if o:
+				secs = int(o[:o.find('<')])
+				if secs != 0:
+					duration = "%d:%d" % (secs/60, secs % 60)
+				else:
+					duration = "0:0"
+				continue 
+
+
+			o = string_following('<metric name="clusterAvailability">', line)
+			if o:
+				availability = o[:o.find('<')]
+				continue 
+				
 		else:
 			end_output = line.find("</output>")
 		
@@ -77,8 +116,10 @@
 				line = line[:end_output]
 				inOutput = False
 			
-			yield unescape(line)+'\n'
+			if line != "":	
+				yield unescape(line)+'\n'
 
+	yield "Finished build: %s   Duration: %s (m:s)   Cluster availability: %s%%\n" %(buildid,duration,availability)
 	af.close()
 
 
@@ -146,8 +187,8 @@
 
 			if self.copyLogFromAnnoFile:
 				for o in self.raptor.makeOptions:
-					if o.startswith("--emake-annofile="):
-						self.annoFileName = o[17:]
+					self.annoFileName = string_following("--emake-annofile=", o)
+					if self.annoFileName:
 						self.raptor.Info("annofile: " + o)
 
 				if not self.annoFileName:
--- a/sbsv2/raptor/python/raptor_meta.py	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/python/raptor_meta.py	Wed Apr 07 12:34:10 2010 +0100
@@ -1304,16 +1304,15 @@
 		elif varname == 'PAGED':
 			self.BuildVariant.AddOperation(raptor_data.Set(varname, "1"))
 			self.__debug( "Set switch PAGE ON")
+			# PAGED is equivalent to PAGEDCODE
 			self.BuildVariant.AddOperation(raptor_data.Set("PAGEDCODE_OPTION", "paged"))
 			self.__debug( "Set switch PAGEDCODE ON")
-			self.BuildVariant.AddOperation(raptor_data.Set("PAGEDDATA_OPTION", "paged"))
-			self.__debug( "Set data PAGEDDATA ON")
 			self.__pageConflict.append("PAGEDCODE")
-			self.__pageConflict.append("PAGEDDATA")
 
 		elif varname == 'UNPAGED':
 			self.BuildVariant.AddOperation(raptor_data.Set("PAGED", "0"))
 			self.__debug( "Set switch PAGED OFF")
+			# UNPAGED is equivalent to UNPAGEDCODE *and* UNPAGEDDATA
 			self.BuildVariant.AddOperation(raptor_data.Set("PAGEDCODE_OPTION", "unpaged"))
 			self.__debug( "Set switch PAGEDCODE OFF")
 			self.BuildVariant.AddOperation(raptor_data.Set("PAGEDDATA_OPTION", "unpaged"))
@@ -1335,6 +1334,7 @@
 			self.BuildVariant.AddOperation(raptor_data.Set("PAGEDCODE_OPTION", "unpaged"))
 			self.__debug( "Set switch " + varname + " ON")
 			self.__pageConflict.append(varname)
+			
 		elif varname == 'UNPAGEDDATA':
 			self.BuildVariant.AddOperation(raptor_data.Set("PAGEDDATA_OPTION", "unpaged"))
 			self.__debug( "Set switch " + varname + " ON")
@@ -1343,6 +1343,7 @@
 		elif varname == 'NOLINKTIMECODEGENERATION':
 			self.BuildVariant.AddOperation(raptor_data.Set("LTCG",""))
 			self.__debug( "Set switch " + varname + " OFF")
+			
 		elif varname == 'NOMULTIFILECOMPILATION':
 			self.BuildVariant.AddOperation(raptor_data.Set("MULTIFILE_ENABLED",""))
 			self.__debug( "Set switch " + varname + " OFF")
@@ -1352,21 +1353,19 @@
 				self.__debuggable = "udeb urel"
 			else:
 				self.__Raptor.Warn("DEBUGGABLE keyword ignored as DEBUGGABLE_UDEBONLY is already specified")
+		
 		elif varname == 'DEBUGGABLE_UDEBONLY':
 			if self.__debuggable != "":
 				self.__Raptor.Warn("DEBUGGABLE keyword has no effect as DEBUGGABLE or DEBUGGABLE_UDEBONLY is already set")
 			self.__debuggable = "udeb"
+		
 		elif varname == 'FEATUREVARIANT':
 			self.BuildVariant.AddOperation(raptor_data.Set(varname,"1"))
 			self.featureVariant = True
+		
 		elif varname in ['COMPRESSTARGET', 'NOCOMPRESSTARGET', 'INFLATECOMPRESSTARGET', 'BYTEPAIRCOMPRESSTARGET']:
-			if self.__compressionKeyword:
-				self.__Raptor.Warn("%s keyword in %s overrides earlier use of %s" % (varname, self.__currentMmpFile, self.__compressionKeyword))
-				self.BuildVariant.AddOperation(raptor_data.Set(self.__compressionKeyword,""))
-				self.__debug( "Set switch " + varname + " OFF")
-			self.BuildVariant.AddOperation(raptor_data.Set(varname,"1"))
-			self.__debug( "Set switch " + varname + " ON")
-			self.__compressionKeyword = varname
+			self.resolveCompressionKeyword(varname)
+		
 		else:
 			self.__debug( "Set switch "+toks[0]+" ON")
 			self.BuildVariant.AddOperation(raptor_data.Set(prefix+varname, "1"))
@@ -1722,7 +1721,7 @@
 	def getDefaultResourceTargetPath(self, targettype):
 		# the different default TARGETPATH values should come from the
 		# configuration rather than being hard-coded here.
-		if targettype == "plugin":
+		if targettype in ["plugin", "plugin3"]:
 			return "resource/plugins"
 		if targettype == "pdl":
 			return "resource/printers"
@@ -2247,12 +2246,21 @@
 			for x in self.__pageConflict:
 				if x == "PAGEDCODE" or x == "UNPAGEDCODE":
 					self.__Raptor.Warn("Both PAGEDCODE and UNPAGEDCODE are specified. The last one %s will take effect" % x)
+					if x == "PAGEDCODE":
+						self.resolveCompressionKeyword("BYTEPAIRCOMPRESSTARGET")
 					break
+		elif "PAGEDCODE" in self.__pageConflict:
+			self.resolveCompressionKeyword("BYTEPAIRCOMPRESSTARGET")
+				
 		if "PAGEDDATA" in self.__pageConflict and "UNPAGEDDATA" in self.__pageConflict:
 			for x in self.__pageConflict:
 				if x == "PAGEDDATA" or x == "UNPAGEDDATA":
 					self.__Raptor.Warn("Both PAGEDDATA and UNPAGEDDATA are specified. The last one %s will take effect" % x)
+					if x == "PAGEDDATA":
+						self.resolveCompressionKeyword("BYTEPAIRCOMPRESSTARGET")
 					break
+		elif "PAGEDDATA" in self.__pageConflict:
+			self.resolveCompressionKeyword("BYTEPAIRCOMPRESSTARGET")
 
 		# Set Debuggable
 		self.BuildVariant.AddOperation(raptor_data.Set("DEBUGGABLE", self.__debuggable))
@@ -2271,6 +2279,19 @@
 		"""Target type in lower case - the standard format"""
 		return self.__targettype.lower()
 
+	def resolveCompressionKeyword(self, aCompressionKeyword):
+		"""If a compression keyword is set more than once either explicitly
+		or implicitly a warning is given and the last one takes effect 
+		"""
+		if self.__compressionKeyword and self.__compressionKeyword != aCompressionKeyword:
+			self.__Raptor.Warn("%s keyword in %s overrides earlier use of %s" % \
+						(aCompressionKeyword, self.__currentMmpFile, self.__compressionKeyword))
+			self.BuildVariant.AddOperation(raptor_data.Set(self.__compressionKeyword, ""))
+			self.__debug( "Set switch " + self.__compressionKeyword + " OFF")
+		self.BuildVariant.AddOperation(raptor_data.Set(aCompressionKeyword,"1"))
+		self.__debug( "Set switch " + aCompressionKeyword + " ON")
+		self.__compressionKeyword = aCompressionKeyword
+
 	def checkImplibDefFile(self, defFile):
 		"""Project with target type implib must have DEFFILE defined 
 		explicitly or implicitly, otherwise it is an error
--- a/sbsv2/raptor/python/raptor_version.py	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/python/raptor_version.py	Wed Apr 07 12:34:10 2010 +0100
@@ -16,7 +16,7 @@
 
 # replace CHANGESET with the Hg changeset for ANY release
 
-version=(2,12,5,"2010-03-18","symbian build system","CHANGESET")
+version=(2,13,0,"2010-03-31","symbian build system","CHANGESET")
 
 def numericversion():
 	"""Raptor version string"""
--- a/sbsv2/raptor/test/common/raptor_tests.py	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/test/common/raptor_tests.py	Wed Apr 07 12:34:10 2010 +0100
@@ -417,22 +417,26 @@
 
 			p = subprocess.Popen(args=[BASH, '-c', command], 
 					stdout=subprocess.PIPE,
-					stderr=subprocess.STDOUT,
+					stderr=subprocess.PIPE,
 					env=shellenv,
 					shell=False,
 					universal_newlines=True)
 
-			self.output = p.communicate()[0]
+			(std_out, std_err) = p.communicate()
+			
+			self.output = std_out + std_err
 		else:
 			p = subprocess.Popen(command, 
 					stdout=subprocess.PIPE,
-					stderr=subprocess.STDOUT,
+					stderr=subprocess.PIPE,
 					env=shellenv,
 					shell=True,
 					universal_newlines=True)
 
-			self.output = p.communicate()[0]
-
+			(std_out, std_err) = p.communicate()
+			
+			self.output = std_out + std_err
+			
 		if debug_mode_active:
 			print self.output
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/config/os_properties.xml	Wed Apr 07 12:34:10 2010 +0100
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<build xmlns="http://symbian.com/xml/build"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://symbian.com/xml/build build/2_0.xsd">
+
+  <!-- This variant modifies the root variant for this particular kit. -->
+  <var name="root.changes">
+
+    <!-- pretend we don't have the new paging options (codepaging, datapaging)
+         so that we can test the old options (paged, unpaged)
+    --> 
+    <set name='POSTLINKER_SUPPORTS_WDP' value=''/>
+  </var>
+  
+</build>
--- a/sbsv2/raptor/test/smoke_suite/annofile2log.py	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/annofile2log.py	Wed Apr 07 12:34:10 2010 +0100
@@ -24,16 +24,12 @@
 	
 	t.usebash = True
 	t.errors = 0
-	t.returncode = 1
+	t.returncode = 0
 	t.exceptions = 0
 	t.command = "cd smoke_suite/test_resources/annofile2log && ( diff -wB <(python testanno2log.py <(bzip2 -dc scrubbed_ncp_dfs_resource.anno.bz2)) <(bzip2 -dc scrubbed_ncp_dfs_resource.stdout.bz2))"
 	
 	t.mustmatch_multiline = [ 
-		".*1a2.*" + 
-		"Starting build: 488235.{1,3}" +
-		"14009c12884.{1,4}" +
-		"---.{1,4}" +
-		"Finished build: 488235   Duration: 1:15 \(m:s\)   Cluster availability: 100%.*"
+		"^ *.?"
                 ]
 
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/cli_makevar_override.py	Wed Apr 07 12:34:10 2010 +0100
@@ -0,0 +1,38 @@
+#
+# Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+# Checks that functionality for overriding makefile varaibles at the command no longer works
+# The mechanism for dealing with this was removed as the fix for SF bug 2134
+# On the CLI, "something=something" is now treated as a target rather than a variable assignment
+
+from raptor_tests import SmokeTest
+
+def run():
+	t = SmokeTest()
+	t.name = "cli_makevar_overide"
+	t.id = "0117"
+	t.description = "Attempt to override a makefile var at the command line."
+	t.usebash = True
+	
+	t.command = "sbs -b smoke_suite/test_resources/basics/helloworld/Bld.inf REALLYCLEAN -m ${SBSMAKEFILE} -f ${SBSLOGFILE} HOSTPLATFORM_DIR=unlikelydir"  
+	
+	t.mustmatch = ["sbs: warning: CLEAN, CLEANEXPORT and a REALLYCLEAN should not be combined with other targets as the result is unpredictable"]
+	
+	t.warnings = 1
+	t.run()
+	
+	return t
+	
\ No newline at end of file
--- a/sbsv2/raptor/test/smoke_suite/export.py	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/export.py	Wed Apr 07 12:34:10 2010 +0100
@@ -73,7 +73,7 @@
 	t.name = "export"
 	t.usebash = True
 	t.command = "ls -l ${EPOCROOT}/epoc32/include/executable_file"
-	t.mustmatch = [ "^.rwxrwxr.x .*executable_file.*$" ]
+	t.mustmatch = [ "^.rwxrwxr.x[\.\+]? .*executable_file.*$" ]
 	t.targets = []
 	t.run("linux")
 	t.usebash = False
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/keepgoing.py	Wed Apr 07 12:34:10 2010 +0100
@@ -0,0 +1,106 @@
+#
+# Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+from raptor_tests import SmokeTest
+
+def run():
+	t = SmokeTest()
+	t.description = """Raptor should keep going and build as much as possible with the -k option specified."""
+	
+	command = "sbs -b smoke_suite/test_resources/simple/bld.inf -k"
+	config = " --configpath=test/smoke_suite/test_resources/keepgoing"
+	targets = [
+		"$(EPOCROOT)/epoc32/release/armv5/udeb/test.exe",
+		"$(EPOCROOT)/epoc32/release/armv5/udeb/test.exe.map",
+		"$(EPOCROOT)/epoc32/release/armv5/urel/test.exe",
+		"$(EPOCROOT)/epoc32/release/armv5/urel/test.exe.map",
+		"$(EPOCROOT)/epoc32/release/armv5/udeb/test.exe.sym",
+		"$(EPOCROOT)/epoc32/release/armv5/urel/test.exe.sym"
+		]	
+	buildtargets = [
+		"test_/armv5/udeb/test.o",
+		"test_/armv5/urel/test.o",
+		"test_/armv5/udeb/test.o.d",
+		"test_/armv5/udeb/test3.o.d",
+		"test_/armv5/udeb/test4.o.d",
+		"test_/armv5/udeb/test5.o.d",
+		"test_/armv5/udeb/test1.o.d",
+		"test_/armv5/udeb/test6.o.d",
+		"test_/armv5/udeb/test2.o.d",
+		"test_/armv5/udeb/test3.o",
+		"test_/armv5/udeb/test4.o",
+		"test_/armv5/udeb/test5.o",
+		"test_/armv5/udeb/test1.o",
+		"test_/armv5/udeb/test6.o",
+		"test_/armv5/udeb/test2.o",
+		"test_/armv5/urel/test.o.d",
+		"test_/armv5/urel/test3.o.d",
+		"test_/armv5/urel/test4.o.d",
+		"test_/armv5/urel/test5.o.d",
+		"test_/armv5/urel/test1.o.d",
+		"test_/armv5/urel/test6.o.d",
+		"test_/armv5/urel/test2.o.d",
+		"test_/armv5/urel/test3.o",
+		"test_/armv5/urel/test4.o",
+		"test_/armv5/urel/test5.o",
+		"test_/armv5/urel/test1.o",
+		"test_/armv5/urel/test6.o",
+		"test_/armv5/urel/test2.o",
+		"test_/armv5/udeb/test_udeb_objects.via",
+		"test_/armv5/urel/test_urel_objects.via"
+		]
+	
+	# using a non-existent config with -c should build any independent configs
+	t.id = "115a"
+	t.name = "keepgoing_bad_config"
+	t.command = command + " -c armv5 -c armv5.bogus"
+	t.targets = targets
+	t.addbuildtargets("smoke_suite/test_resources/simple/bld.inf", buildtargets)
+	t.mustmatch = ["sbs: error: Unknown build variant 'bogus'"]
+	t.warnings = 0
+	t.errors = 1
+	t.returncode = 1
+	t.run()
+	
+	# using groups with bad sub-groups should build any independent groups
+	t.id = "115b"
+	t.name = "keepgoing_bad_subgroup"
+	t.command = command + config + " -c lots_of_products"
+	t.mustmatch = ["Unknown reference 'qwertyuio'",
+	               "Unknown reference 'asdfghjkl'",
+	               "Unknown reference 'zxcvbnm_p'"]
+	t.warnings = 0
+	t.errors = 3
+	t.returncode = 1
+	t.run()
+	
+	# using groups with bad sub-sub-groups should build any independent groups
+	t.id = "115c"
+	t.name = "keepgoing_bad_subsubgroup"
+	t.command = command + config + " -c lots_of_products_2"
+	t.mustmatch = ["Unknown reference 'qwertyuio'",
+	               "Unknown reference 'asdfghjkl'",
+	               "Unknown reference 'zxcvbnm_p'"]
+	t.warnings = 0
+	t.errors = 3
+	t.returncode = 1
+	t.run()
+	
+	# summarise	
+	t.id = "115"
+	t.name = "keepgoing"
+	t.print_result()
+	return t
--- a/sbsv2/raptor/test/smoke_suite/paging.py	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/paging.py	Wed Apr 07 12:34:10 2010 +0100
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
 # All rights reserved.
 # This component and the accompanying materials are made available
 # under the terms of the License "Eclipse Public License v1.0"
@@ -24,61 +24,108 @@
 	cmd_prefix = "sbs -b smoke_suite/test_resources/simple_paging/bld.inf -c armv5_urel "
 	cmd_suffix = " -m ${SBSMAKEFILE} -f ${SBSLOGFILE} && cat ${SBSLOGFILE} "
 
-	result = SmokeTest.PASS
-
 	t.id = "0093a"
 	t.name = "paging_default"
 	t.command = cmd_prefix + "-p default.mmp" + cmd_suffix
-	t.mustmatch = [".*--codepaging=default.*", ".*--datapaging=default.*"]
-	t.run("windows")	# Windows-only until we've updated the Linux version of elf2e32.
-	if t.result == "skip":
-		return t
-	if t.result == SmokeTest.FAIL:
-		result = SmokeTest.FAIL
+	t.mustmatch_singleline = [
+			"--codepaging=default", 
+			"--datapaging=default"
+			]
+	t.run()
 
 	t.id = "0093b"
 	t.name = "paging_unpaged"
 	t.command = cmd_prefix + "-p unpaged.mmp" + cmd_suffix
-	t.mustmatch = [".*--codepaging=unpaged.*", ".*--datapaging=unpaged.*"]
+	t.mustmatch_singleline = [
+			"--codepaging=unpaged", 
+			"--datapaging=unpaged"
+			]
 	t.run()
-	if t.result == SmokeTest.FAIL:
-		result = SmokeTest.FAIL
 
 	t.id = "0093c"
 	t.name = "paging_paged"
 	t.command = cmd_prefix + "-p paged.mmp" + cmd_suffix
-	t.mustmatch = [".*--codepaging=paged.*", ".*--datapaging=paged.*"]
+	# Either pagedcode or pageddata can imply bytepaircompresstarget 
+	t.mustmatch_singleline = [
+			"--codepaging=paged", 
+			"--datapaging=default",
+			"--compressionmethod=bytepair"
+			]
 	t.run()
-	if t.result == SmokeTest.FAIL:
-		result = SmokeTest.FAIL
 
 	t.id = "0093d"
 	t.name = "paging_unpagedcode_pageddata"
 	t.command = cmd_prefix + "-p unpagedcode_pageddata.mmp" + cmd_suffix
-	t.mustmatch = [".*--codepaging=unpaged.*", ".*--datapaging=paged.*"]
+	t.mustmatch_singleline = [
+			"--codepaging=unpaged", 
+			"--datapaging=paged",
+			"--compressionmethod=bytepair"
+			]
 	t.run()
-	if t.result == SmokeTest.FAIL:
-		result = SmokeTest.FAIL
 
 	t.id = "0093e"
 	t.name = "paging_pagedcode_unpageddata"
 	t.command = cmd_prefix + "-p pagedcode_unpageddata.mmp" + cmd_suffix
-	t.mustmatch = [".*--codepaging=paged.*", ".*--datapaging=unpaged.*"]
+	t.mustmatch_singleline = [
+			"--codepaging=paged", 
+			"--datapaging=unpaged",
+			"--compressionmethod=bytepair"
+			]
 	t.run()
-	if t.result == SmokeTest.FAIL:
-		result = SmokeTest.FAIL
 
 	t.id = "0093f"
 	t.name = "paging_pagedcode_defaultdata"
 	t.command = cmd_prefix + "-p pagedcode_defaultdata.mmp" + cmd_suffix
-	t.mustmatch = [".*--codepaging=paged.*", ".*--datapaging=default.*"]
+	t.mustmatch_singleline = [
+			"--codepaging=paged", 
+			"--datapaging=default",
+			"--compressionmethod=bytepair"
+			]
+	t.run()
+
+	t.id = "0093g"
+	t.name = "paging_paged_unpaged_no_bytepair"
+	t.command = cmd_prefix + "-p paged_unpaged.mmp" + cmd_suffix
+	t.mustmatch_singleline = [
+			"--codepaging=unpaged", 
+			"--datapaging=unpaged"
+			]
+	t.mustnotmatch = [
+			"--compressionmethod=bytepair"	
+			]
+	t.warnings = 2 # 1 in the log and 1 on screen
 	t.run()
-	if t.result == SmokeTest.FAIL:
-		result = SmokeTest.FAIL
+
+	# test the pre-WDP paging options --paged and --unpaged
+	# there is an os_properties.xml file in test/config that
+	# turns POSTLINKER_SUPPORTS_WDP off
+	
+	t.id = "0093g"
+	t.name = "paging_paged_no_wdp"
+	t.command = cmd_prefix + "-p paged.mmp --configpath=test/config" + cmd_suffix
+	t.mustmatch_singleline = [
+			"--paged", 
+			"--compressionmethod=bytepair"
+			]
+	t.mustnotmatch = []
+	t.warnings = 0
+	t.targets = [ "$(EPOCROOT)/epoc32/release/armv5/urel/paged.dll" ]
+	t.run()
+	
+	t.id = "0093h"
+	t.name = "paging_unpaged_no_wdp"
+	t.command = cmd_prefix + "-p unpaged.mmp --configpath=test/config" + cmd_suffix
+	t.mustmatch_singleline = [
+			"--unpaged", 
+			]
+	t.mustnotmatch = [
+			"--compressionmethod=bytepair"	
+			]
+	t.targets = [ "$(EPOCROOT)/epoc32/release/armv5/urel/unpaged.dll" ]
+	t.run()
 
 	t.id = "0093"
 	t.name = "paging"
-	t.result = result
 	t.print_result()
 	return t
 
--- a/sbsv2/raptor/test/smoke_suite/plugin_armv5_winscw_freeze.py	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/plugin_armv5_winscw_freeze.py	Wed Apr 07 12:34:10 2010 +0100
@@ -24,7 +24,8 @@
 		the correct FREEZE behaviour in each case.  The correct behaviour for a PLUGIN/PLUGIN3 is
 		indicative of all TARGETTYPEs where the build system defines known exports: FREEZE should do nothing
 		unless an explicit DEFFILE statement is present in the .mmp file.
-		Also confirms default UID2 settings for PLUGIN3 TARGETTYPEs."""
+		Also confirms default UID2 settings for PLUGIN3 TARGETTYPEs and default resource generation locations
+		for both PLUGIN and PLUGIN3."""
 	t.usebash = True
 	
 	t.command = """
@@ -34,7 +35,13 @@
 
 	t.targets = [
 		"smoke_suite/test_resources/simple_plugin/bwins/plugin2u.def",
-		"smoke_suite/test_resources/simple_plugin/eabi/plugin2u.def"		
+		"smoke_suite/test_resources/simple_plugin/eabi/plugin2u.def",
+		"$(EPOCROOT)/epoc32/data/z/resource/plugins/plugin.rsc",
+		"$(EPOCROOT)/epoc32/release/winscw/udeb/z/resource/plugins/plugin.rsc",
+		"$(EPOCROOT)/epoc32/release/winscw/urel/z/resource/plugins/plugin.rsc",
+		"$(EPOCROOT)/epoc32/data/z/resource/plugins/plugin3.rsc",
+		"$(EPOCROOT)/epoc32/release/winscw/udeb/z/resource/plugins/plugin3.rsc",
+		"$(EPOCROOT)/epoc32/release/winscw/urel/z/resource/plugins/plugin3.rsc"	
 		]
 	
 	t.antitargets = [
--- a/sbsv2/raptor/test/smoke_suite/resource.py	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/resource.py	Wed Apr 07 12:34:10 2010 +0100
@@ -63,5 +63,7 @@
 		"helloworld_reg_exe/helloworld_reg__private_10003a3f_apps_sc.rpp",
 		"helloworld_reg_exe/helloworld_reg__private_10003a3f_apps_sc.rpp.d"])
 
+	t.mustnotmatch = ["HelloWorld.rss.* warning: trigraph"]
+	
 	t.run()
 	return t
--- a/sbsv2/raptor/test/smoke_suite/terminal_filter_tests.py	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/terminal_filter_tests.py	Wed Apr 07 12:34:10 2010 +0100
@@ -19,10 +19,10 @@
 def run():
 
 	t = SmokeTest()
-	t.id = "87"
-	t.name = "terminal_filter_tests"
-	t.description = "terminal_filter_tests: Tests the terminal filter against" \
-			+ " log files to ensure it 'does the right thing'"
+	t.description = "Tests against log files to ensure it 'does the right thing'"
+	
+	t.id = "87a"
+	t.name = "terminal_filter_tests_log"
 	t.command = "$(SBS_HOME)/test/smoke_suite/test_resources/refilter/testfilterterminal"
 	t.countmatch = [
 		# One of each type of error occurs early in the 'sbs' call where there
@@ -36,4 +36,19 @@
 	]
 	t.errors = 4
 	t.run()
+	
+	t.id = "87b"
+	t.name = "terminal_filter_tests_configs"
+	t.command = "sbs -b smoke_suite/test_resources/simple/bld.inf"
+	t.countmatch = []
+	t.errors = 0
+	t.mustmatch_singleline = ["built 'armv5_urel'",
+							  "built 'armv5_udeb'",
+							  "built 'winscw_urel'",
+							  "built 'winscw_udeb'" ]
+	t.run()
+	
+	t.id = "87"
+	t.name = "terminal_filter_tests"
+	t.print_result()
 	return t
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/test_resources/keepgoing/groups.xml	Wed Apr 07 12:34:10 2010 +0100
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<build xmlns="http://symbian.com/xml/build"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://symbian.com/xml/build build/2_0.xsd">
+
+  <!-- This group deliberately contains some non-existent products 
+  -->
+  <group name="lots_of_products">
+	<groupRef ref='armv5'/>
+	<groupRef ref='armv5' mod="qwertyuio"/>
+	<groupRef ref='armv5' mod="asdfghjkl"/>
+	<groupRef ref='armv5' mod="zxcvbnm_p"/>
+  </group>
+  
+  <!-- This group just contains the one above to check multiple levels
+  -->
+  <group name="lots_of_products_2">
+    <groupRef ref="lots_of_products"/>
+  </group>
+  
+</build>
--- a/sbsv2/raptor/test/smoke_suite/test_resources/simple_gui/HelloWorld.rss	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/test_resources/simple_gui/HelloWorld.rss	Wed Apr 07 12:34:10 2010 +0100
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 1997-2010 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of the License "Eclipse Public License v1.0"
@@ -66,6 +66,7 @@
 RESOURCE TBUF r_example_text_Item0 { buf="Item 0"; }
 RESOURCE TBUF r_example_text_Item1 { buf="Item 1"; }
 RESOURCE TBUF r_example_text_Item2 { buf="Item 2"; }
+RESOURCE TBUF r_example_text_Item3 { buf="This string generates a trigraph warning if not suppressed: <h>ID3?????????<m>"; }
 
 RESOURCE LOCALISABLE_APP_INFO r_lai
 	{
--- a/sbsv2/raptor/test/smoke_suite/test_resources/simple_paging/bld.inf	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/test_resources/simple_paging/bld.inf	Wed Apr 07 12:34:10 2010 +0100
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of the License "Eclipse Public License v1.0"
@@ -18,14 +18,17 @@
 
 PRJ_PLATFORMS
 
-    ARMV5
+ARMV5
 
 PRJ_MMPFILES
 
-    default.mmp
-    unpaged.mmp
-    paged.mmp
+default.mmp
+unpaged.mmp
+paged.mmp
 
-    unpagedcode_pageddata.mmp
-    pagedcode_unpageddata.mmp
-    pagedcode_defaultdata.mmp
+unpagedcode_pageddata.mmp
+pagedcode_unpageddata.mmp
+pagedcode_defaultdata.mmp
+
+paged_unpaged.mmp
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/test_resources/simple_paging/paged_unpaged.mmp	Wed Apr 07 12:34:10 2010 +0100
@@ -0,0 +1,34 @@
+/*
+* Copyright (c) 2000-2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+* In this example "bytepaircompresstarget" should not by implied as 
+* keyword "unpaged" cancels "paged". 
+*/
+
+
+TARGET          paged_unpaged.dll
+TARGETTYPE      dll
+
+UID             0xE800004C
+CAPABILITY      All -TCB
+
+VENDORID        0x70000001
+
+SOURCE          a.cpp
+
+LIBRARY         euser.lib
+
+PAGED
+UNPAGED
+
--- a/sbsv2/raptor/test/smoke_suite/test_resources/simple_plugin/plugin.mmp	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/test_resources/simple_plugin/plugin.mmp	Wed Apr 07 12:34:10 2010 +0100
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of the License "Eclipse Public License v1.0"
@@ -26,5 +26,9 @@
 SOURCEPATH		.
 SOURCE			plugin.cpp
 SYSTEMINCLUDE 	/epoc32/include
-SYSTEMINCLUDE 	/epoc32/include/ecom 
+SYSTEMINCLUDE 	/epoc32/include/ecom
+SYSTEMINCLUDE	/epoc32/include/techview
 LIBRARY			euser.lib apmime.lib efsrv.lib
+
+START RESOURCE	plugin.rss
+END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/test_resources/simple_plugin/plugin.rss	Wed Apr 07 12:34:10 2010 +0100
@@ -0,0 +1,28 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+* Dummy ECOM resource file
+*
+*/
+
+NAME PLUG
+
+#include <eikon.rh>
+#include <eikcore.rsg>
+#include <appinfo.rh>
+
+RESOURCE RSS_SIGNATURE { }
+
+RESOURCE TBUF { buf=""; }
+RESOURCE TBUF r_example_text_plug { buf="plug"; }
--- a/sbsv2/raptor/test/smoke_suite/test_resources/simple_plugin/plugin3.mmp	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/test_resources/simple_plugin/plugin3.mmp	Wed Apr 07 12:34:10 2010 +0100
@@ -12,7 +12,7 @@
 * Contributors:
 *
 * Description: 
-* Example ECOMP plugin3 component, with no UID listed
+* Example ECOM plugin3 component, with no UID listed
 *
 */
 
@@ -24,6 +24,10 @@
 VENDORID		0x70000001
 SOURCEPATH		.
 SOURCE			plugin.cpp
-SYSTEMINCLUDE 	/epoc32/include
-SYSTEMINCLUDE 	/epoc32/include/ecom 
+SYSTEMINCLUDE	/epoc32/include
+SYSTEMINCLUDE	/epoc32/include/ecom
+SYSTEMINCLUDE	/epoc32/include/techview
 LIBRARY			euser.lib apmime.lib efsrv.lib
+
+START RESOURCE	plugin3.rss
+END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/test_resources/simple_plugin/plugin3.rss	Wed Apr 07 12:34:10 2010 +0100
@@ -0,0 +1,28 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+* Dummy ECOM resource file
+*
+*/
+
+NAME PLG3
+
+#include <eikon.rh>
+#include <eikcore.rsg>
+#include <appinfo.rh>
+
+RESOURCE RSS_SIGNATURE { }
+
+RESOURCE TBUF { buf=""; }
+RESOURCE TBUF r_example_text_plug3 { buf="plug3"; }
--- a/sbsv2/raptor/test/smoke_suite/timeout.py	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/timeout.py	Wed Apr 07 12:34:10 2010 +0100
@@ -26,10 +26,10 @@
 	t.id = "60a"
 	t.name = "timeout"
 	t.usebash = True
-	t.command = "sbs -b smoke_suite/test_resources/timeout/bld.inf -f-"
+	t.command = "sbs -b smoke_suite/test_resources/timeout/bld.inf -f -"
 
-	t.mustmatch = [
-		"status exit='failed' code='" + exitCode + "' attempt='1' *reason='timeout'",
+	t.mustmatch_singleline = [
+		"status exit='failed' code='" + exitCode + "' attempt='1' reason='timeout'",
 	]
 	t.errors = -1
 	t.returncode = 1
@@ -38,12 +38,12 @@
 	t.id = "60b"
 	t.name = "timeout with retries"
 	t.usebash = True
-	t.command = "sbs -b smoke_suite/test_resources/timeout/bld.inf -t 3 -f-"
+	t.command = "sbs -b smoke_suite/test_resources/timeout/bld.inf -t 3 -f -"
 
-	t.mustmatch = [
-		"status exit='retry' code='" + exitCode + "' attempt='1' *reason='timeout'",
-		"status exit='retry' code='" + exitCode + "' attempt='2' *reason='timeout'",
-		"status exit='failed' code='" + exitCode + "' attempt='3' *reason='timeout'",
+	t.mustmatch_singleline = [
+		"status exit='retry' code='" + exitCode + "' attempt='1' reason='timeout'",
+		"status exit='retry' code='" + exitCode + "' attempt='2' reason='timeout'",
+		"status exit='failed' code='" + exitCode + "' attempt='3' reason='timeout'",
 	]
 	t.errors = -1
 	t.returncode = 1
--- a/sbsv2/raptor/test/smoke_suite/tools.py	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/tools.py	Wed Apr 07 12:34:10 2010 +0100
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
 # All rights reserved.
 # This component and the accompanying materials are made available
 # under the terms of the License "Eclipse Public License v1.0"
@@ -20,19 +20,15 @@
 	t = SmokeTest()
 	t.id = "52"
 	t.name = "tools"
-	# Do not run with j > 1 because of known issues
-	t.command = "sbs -b smoke_suite/test_resources/tools/bld.inf -c tools -j1"
+	t.command = "sbs -b smoke_suite/test_resources/tools/bld.inf -c tools"
 	t.targets = [
 		"$(EPOCROOT)/epoc32/release/tools/deb/tool_exe.bsc",
 		"$(EPOCROOT)/epoc32/release/tools/deb/tool_exe.exe",
 		"$(EPOCROOT)/epoc32/release/tools/deb/tool_exe.ilk",
-		"$(EPOCROOT)/epoc32/release/tools/deb/tool_exe.pdb",
 		"$(EPOCROOT)/epoc32/release/tools/deb/tool_lib1.bsc",
 		"$(EPOCROOT)/epoc32/release/tools/deb/tool_lib1.lib",
-		"$(EPOCROOT)/epoc32/release/tools/deb/tool_lib1.pdb",
 		"$(EPOCROOT)/epoc32/release/tools/deb/tool_lib2.bsc",
 		"$(EPOCROOT)/epoc32/release/tools/deb/tool_lib2.lib",
-		"$(EPOCROOT)/epoc32/release/tools/deb/tool_lib2.pdb",
 		"$(EPOCROOT)/epoc32/release/tools/rel/tool_exe.exe",
 		"$(EPOCROOT)/epoc32/release/tools/rel/tool_lib1.lib",
 		"$(EPOCROOT)/epoc32/release/tools/rel/tool_lib2.lib",
--- a/sbsv2/raptor/test/unit_suite/generic_path_unit.py	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/test/unit_suite/generic_path_unit.py	Wed Apr 07 12:34:10 2010 +0100
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
 # All rights reserved.
 # This component and the accompanying materials are made available
 # under the terms of the License "Eclipse Public License v1.0"
@@ -136,6 +136,21 @@
 		path6 = generic_path.Path("m:/")
 		self.assertEqual(str(path6), "m:")
 		
+		# SpaceSafePath
+		
+		epocroot = os.path.abspath(os.environ.get('EPOCROOT')).replace('\\','/').rstrip('/')
+		pathwithspaces = epocroot+"/epoc32/build/Program Files/Some tool installed with spaces/no_spaces/s p c/no_more_spaces"
+		path7 = generic_path.Path(pathwithspaces)
+
+		# SpaceSafe paths on Windows are 8.3 format, and these can only be deduced if they actually exist.	
+		os.makedirs(pathwithspaces)
+		spacesafe = path7.GetSpaceSafePath()
+		self.assertTrue(spacesafe.endswith("PROGRA~1/SOMETO~1/NO_SPA~1/SPC~1/NO_MOR~1"))
+		
+		os.removedirs(pathwithspaces)
+		spacesafe = path7.GetSpaceSafePath()		
+		self.assertEqual(spacesafe, None)
+
 		
 	def testClassLinux(self):
 		if self.isWin32():
@@ -173,6 +188,15 @@
 		path = generic_path.Path("some/thing/")
 		self.assertEqual(str(path), "some/thing")
 		
+		# SpaceSafePath
+		
+		# This doesn't mean much on non-Windows platforms, but we confirm nothing breaks if it is used
+		pathwithspaces = "/Program Files/Some tool installed with spaces/no_spaces/s p c/no_more_spaces"
+		path2 = generic_path.Path(pathwithspaces)
+	
+		spacesafe = path2.GetSpaceSafePath()		
+		self.assertEqual(spacesafe, None)
+		
  
 # run all the tests
 
--- a/sbsv2/raptor/test/unit_suite/raptor_data_unit.py	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/test/unit_suite/raptor_data_unit.py	Wed Apr 07 12:34:10 2010 +0100
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+# Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
 # All rights reserved.
 # This component and the accompanying materials are made available
 # under the terms of the License "Eclipse Public License v1.0"
@@ -21,6 +21,7 @@
 import raptor
 import raptor_cache
 import raptor_data
+import sys
 import unittest
 
 class TestRaptorData(unittest.TestCase):
@@ -35,6 +36,8 @@
 			self.envStack[name] = os.environ[name]
 		os.environ[name] = value
 		
+	def isWin(self):
+		return 'win' in raptor.hostplatform
 			
 	def RestoreEnv(self, name):
 		# put environment back to its state before SetEnv
@@ -355,7 +358,9 @@
 		self.assertEqual(varcfg, "/C/variant/variant.cfg")
 		
 	def testProblematicEnvironment(self):
-		# ask for environment variable values that will break makefile parsing due to
+		aRaptor = raptor.Raptor()		
+		
+		# 1: ask for environment variable values that will break makefile parsing due to
 		# backslashes forming line continuation characters
 		self.SetEnv("ENVVAR_BSLASH_END1", "C:\\test1a\\;C:\\test1b\\")
 		self.SetEnv("ENVVAR_BSLASH_END2", "C:\\test2a\\;C:\\test2b\\\\")
@@ -365,7 +370,6 @@
 		var.AddOperation(raptor_data.Env("ENVVAR_BSLASH_END2"))
 		var.AddOperation(raptor_data.Env("ENVVAR_BSLASH_END3"))
 
-		aRaptor = raptor.Raptor()
 		eval = aRaptor.GetEvaluator(None, var.GenerateBuildUnits(aRaptor.cache)[0])
 		self.RestoreEnv("ENVVAR_BSLASH_END1")
 		self.RestoreEnv("ENVVAR_BSLASH_END2")
@@ -379,6 +383,75 @@
 		
 		value = eval.Get("ENVVAR_BSLASH_END3")
 		self.assertEqual(value, "C:\\test3a\\;C:\\test3b\\\\\\\\")
+		
+		# 2: check 'tool' and 'toolchain' type environment variable values for correct behaviour when paths contain spaces
+		# this is different depending on host OS platform and whether or not the paths/tools actually exist
+		epocroot = os.path.abspath(os.environ.get('EPOCROOT')).replace('\\','/').rstrip('/')
+		pathwithspaces = epocroot+"/epoc32/build/Program Files/Some tool installed with spaces/no_spaces/s p c/no_more_spaces"
+		toolwithspaces = pathwithspaces+"/testtool.exe"	
+		self.SetEnv("ENVVAR_TOOL_WITH_SPACES", toolwithspaces)
+		self.SetEnv("ENVVAR_TOOLCHAINPATH_WITH_SPACES", pathwithspaces)
+		toolVar = raptor_data.Variant("tool.var")
+		toolchainpathVar = raptor_data.Variant("toolchainpath.var")
+		toolVar.AddOperation(raptor_data.Env("ENVVAR_TOOL_WITH_SPACES", "", "tool"))
+		toolchainpathVar.AddOperation(raptor_data.Env("ENVVAR_TOOLCHAINPATH_WITH_SPACES", "", "toolchainpath"))
+		invalidValueException = "the environment variable %s is incorrect - it is a '%s' type but contains spaces that cannot be neutralised:"
+		
+		# 2a: paths/tools exist - on Windows we expect 8.3 paths post-evaluation, on all other platforms error exceptions
+		os.makedirs(pathwithspaces)
+		testtool = open(toolwithspaces,'wb')
+		testtool.close()
+		
+		exceptionText = ""
+		value = ""
+		try:
+			eval = aRaptor.GetEvaluator(None, toolVar.GenerateBuildUnits(aRaptor.cache)[0])
+			value = eval.Get("ENVVAR_TOOL_WITH_SPACES")
+		except Exception, e:
+			exceptionText = str(e)
+			
+		if self.isWin():
+			self.assertTrue(value)
+			self.assertFalse(' ' in value)
+		else:
+			self.assertTrue(exceptionText.startswith(invalidValueException % ("ENVVAR_TOOL_WITH_SPACES", "tool")))
+
+		exceptionText = ""
+		value = ""
+		try:
+			eval = aRaptor.GetEvaluator(None, toolchainpathVar.GenerateBuildUnits(aRaptor.cache)[0])
+			value = eval.Get("ENVVAR_TOOLCHAINPATH_WITH_SPACES")
+		except Exception, e:
+			exceptionText = str(e)
+			
+		if self.isWin():
+			self.assertTrue(value)
+			self.assertFalse(' ' in value)
+		else:
+			self.assertTrue(exceptionText.startswith(invalidValueException % ("ENVVAR_TOOLCHAINPATH_WITH_SPACES", "toolchainpath")))
+		
+		# 2b: paths/tools don't exist - should throw error exceptions on all platforms as 8.3 paths are only available
+		# for use if a path/tool exists
+		os.remove(toolwithspaces)
+		os.removedirs(pathwithspaces)
+
+		exceptionText = ""
+		try:
+			eval = aRaptor.GetEvaluator(None, toolVar.GenerateBuildUnits(aRaptor.cache)[0])
+		except Exception, e:
+			exceptionText = str(e)
+		self.assertTrue(exceptionText.startswith(invalidValueException % ("ENVVAR_TOOL_WITH_SPACES", "tool")))
+
+		exceptionText = ""
+		try:
+			eval = aRaptor.GetEvaluator(None, toolchainpathVar.GenerateBuildUnits(aRaptor.cache)[0])
+		except Exception, e:
+			exceptionText = str(e)			
+		self.assertTrue(exceptionText.startswith(invalidValueException % ("ENVVAR_TOOLCHAINPATH_WITH_SPACES", "toolchainpath")))
+
+		# clean-up
+		self.RestoreEnv("ENVVAR_TOOL_WITH_SPACES")
+		self.RestoreEnv("ENVVAR_TOOLCHAINPATH_WITH_SPACES")
 	
 	def testMissingEnvironment(self):
 		# ask for an environment variable that is not set
@@ -430,8 +503,105 @@
 		self.failUnless(self.checkForParam(p, "D", None))
 		f = extended.GetFLMIncludePath(cache)
 		self.assertEqual(f.File(), "base.flm")
+
+	def testGetBuildUnits(self):
+		r = raptor.Raptor()
+
+		# <group name="g1">
+		g1 = raptor_data.Group("g1")
+		r.cache.AddGroup(g1)
+		
+		# <groupRef ref="g2" mod="A.B"/>
+		g2a = raptor_data.GroupRef()
+		g2a.SetProperty("ref", "g2")
+		g2a.SetProperty("mod", "A.B")
+		g1.AddChild(g2a)
+		
+		# <groupRef ref="g2" mod="C.D"/>
+		g2b = raptor_data.GroupRef()
+		g2b.SetProperty("ref", "g2")
+		g2b.SetProperty("mod", "C.D")
+		g1.AddChild(g2b)
+		
+		# <group name="g2">
+		g2 = raptor_data.Group("g2")
+		r.cache.AddGroup(g2)
+		
+		# <varRef ref="V" mod="E.F"/>
+		v2 = raptor_data.VariantRef()
+		v2.SetProperty("ref", "V")
+		v2.SetProperty("mod", "E.F")
+		g2.AddChild(v2)
+		
+		# <varRef ref="V" mod="G.H"/>
+		v3 = raptor_data.VariantRef()
+		v3.SetProperty("ref", "V")
+		v3.SetProperty("mod", "G.H")
+		g2.AddChild(v3)
+		
+		# <aliasRef ref="X" mod="I.J"/>
+		v4 = raptor_data.AliasRef()
+		v4.SetProperty("ref", "X")
+		v4.SetProperty("mod", "I.J")
+		g2.AddChild(v4)
+		
+		# <aliasRef ref="X" mod="K.L"/>
+		v5 = raptor_data.AliasRef()
+		v5.SetProperty("ref", "X")
+		v5.SetProperty("mod", "K.L")
+		g2.AddChild(v5)
+		
+		r.cache.AddVariant(raptor_data.Variant("A"))
+		r.cache.AddVariant(raptor_data.Variant("B"))
+		r.cache.AddVariant(raptor_data.Variant("C"))
+		r.cache.AddVariant(raptor_data.Variant("D"))
+		r.cache.AddVariant(raptor_data.Variant("E"))
+		r.cache.AddVariant(raptor_data.Variant("F"))
+		r.cache.AddVariant(raptor_data.Variant("G"))
+		r.cache.AddVariant(raptor_data.Variant("H"))
+		r.cache.AddVariant(raptor_data.Variant("I"))
+		r.cache.AddVariant(raptor_data.Variant("J"))
+		r.cache.AddVariant(raptor_data.Variant("K"))
+		r.cache.AddVariant(raptor_data.Variant("L"))
+		
+		r.cache.AddVariant(raptor_data.Variant("V"))
+		
+		# <alias name="X" meaning="A.B.C.D.E.F.G.H/>
+		alias = raptor_data.Alias("X")
+		alias.SetProperty("meaning", "A.B.C.D.E.F.G.H")
+		r.cache.AddAlias(alias)
+
+		r.cache.AddVariant(raptor_data.Variant("Y"))
+		r.cache.AddVariant(raptor_data.Variant("Z"))
 	
-	
+		units = raptor_data.GetBuildUnits(["g1.Y", "g1.Z"], r.cache, r)
+		
+		# <group name="g1">
+		#   <groupRef ref="g2" mod="A.B"/>    g2.A.B
+		#   <groupRef ref="g2" mod="C.D"/>    g2.C.D
+		# </group>
+		# <group name="g2">
+		#   <varRef ref="V" mod="E.F"/>       V.E.F
+		#   <varRef ref="V" mod="G.H"/>       V.G.H
+		#   <aliasRef ref="X" mod="I.J"/>     X.I.J
+		#   <aliasRef ref="X" mod="K.L"/>     X.K.L
+		# </group>
+		# <alias name="X" meaning="A.B.C.D.E.F.G.H/>
+		#
+		expected = [ "VEFABY", "VGHABY", "ABCDEFGHIJABY", "ABCDEFGHKLABY",
+				     "VEFCDY", "VGHCDY", "ABCDEFGHIJCDY", "ABCDEFGHKLCDY",
+		             "VEFABZ", "VGHABZ", "ABCDEFGHIJABZ", "ABCDEFGHKLABZ",
+				     "VEFCDZ", "VGHCDZ", "ABCDEFGHIJCDZ", "ABCDEFGHKLCDZ" ]
+		
+		self.failUnlessEqual(len(units), len(expected))
+		
+		for u in units:
+			vars = "".join([v.name for v in u.variants])
+			self.failUnless(vars in expected, vars + " was not expected")
+			expected.remove(vars)
+		
+		self.failUnless(len(expected) == 0, str(expected) + " not found")
+		
 # run all the tests
 
 from raptor_tests import SmokeTest
--- a/sbsv2/raptor/util/install-windows/raptorinstallerscript.nsi	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/util/install-windows/raptorinstallerscript.nsi	Wed Apr 07 12:34:10 2010 +0100
@@ -78,8 +78,7 @@
 
 ##################### Pages in the installer #####################
 !insertmacro MUI_PAGE_WELCOME
-# Temporarily useing RELEASE-NOTES.txt as there is not license.txt
-!insertmacro MUI_PAGE_LICENSE ${RAPTOR_LOCATION}\RELEASE-NOTES.txt
+!insertmacro MUI_PAGE_LICENSE ${RAPTOR_LOCATION}\license.txt
 !define MUI_PAGE_HEADER_TEXT "Installation type"
 Page custom UserOrSysInstall UserOrSysInstallLeave
 !define MUI_PAGE_CUSTOMFUNCTION_LEAVE DirLeave # Directory page exit function - disallow spaces in $INSTDIR
@@ -123,7 +122,9 @@
     File /r /x distribution.policy.s60 /x .hg ${PYTHON_LOCATION}\*.*
     
     SetOutPath "$INSTDIR"
-    File ${RAPTOR_LOCATION}\RELEASE-NOTES.txt
+    File ${RAPTOR_LOCATION}\RELEASE-NOTES.html
+    SetOutPath "$INSTDIR\notes"
+    File /r /x distribution.policy.s60 ${RAPTOR_LOCATION}\notes\*.*
     
     
     ${Unless} $INSTALL_TYPE == "NO_ENV"
@@ -187,6 +188,7 @@
 	
 	# Generate batch file to set environment variables for Raptor
 	StrCpy $RESULT "@REM Environment variables for ${INSTALLER_NAME}$\r$\nset SBS_HOME=$INSTDIR$\r$\nset PATH=%SBS_HOME%\bin;%PATH%$\r$\n"
+	SetOutPath "$INSTDIR"
 	!insertmacro WriteFile "RaptorEnv.bat" "$RESULT"
 SectionEnd
 
@@ -333,7 +335,8 @@
     RmDir /r $INSTDIR\python
     RmDir /r $INSTDIR\schema
     RmDir /r $INSTDIR\win32
-    Delete $INSTDIR\RELEASE-NOTES.txt
+    Delete $INSTDIR\RELEASE-NOTES.html
+    RmDir /r $INSTDIR\notes
     Delete $INSTDIR\RaptorEnv.bat
     Delete $INSTDIR\${UNINSTALLER_FILENAME}
     
--- a/sbsv2/raptor/util/talon/talon.c	Tue Apr 06 11:42:16 2010 +0100
+++ b/sbsv2/raptor/util/talon/talon.c	Wed Apr 07 12:34:10 2010 +0100
@@ -586,7 +586,7 @@
 
 				if (p->returncode != 0)
 				{
-					char *exitstr = force_success ? "failed" : retries > 0 ? "retry" : "failed";
+					char *exitstr = (force_success || retries <= 0) ? "failed" : "retry";
 					snprintf(status, STATUS_STRMAX - 1, "\n<status exit='%s' code='%d' attempt='%d'%s%s />", exitstr, p->returncode, attempt, flagsstr, reasonstr );
 				} else {
 					snprintf(status, STATUS_STRMAX - 1, "\n<status exit='ok' attempt='%d'%s%s />", attempt, flagsstr, reasonstr );