Merge tcom speedup fix
authortimothy.murphy@nokia.com
Tue, 18 May 2010 17:26:08 +0100
branchfix
changeset 565 8f040b989279
parent 560 245c03ee6e9c (diff)
parent 564 ee6b33f2ef0e (current diff)
child 566 d242e2b48221
Merge tcom speedup
--- a/.hgtags	Tue May 18 17:23:01 2010 +0100
+++ b/.hgtags	Tue May 18 17:26:08 2010 +0100
@@ -7,3 +7,10 @@
 7006bcce52990f33d0c20c51bebc2b58ed36db60 stable
 7006bcce52990f33d0c20c51bebc2b58ed36db60 stable
 679d97112f986e16e9dbed3f7a016388d42e04f8 stable
+679d97112f986e16e9dbed3f7a016388d42e04f8 2.13.0
+7006bcce52990f33d0c20c51bebc2b58ed36db60 2.12.5
+976aca38ffe5ce30d7753ea77a8de44e5cbd0dc8 2.12.4
+4e477ddf2eed2b478793a7c7ff22320e5ee6ce21 2.12.1
+2bc875af320017a5952adb544e78306e7807865c 2.12.0
+007900c31eef0363e705cf15d131740d4eeb6208 2.12.3
+1e23e973ab856a45d9e3e2dcd9a72a9e466c03c7 2.12.2
--- a/bintools/elftools/group/elftran.mmp	Tue May 18 17:23:01 2010 +0100
+++ b/bintools/elftools/group/elftran.mmp	Tue May 18 17:26:08 2010 +0100
@@ -45,5 +45,5 @@
 source          byte_pair.cpp pagedCompress.cpp
 
 systeminclude   ../inc /epoc32/include ../../../imgtools/imglib/compress /epoc32/include/tools/
-
+OS_LAYER_SYSTEMINCLUDE
 VENDORID        0x70000001
--- a/bintools/evalid/EvalidCompare.pm	Tue May 18 17:23:01 2010 +0100
+++ b/bintools/evalid/EvalidCompare.pm	Tue May 18 17:26:08 2010 +0100
@@ -27,6 +27,29 @@
 use File::Path;
 use File::Basename;
 use File::Copy;
+use Config;
+
+# Search for tools with Raptor...
+sub FindTool($)
+{
+  my $tool = shift;
+  my $location = $tool;
+  if ($Config{osname} =~ m/MSWin32/i && $ENV{SBS_HOME} && -e $ENV{SBS_HOME}."/win32/mingw/bin/".$tool.".exe")
+  {
+    $location = $ENV{SBS_HOME}."/win32/mingw/bin/".$tool.".exe"; 
+  }
+  elsif(-e $ENV{EPOCROOT}."epoc32/gcc_mingw/bin/".$tool.".exe")
+  {
+    $location = $ENV{EPOCROOT}."epoc32/gcc_mingw/bin/".$tool.".exe";
+  }
+  elsif(-e $FindBin::Bin."/".$tool.".exe")
+  {
+    $location = $FindBin::Bin."/".$tool.".exe"; 
+  }
+  return $location;
+}
+
+
 
 #
 # Constants.
@@ -71,11 +94,11 @@
 # they also enabled an order of expandor arguments where the filename is not last
 my %typeHandler = (
       e32 => {reader => 'elf2e32 --dump --e32input=', filter => \&Elf2E32Filter},
-      arm => {reader => 'nm --no-sort', filter => \&NmFilter, retry => 1, relative_paths => 1},
+      arm => {reader => FindTool("nm").' --no-sort', filter => \&NmFilter, retry => 1, relative_paths => 1},
       elf => {reader => 'elfdump -i', filter => \&ElfDumpFilter, rawretry => 1},
-      intel => {reader => '%EPOCROOT%epoc32\gcc_mingw\bin\nm --no-sort', filter => \&NmFilter, rawretry => 1, relative_paths => 1, skipstderr => 1},
+      intel => {reader => FindTool("nm").' --no-sort', filter => \&NmFilter, rawretry => 1, relative_paths => 1, skipstderr => 1},
       intel_pe => {reader => 'pe_dump', filter => \&FilterNone, rawretry => 1},
-	  zip => {reader => '"'.$FindBin::Bin.'/unzip" -l -v', filter => \&UnzipFilter, rawretry => 1},
+	  zip => {reader => FindTool("unzip").' -l -v', filter => \&UnzipFilter, rawretry => 1},
       map => {filter => \&MapFilter, skipblanks => 1},
       sgml => {filter => \&SgmlFilter},
       preprocessed_text => {filter => \&PreprocessedTextFilter},
@@ -231,7 +254,7 @@
     }
   }
 
-  if ($typeBuf =~ /^!<arch>\x0A(.{48}([0-9 ]{10})\x60\x0A(......))/s) {
+  if ($typeBuf =~ /^!<arch>\x0A(.{48}([0-9 ]{9}).\x60\x0A(......))/s) {
     # library - could be MARM or WINS
 
     $typeBuf = $1;
@@ -240,7 +263,7 @@
     open (FILE, $file) or die "Error: Couldn't open \"$file\" for reading: $!\n";
     binmode (FILE);
     
-    while ($typeBuf =~ /^.{48}([0-9 ]{10})\x60\x0A(......)/s) {
+    while ($typeBuf =~ /^.{48}([0-9 ]{9}).\x60\x0A(......)/s) {
       # $1 is the size of the archive member, $2 is first 6 bytes of the file
       # There may be several different sorts of file in the archive, and we
       # need to scan through until we find a type we recognize:
--- a/e32tools/e32lib/group/seclib.mmp	Tue May 18 17:23:01 2010 +0100
+++ b/e32tools/e32lib/group/seclib.mmp	Tue May 18 17:26:08 2010 +0100
@@ -45,7 +45,7 @@
 userinclude     ../setcap 
 userinclude     ../../e32lib/e32image/inc
 systeminclude   /epoc32/include
-
+OS_LAYER_SYSTEMINCLUDE
 OPTION          GCC -w
 
 //macro __PLACEMENT_NEW_INLINE
--- a/e32tools/elf2e32/group/elf2e32.mmp	Tue May 18 17:23:01 2010 +0100
+++ b/e32tools/elf2e32/group/elf2e32.mmp	Tue May 18 17:26:08 2010 +0100
@@ -27,6 +27,7 @@
 source	 	pl_elfrelocation.cpp  pl_elfrelocations.cpp  pl_symbol.cpp  polydll_fb_target.cpp  polydll_rebuild_target.cpp  usecasebase.cpp 
 source	 	byte_pair.cpp  pagedcompress.cpp checksum.cpp stdexe_target.cpp
 
+OS_LAYER_SYSTEMINCLUDE
 systeminclude    /epoc32/include  /epoc32/include/tools  
 userinclude		../source ../include
 
--- a/imgtools/imaker/src/imaker.pm	Tue May 18 17:23:01 2010 +0100
+++ b/imgtools/imaker/src/imaker.pm	Tue May 18 17:26:08 2010 +0100
@@ -351,7 +351,7 @@
 {
     (my $dir = shift()) =~ s/^>>?(?!>)//;
     my $absdir = "";
-    eval { local $SIG{__DIE__}; $absdir = Cwd::abs_path($dir) };
+    if (-e $dir) {$absdir = Cwd::abs_path($dir) };
     return(PathConv($absdir || File::Spec->rel2abs($dir,
         $dir !~ /^$gWorkdrive/i && $dir =~ /^([a-z]:)/i ? "$1/" : ""), shift(), shift()));
 }
--- a/sbsv2/raptor/RELEASE-NOTES.html	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/RELEASE-NOTES.html	Tue May 18 17:26:08 2010 +0100
@@ -8,9 +8,21 @@
 
 <h2>next version</h2>
 
+<h3>Defect Fixes</h3>
+<ul>
+<li><a href="http://developer.symbian.org/bugs/show_bug.cgi?id=2561"> SF Bug 2561 </a> - [Raptor] creates incorrect .iby files w.r.t target file versions &amp; ramtargets</li>
+</ul>
+
+<h2>version 2.14.0</h2>
+
 <h3>New Features</h3>
 <ul>
 <li><a href="notes/tcomsupport.txt">           Support new Trace Compiler commandline interface, autogen header location   </a></li>
+<li><a href="notes/parametric_log_filters.txt">   Pass parameters to log filters from the command line </a></li>
+<li><a href="notes/delete_on_failed_compile.txt"> Work-around for failed RVCT 2.2 compiles             </a></li>
+<li><a href="notes/query_cli.txt">                Obtain configuration data using --query option       </a></li>
+<li>                                              Carbide.xml now contains *_gcce aliases                  </li>
+<li><a href="notes/abiv1_implibs.txt">            ABIv1 import libraries not generated by default      </a></li>
 </ul>
 
 <h3>Defect Fixes</h3>
--- a/sbsv2/raptor/bin/sbs_filter.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/bin/sbs_filter.py	Tue May 18 17:26:08 2010 +0100
@@ -1,6 +1,6 @@
 #!/usr/bin/python
 
-# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# 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 "Symbian Foundation License v1.0"
@@ -58,7 +58,7 @@
 	raptor_params = raptor.BuildStats(the_raptor)
 
 	# Open the requested plugins using the pluginbox
-	the_raptor.out.open(raptor_params, the_raptor.filterList.split(','), pbox)
+	the_raptor.out.open(raptor_params, the_raptor.filterList, pbox)
 	
 except Exception, e:
 	sys.stderr.write("error: problem while creating filters %s\n" % str(e))
--- a/sbsv2/raptor/examples/os_properties.xml	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/examples/os_properties.xml	Tue May 18 17:26:08 2010 +0100
@@ -18,6 +18,7 @@
 		<set name='POSTLINKER_SUPPORTS_WDP' value=''/>
 		<set name='SUPPORTS_STDCPP_NEWLIB' value=''/>
 		<set name='RVCT_PRE_INCLUDE' value='$(EPOCINCLUDE)/rvct2_2/rvct2_2.h'/>
+		<set name="SUPPORTS_ABIV1_IMPLIBS" value='1'/>
 	</var>
 	
 </build>
--- a/sbsv2/raptor/lib/config/arm.xml	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/lib/config/arm.xml	Tue May 18 17:26:08 2010 +0100
@@ -79,7 +79,6 @@
 		<set name="LINKER_ARCH_OPTION" value="$(LD.ARMV5)"/>
 		<set name="COMPILER_FPU_DEFAULT" value="$(CC.SOFTVFP_MAYBE_VFPV2)"/>
 		<set name="POSTLINKER_FPU_DEFAULT" value="$(PL.SOFTVFP_MAYBE_VFPV2)"/>
-		<set name="GENERATE_ABIV1_IMPLIBS" value="$(SUPPORTS_ABIV1_IMPLIBS)"/>
 	</var>
 	<var name="v6">
 		<set name="TRADITIONAL_PLATFORM" value="ARMV6"/>
@@ -92,6 +91,7 @@
 		<set name="STATIC_RUNTIME_DIR" value="$(EPOCROOT)/epoc32/release/armv5/$(VARIANTTYPE)"/>
 		<set name="COMPILER_FPU_DEFAULT" value="$(CC.SOFTVFP_MAYBE_VFPV2)"/>
 		<set name="POSTLINKER_FPU_DEFAULT" value="$(PL.SOFTVFP_MAYBE_VFPV2)"/>
+		<set name="SUPPORTS_ABIV1_IMPLIBS" value=""/>
 	</var>
 	<var name="v7">
 		<set name="TRADITIONAL_PLATFORM" value="ARMV7"/>
@@ -103,6 +103,7 @@
 		<set name="LINKER_ARCH_OPTION" value="$(LD.ARMV7)"/>
 		<set name="COMPILER_FPU_DEFAULT" value="$(CC.SOFTVFP_MAYBE_VFPV3)"/>
 		<set name="POSTLINKER_FPU_DEFAULT" value="$(PL.SOFTVFP_MAYBE_VFPV3)"/>
+		<set name="SUPPORTS_ABIV1_IMPLIBS" value=""/>
 	</var>
 	<var name="9e" extends="v5">
 		<set name="VARIANTPLATFORM" value="arm9e"/>
--- a/sbsv2/raptor/lib/config/carbide.xml	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/lib/config/carbide.xml	Tue May 18 17:26:08 2010 +0100
@@ -27,6 +27,22 @@
 			<config name="armv9e_urel"/>
 			<config name="armv9e_udeb"/>
 		</config>
+		<config name="armv5_gcce" abstract="true">
+			<config name="armv5_urel_gcce"/>
+			<config name="armv5_udeb_gcce"/>
+		</config>
+		<config name="armv6_gcce" abstract="true">
+			<config name="armv6_urel_gcce"/>
+			<config name="armv6_udeb_gcce"/>
+		</config>
+		<config name="armv7_gcce" abstract="true">
+			<config name="armv7_urel_gcce"/>
+			<config name="armv7_udeb_gcce"/>
+		</config>
+		<config name="armv9e_gcce" abstract="true">
+			<config name="armv9e_urel_gcce"/>
+			<config name="armv9e_udeb_gcce"/>
+		</config>
 	</config>
 
 	<config name="winscw" abstract="true">
--- a/sbsv2/raptor/lib/config/gcc.xml	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/lib/config/gcc.xml	Tue May 18 17:26:08 2010 +0100
@@ -74,10 +74,11 @@
 		<set name='BLDINF_OUTPUTPATH' value='$(SBS_BUILD_DIR)'/>
 
 		<set name='OUTPUTPATH' value='$(SBS_BUILD_DIR)'/>
-		<set name='RELEASEPATH' value='$(EPOCROOT)/epoc32/release/tools2$$(TOOLPLATFORMDIR)'/>
+		<set name='RELEASEPATH' value='$(EPOCROOT)/epoc32/release/tools2' host='win.*'/>
+		<set name='RELEASEPATH' value='$(EPOCROOT)/epoc32/release/tools2/$(HOSTPLATFORM_DIR)' host='lin.*'/>
 	</var>
 
-	<var name="tools2_deb" extends="tools2_base">
+	<var name="t_deb">
 		<set name='TOOLSPATH' value=''/> <!-- do not install -->
 		<set name='VARIANTTYPE' value='deb'/>
 
@@ -85,8 +86,9 @@
 		<append name='CDEFS' value='_DEBUG'/>
 		<append name='RELEASEPATH' value='/deb' separator=''/>
 	</var>
-
-	<var name="tools2_rel" extends="tools2_base">
+	<alias name="tools2_deb" meaning="tools2_base.t_deb"/>
+	
+	<var name="t_rel">
 		<set name='TOOLSPATH' value='$(EPOCTOOLS)'/> <!-- install -->
 		<set name='VARIANTTYPE' value='rel'/>
 
@@ -94,10 +96,11 @@
 		<append name='CDEFS' value='NDEBUG'/>
 		<append name='RELEASEPATH' value='/rel' separator=''/>
 	</var>
-
+	<alias name="tools2_rel" meaning="tools2_base.t_rel"/>
+	
 	<group name="tools2">
-		<varRef ref='tools2_rel'/>
-		<varRef ref='tools2_deb'/>
+		<aliasRef ref='tools2_rel'/>
+		<aliasRef ref='tools2_deb'/>
 	</group>
 
 </build>
--- a/sbsv2/raptor/lib/config/make.xml	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/lib/config/make.xml	Tue May 18 17:26:08 2010 +0100
@@ -13,6 +13,9 @@
 		<set name='TALON_TIMEOUT' value='600000'/>
 		<set name='TALON_DESCRAMBLE' value='1'/>
 		
+		<!-- Work around for RVCT compile failures -->
+		<set name='DELETE_ON_FAILED_COMPILE' value='1'/>
+		
 		<!-- Command-line for initialisation -->
 		<set name="initialise" value=""/>
 
@@ -52,7 +55,7 @@
 		<set name="copylogfromannofile" value="false"/>
 	</var>
 	
-	<alias name="make" meaning="make_engine"/>
+	<alias name="make" meaning="make_engine" type="engine"/>
 
 	<!-- use the talon shell -->
 	<var name="make_no_talon_engine" extends="make_engine">
@@ -60,7 +63,7 @@
 	        <set name='USE_TALON' value=''/>
 	</var>
 
-	<alias name="make_no_talon" meaning="make_no_talon_engine"/>
+	<alias name="make_no_talon" meaning="make_no_talon_engine" type="engine"/>
 
 	<!-- other derived versions of GNU make -->
 
@@ -70,12 +73,13 @@
 		<set name="build" value="$(EMAKE) HAVE_ORDERONLY= -r"/>
 		<set name="scrambled" value="false"/>
 		<set name='TALON_DESCRAMBLE' value=''/>
+		<set name='DELETE_ON_FAILED_COMPILE' value=''/>
 
 		<!-- workaround for damaged log output from emake -->
 		<set name="copylogfromannofile" value="true"/>
 	</var>
 
-	<alias name="emake" meaning="emake_engine"/>
+	<alias name="emake" meaning="emake_engine" type="engine"/>
 	
 	<!-- use the talon shell -->
 	<var name="emake_no_talon_engine" extends="emake_engine">
@@ -83,7 +87,7 @@
 	        <set name='USE_TALON' value=''/>
 	</var>
 
-	<alias name="emake_no_talon" meaning="emake_no_talon_engine"/>
+	<alias name="emake_no_talon" meaning="emake_no_talon_engine" type="engine"/>
 	
 	<!-- Raptor make engine for PVMgmake -->
 	<var name="pvmgmake_engine" extends="make_engine">
@@ -91,8 +95,9 @@
 		<set name="build" value="$(PVMGMAKE) HAVE_ORDERONLY=true  -r"/>
 		<set name="scrambled" value="false" />
 		<set name='TALON_DESCRAMBLE' value=''/>
+		<set name='DELETE_ON_FAILED_COMPILE' value=''/>
 	</var>
 
-	<alias name="pvmgmake" meaning="pvmgmake_engine"/>
+	<alias name="pvmgmake" meaning="pvmgmake_engine" type="engine"/>
 
 </build>
--- a/sbsv2/raptor/lib/config/root.xml	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/lib/config/root.xml	Tue May 18 17:26:08 2010 +0100
@@ -45,6 +45,7 @@
 		<set name='POSTLINKER_SUPPORTS_WDP' value='1'/>
 		<set name='SUPPORTS_STDCPP_NEWLIB' value='1'/>
 		<set name="RVCT_PRE_INCLUDE" value="$(EPOCINCLUDE)/rvct/rvct.h"/>
+		<set name="SUPPORTS_ABIV1_IMPLIBS" value=''/>
 	</var>
 	
 	<!-- Placeholder for the root.changes variant. This will typically be
--- a/sbsv2/raptor/lib/config/rvct.xml	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/lib/config/rvct.xml	Tue May 18 17:26:08 2010 +0100
@@ -87,8 +87,7 @@
 		<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="STDLIB_OPTION" value="--no_scanlib"/>	
 		<set name="SYMBIAN_LD_MESSAGE_OPTION" value="$(LD_WARNINGS_CONTROL_OPTION) $(LD_ERRORS_CONTROL_OPTION)"/>
 		<set name="SYMVER_OPTION" value="--symver_soname"/>
 		<set name="TARGET_RELOCATION_OPTION" value=""/>
@@ -101,6 +100,7 @@
 		<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"/>
--- a/sbsv2/raptor/lib/config/variants.xml	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/lib/config/variants.xml	Tue May 18 17:26:08 2010 +0100
@@ -82,7 +82,7 @@
 		<!-- PLATMACROS.LINUX is set from PLATMACROS.WINDOWS -->
 		<append name="TRADITIONAL_PLATFORM" value='SMP' separator="" />
 		<append name="VARIANTPLATFORM" value="smp" separator=""/>
-		<set name="GENERATE_ABIV1_IMPLIBS" value=""/>
+		<set name="SUPPORTS_ABIV1_IMPLIBS" value=""/>
 	</var>
 
 	<!-- emit formatted releasable information into the logs for post-build parsing -->
@@ -142,6 +142,7 @@
 		<set name="PL.SOFTVFP_MAYBE_VFPV2" value="softvfp"/>
 		<set name="CC.ARMV5" value="--cpu 5T"/>
 		<set name="CC.ARMV6" value="--cpu 6"/>
+		<set name="USE_RVCT22_DELETE_WORKAROUND" value="1" />
 	</var>
 
 	<var name="rvct3_1" extends="rvct">
--- a/sbsv2/raptor/lib/config/winscw.xml	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/lib/config/winscw.xml	Tue May 18 17:26:08 2010 +0100
@@ -127,7 +127,7 @@
 		<set name="PLATMACROS.LINUX" value="$(PLATMACROS.WINDOWS)"/>
 	</var>
 
-	<var name="winscw_udeb" extends="winscw_base">
+	<var name="winscw_debug">
 		<set name="FULLVARIANTPATH" value="winscw/udeb"/>
 		<set name="VARIANTTYPE" value="udeb"/>
 
@@ -135,17 +135,19 @@
 		<append name="CFLAGS" value="-g -O0 -inline off"/>
 		<append name="LFLAGS" value="-g"/>
 	</var>
-
-	<var name="winscw_urel" extends="winscw_base">
+	<alias name="winscw_udeb" meaning="winscw_base.winscw_debug"/>
+	
+	<var name="winscw_release">
 		<set name="FULLVARIANTPATH" value="winscw/urel"/>
 		<set name="VARIANTTYPE" value="urel"/>
 
 		<append name="CDEFS" value="NDEBUG"/>
 		<append name="CFLAGS" value="-O4,s"/>
 	</var>
-
+	<alias name="winscw_urel" meaning="winscw_base.winscw_release"/>
+	
 	<group name="winscw">
-		<varRef ref="winscw_urel"/>
-		<varRef ref="winscw_udeb"/>
+		<aliasRef ref="winscw_urel"/>
+		<aliasRef ref="winscw_udeb"/>
 	</group>
 </build>
--- a/sbsv2/raptor/lib/flm/e32abiv2.flm	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/lib/flm/e32abiv2.flm	Tue May 18 17:26:08 2010 +0100
@@ -50,6 +50,11 @@
 
 $(if $(FLMDEBUG),$(info <debug><flm name='e32abiv2' target='$(TARGET)' type='$(TARGETTYPE)' outputpath='$(OUTPUTPATH)' metasource='$(METASOURCE)' postlinkfiletype='$(POSTLINKFILETYPE)' /></debug>))
 
+# Enable DELETE_ON_FAILED_COMPILE work around for failed RVCT 2.2 compiles
+ifneq ($(DELETE_ON_FAILED_COMPILE),)
+RVCT22_DELETE_WORKAROUND:=|| { $$(GNURM) $$@; exit 1; }
+endif # ifneq ($(DELETE_ON_FAILED_COMPILE),)
+
 # Strip switch-type parameters
 #
 POSTLINKTARGETTYPE:=$(strip $(POSTLINKTARGETTYPE))
@@ -167,13 +172,12 @@
     IMPORTLIBTARGETVERSIONED_DSO:=$(VER_E32IMPORTLIBBASE).dso
   endif
 
-  # ABIv1 .lib (for specific builds, toolchains and host OS platforms only)
+  # ABIv1 .lib (for specific kits and toolchains only)
   IMPORTLIBTARGET_LIB:=
   IMPORTLIBTARGETVERSIONED_LIB:=
   BUILDMARKER_IMPORTLIBTARGET_LIB:=TARGET_$(subst :,,$(VER_E32IMPORTLIBBASE)).lib
-  # Only for builds that require and support them, and only on windows
-  ifeq ($(OSTYPE),cygwin)
-  ifeq ($(GENERATE_ABIV1_IMPLIBS),1)
+  # Only for kits that require and tools that support them
+  ifneq ($(SUPPORTS_ABIV1_IMPLIBS),)
     WHATRELEASE:=$(WHATRELEASE) $(if $(EXPLICITVERSION),,$(TMP_IMPORTLIBTARGET_ROOT).lib)
     WHATRELEASE:=$(WHATRELEASE) $(VER_E32IMPORTLIBBASE).lib
     ifeq ($($(BUILDMARKER_IMPORTLIBTARGET_LIB)),)
@@ -181,7 +185,6 @@
       IMPORTLIBTARGETVERSIONED_LIB:=$(VER_E32IMPORTLIBBASE).lib
     endif
   endif
-  endif
 endif
 
 # Try to make sure that we get the right linkas name
@@ -795,7 +798,7 @@
 			$(if $(NO_DEPEND_GENERATE),,$(DEPEND_OPTION) $(call dblquote,$(1).d)) \
 			$(if $(LINKERFEEDBACK_STAGE2),$(FEEDBACK_OPTION)$(call dblquote,$(FEEDBACKFILE))) \
 			$(if $(MULTIFILE_ENABLED),--multifile $(OUTPUT_OPTION) $(MULTIFILEOBJECT) \
-			--via $$(call dblquote, $(MULTIFILE_VIAFILE)),$(OUTPUT_OPTION) $$@ $$(call dblquote, $$<))  \
+			--via $$(call dblquote, $(MULTIFILE_VIAFILE)),$(OUTPUT_OPTION) $$@ $$(call dblquote, $$<)) $(if $(USE_RVCT22_DELETE_WORKAROUND),$(RVCT22_DELETE_WORKAROUND)) \
 	$(call endrule,compile)
 
 ifeq ($(NO_DEPEND_GENERATE),)
@@ -854,7 +857,7 @@
 			$(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 $(NOHIDEALL),--no_hide_all,) \
-			$$(call dblquote, $$<) $(OUTPUT_OPTION) $$(@) \
+			$$(call dblquote, $$<) $(OUTPUT_OPTION) $$(@) $(if $(USE_RVCT22_DELETE_WORKAROUND),$(RVCT22_DELETE_WORKAROUND)) \
 	$(call endrule,e32cpponly)
 
 CLEANTARGETS:=$$(CLEANTARGETS) $(CPPONLYTARGET)
@@ -889,7 +892,7 @@
 			$(if $(SYSTEMINCLUDE),$(COMPILER_SYSTEM_INCLUDE_OPTION),)$(call concat, $(COMPILER_SYSTEM_INCLUDE_OPTION),$(call dblquote,$(SYSTEMINCLUDE)))  \
 			$(if $(NOHIDEALL),--no_hide_all,) \
 			$(if $(NO_DEPEND_GENERATE),,$(DEPEND_OPTION) $(call dblquote,$(DEPENDFILENAME))) \
-			$$(call dblquote, $$<) $(OUTPUT_OPTION) $$(@) \
+			$$(call dblquote, $$<) $(OUTPUT_OPTION) $$(@) $(if $(USE_RVCT22_DELETE_WORKAROUND),$(RVCT22_DELETE_WORKAROUND)) \
 	$(call endrule,e32listing)
 
 CLEANTARGETS:=$$(CLEANTARGETS) $(LISTINGTARGET)
@@ -984,7 +987,7 @@
 			$(call makemacrodef,-D,$(COMPILER_INTERWORK_DEFINES) $(CDEFS) $(CIADEFS)) $(CPP_LANG_OPTION)      \
 	 		$(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))) \
-	 		$$(call dblquote, $$<) $(OUTPUT_OPTION) $$@ \
+	 		$$(call dblquote, $$<) $(OUTPUT_OPTION) $$@ $(if $(USE_RVCT22_DELETE_WORKAROUND),$(RVCT22_DELETE_WORKAROUND)) \
 	$(call endrule,cia2cpp2o)
 
 
@@ -1010,7 +1013,7 @@
 $(e32abiv2_PREFILE): $1 $(PROJECT_META) $(if $(DEPENDFILE),,RESOURCE BITMAP EXPORT)
 	$(call startrule,cia2cpp,,$1) \
 	$(if $(PERTURBSTARTTIME),$(RANSLEEP) $(PERTURBMSECS) ;,) \
-	$(CC) $(e32abiv2_PREFILE_OPTIONS) $(OUTPUT_OPTION) $$@ $$(call dblquote,$1) \
+	$(CC) $(e32abiv2_PREFILE_OPTIONS) $(OUTPUT_OPTION) $$@ $$(call dblquote,$1) $(if $(USE_RVCT22_DELETE_WORKAROUND),$(RVCT22_DELETE_WORKAROUND)) \
 	$(if $(NO_DEPEND_GENERATE),,&& $(CC) -M $(e32abiv2_PREFILE_OPTIONS) --depend_format=unix $(OUTPUT_OPTION) $$@ $$(call dblquote,$1) > $(call dblquote,$(e32abiv2_PREFILE).d)) \
 	$(call endrule,cia2cpp)
 
@@ -1055,12 +1058,12 @@
 		$(if $(PERTURBSTARTTIME),$(RANSLEEP) $(PERTURBMSECS) ;,) \
 		$(CC) $(e32abiv2_asm_OPTIONS) \
 		$(if $(NO_DEPEND_GENERATE),,$(DEPEND_OPTION) $(call dblquote,$(DEPENDFILENAME))) \
-	 	$$(call dblquote, $$<) $(OUTPUT_OPTION) $$@ \
+	 	$$(call dblquote, $$<) $(OUTPUT_OPTION) $$@ $(if $(USE_RVCT22_DELETE_WORKAROUND),$(RVCT22_DELETE_WORKAROUND)) \
 	$(call endrule,asmcompile)
 ifeq ($(NO_DEPEND_GENERATE),)
 	$(call startrule,asmdependencies) \
 		$(CC) -M $(subst --no_rtti,,$(e32abiv2_asm_OPTIONS)) --depend_format=unix \
-	  	$(OUTPUT_OPTION) $$@ $$(call dblquote,$2) > $(call dblquote,$(DEPENDFILENAME)) \
+	  	$(OUTPUT_OPTION) $$@ $$(call dblquote,$2) > $(call dblquote,$(DEPENDFILENAME)) $(if $(USE_RVCT22_DELETE_WORKAROUND),$(RVCT22_DELETE_WORKAROUND)) \
 	$(call endrule,asmdependencies)
 endif
 
@@ -1176,8 +1179,8 @@
 	        $(call startrule,rombuild)	\
 	        $(GNUMKDIR) -p $(ROMDIR) \
             $(if $(ROMFILE_CREATED_$(TOBLDINF)),,&& echo -e "// $(subst $(EPOC_ROOT)/,,$(ROMFILENAME))\n//\n$(DATATEXT)" > $(ROMFILENAME)) \
-            $(if $(BUILDROMTARGET),&& echo "$(ROMFILETYPE)=/epoc32/release/##$(ABIDIR)##/##BUILD##/$(TARGET).$(REQUESTEDTARGETEXT)   $(1)$(ROMDECORATIONS)" >> $(ROMFILENAME))	\
-	        $(if $(RAMTARGET),&& echo "$(ROMFILETYPE_RAM)=/epoc32/release/##$(ABIDIR)##/##BUILD##/$(TARGET).$(REQUESTEDTARGETEXT)   $(ROMPATH_RAM)$(ROMFILE_RAM)$(ROMDECORATIONS_RAM)" >> $(ROMFILENAME))	\
+            $(if $(BUILDROMTARGET),&& echo "$(ROMFILETYPE)=/epoc32/release/##$(ABIDIR)##/##BUILD##/$(TARGET)$(if $(EXPLICITVERSION),{$(VERSIONHEX)},).$(REQUESTEDTARGETEXT)   $(1)$(ROMDECORATIONS)" >> $(ROMFILENAME))	\
+	        $(if $(RAMTARGET),&& echo "$(ROMFILETYPE_RAM)=/epoc32/release/##$(ABIDIR)##/##BUILD##/$(TARGET)$(if $(EXPLICITVERSION),{$(VERSIONHEX)},).$(REQUESTEDTARGETEXT)   $(ROMPATH_RAM)$(ROMFILE_RAM)$(ROMDECORATIONS_RAM)" >> $(ROMFILENAME))	\
 	        $(call endrule,buildromfiletarget)
     endef
 
--- a/sbsv2/raptor/lib/flm/standard.xml	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/lib/flm/standard.xml	Tue May 18 17:26:08 2010 +0100
@@ -74,6 +74,7 @@
 		<param name='CC.VAL.SOFTVFP_MAYBE_VFPV2' default=''/>
 		<param name='CODE_SEGMENT_START' default=''/>
 		<param name='TOOLCHAIN' default=''/>
+		<param name='USE_RVCT22_DELETE_WORKAROUND' default=''/>
 	</interface>
 	<interface name="Symbian.e32abiv2" extends="Symbian.mmp" flm="e32abiv2.flm">
 		<param name='SUPPORTS_STDCPP_NEWLIB' default='1'/>
@@ -121,7 +122,6 @@
 		<param name='FPMODE_OPTION'/>
 		<param name='FROMELF'/>
 		<param name='FULLVARIANTPATH'/>
-		<param name='GENERATE_ABIV1_IMPLIBS' default=''/>		
 		<param name='RVCT3_1' default=''/>
 		<param name='LD'/>
 		<param name='LD_ERRORS_CONTROL_OPTION'/>
@@ -178,6 +178,7 @@
 		<param name='STATIC_LIBS_PATH'/>
 		<param name='STATIC_LIBRARY_DIR'/>
 		<param name='STATIC_RUNTIME_DIR'/>
+		<param name='SUPPORTS_ABIV1_IMPLIBS'/>		
 		<param name='SYMBIAN_CCFLAGS'/>
 		<param name='SYMBIAN_LD_MESSAGE_OPTION'/>
 		<param name='SYMBIAN_LINK_FLAGS'/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/notes/abiv1_implibs.txt	Tue May 18 17:26:08 2010 +0100
@@ -0,0 +1,14 @@
+
+The ABIv1 toolchain was deprecated in Symbian OS 9.4 but the build system
+continued to generate both ABIv1 (.lib) import libraries and ABIv2 (.dso)
+import libraries for convenience during the transition to ABIv2.
+
+This change now turns off the generation of ABIv1 import libraries by
+default but makes support switchable on a kit-by-kit basis. To turn on
+ABIv1 import library generation, add the following setting to the
+root.changes variant in epoc32/sbs_config/os_properties.xml
+
+<set name="SUPPORTS_ABIV1_IMPLIBS" value="1"/>
+
+An example properties file is available in the examples/os_properties.xml
+file distributed within the Raptor installation.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/notes/delete_on_failed_compile.txt	Tue May 18 17:26:08 2010 +0100
@@ -0,0 +1,7 @@
+In certain circumstances, such as failure to obtain licenses, RVCT 2.2's armcc 
+program still produces object files whose contents is junk. This causes build 
+problems later as from Make's point of view those object files are "up to 
+date" so the build tries to link them. Of course, these attempts at linking 
+fail and the build is broken.
+
+This is a work around for that RVCT 2.2 problem.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/notes/parametric_log_filters.txt	Tue May 18 17:26:08 2010 +0100
@@ -0,0 +1,31 @@
+
+It is now possible to pass parameters from the command line into log filters.
+This works in the same way for both sbs and sbs_filter commands.
+
+For example:
+
+sbs --filters=Foo[param1,param2,param3]
+
+sbs_filter --filters=Bar[value] < build.log
+
+
+Multiple filters with parameters can be specified if needed,
+
+sbs --filters=Foo[param1,param2,param3],Bar[value]
+
+
+In the 2.13.0 release there are two filters which take parameters:
+
+1. sbs_filter --filters=FilterComp[wizard/group] < log
+
+Here the parameter is (part of) a bld.inf path and the filter only prints
+parts of the log which are attributable to the matching component. In the
+example above, the log elements from any bld.inf which has "wizard/group" 
+as part of its path will be printed: normally, passing the full path name
+will guarantee that only one component matches.
+
+2. sbs_filter --filters=FilterTagCounter[info,recipe] < log
+
+Here the parameters are a list of the element names to count. This is a
+simple analysis filter that shows you how many instances of XMl elements
+are in a log and how many characters of body text they have.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/notes/query_cli.txt	Tue May 18 17:26:08 2010 +0100
@@ -0,0 +1,18 @@
+
+A new --query command-line option allows other tools to easily read raptor's
+configuration data without having to understand exactly how raptor config
+files work.
+
+For example, all the valid build aliases which can be used to build with
+the -c option can be obtained using:
+
+sbs --query=aliases
+
+All the known product variants can be obtained using:
+
+sbs --query=products
+
+And the details of a particular configuration can be found using:
+
+sbs --query=config[armv5_urel.n8]
+
--- a/sbsv2/raptor/python/filter_list.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/python/filter_list.py	Tue May 18 17:26:08 2010 +0100
@@ -19,6 +19,7 @@
 import os
 import sys
 import raptor
+import re
 import filter_interface
 import pluginbox
 import traceback
@@ -64,8 +65,24 @@
 		"""Nothing to do for stdout"""
 		return True
 
-
-
+def SplitList(listString):
+	"""turn a CLI filter string into a list of (class, param) pairs.
+	
+	for example, "foo[a,b],bar[c,d]"
+	
+	becomes [ ("foo", ["a","b"]) , ("bar", ["c","d"]) ]
+	"""
+	matches = re.findall("(\w+)(\[([^\[\]]*)\])?,?", listString)
+	
+	pairs = []
+	for m in matches:
+		classname = m[0]
+		if len(m[2]) > 0:
+			pairs.append( (classname, m[2].split(",")) )
+		else:
+			pairs.append( (classname, []) )
+	return pairs
+	
 class FilterList(filter_interface.Filter):
 
 	def __init__(self):
@@ -81,7 +98,6 @@
 		# Find all the filter plugins
 		self.pbox = pbox
 		possiblefilters = self.pbox.classesof(filter_interface.Filter)
-
 		filterdict = {}
 		for p in possiblefilters:
 			name = p.__name__.lower()
@@ -89,14 +105,22 @@
 				raise ValueError("filters found in SBS_HOME/python/plugins which have duplicate name: %s " % p.__name__)
 			else:
 				filterdict[name] = p
-
+		
+		# turn "filternames" into a list of (classname, parameters) pairs
+		filterCalls = SplitList(filternames)
+		
+		# look for each filter class in the box
 		unfound = []
 		self.filters = []
-		for f in filternames:
-			found = False
+		for (f, params) in filterCalls:
+			# if the filter exists and is a valid filter use it
 			if f.lower() in filterdict:
-				self.filters.append(filterdict[f.lower()]())
+				if params:
+					self.filters.append(filterdict[f.lower()](params))
+				else:
+					self.filters.append(filterdict[f.lower()]())
 			else:
+				# record missing filters
 				unfound.append(f)
 
 		if unfound != []:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/python/plugins/filter_component.py	Tue May 18 17:26:08 2010 +0100
@@ -0,0 +1,96 @@
+#
+# 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: 
+# Filter class to print log entries for a selected component
+#
+
+import filter_interface
+import sys
+
+class FilterComp(filter_interface.FilterSAX):
+	
+	def __init__(self, params = []):
+		"""parameters to this filter are the path of the bld.inf and some flags.
+		
+		The bld.inf path can be a substring of the path to match. For example,
+		"email" will match an element with bldinf="y:/src/email/group/bld.inf".
+		
+		No flags are supported yet; this is for future expansion.
+			
+		If no parameters are passed then nothing is printed."""
+		self.bldinf = ""
+		self.flags = ""
+		
+		if len(params) > 0:
+			self.bldinf = params[0]
+			
+		if len(params) > 1:
+			self.flags = params[1]
+		
+		super(FilterComp, self).__init__()
+		
+	def startDocument(self):
+		# mark when we are inside an element with bldinf="the selected one"
+		self.inside = False
+		# and count nested elements so we can toggle off at the end.
+		self.nesting = 0
+	
+	def printElementStart(self, name, attributes):
+		sys.stdout.write("<" + name)
+		for att,val in attributes.items():
+			sys.stdout.write(" " + att + "='" + val + "'")
+		sys.stdout.write(">")
+		
+	def startElement(self, name, attributes):
+		if self.inside:
+			self.nesting += 1
+			self.printElementStart(name, attributes)
+			return
+		
+		if self.bldinf:
+			try:
+				if self.bldinf in attributes["bldinf"]:
+					self.inside = True
+					self.nesting = 1
+					self.printElementStart(name, attributes)
+			except KeyError:
+				pass
+			
+	def characters(self, char):
+		if self.inside:
+			sys.stdout.write(char)
+		
+	def endElement(self, name):
+		if self.inside:
+			sys.stdout.write("</" + name + ">")
+			
+		self.nesting -= 1
+		
+		if self.nesting == 0:
+			self.inside = False
+			print
+	
+	def endDocument(self):
+		pass
+	
+	def error(self, exception):
+		print filter_interface.Filter.formatError("FilterComp:" + str(exception))
+		
+	def fatalError(self, exception):
+		print filter_interface.Filter.formatError("FilterComp:" + str(exception))
+		
+	def warning(self, exception):
+		print filter_interface.Filter.formatWarning("FilterComp:" + str(exception))
+	
+# the end
--- a/sbsv2/raptor/python/plugins/filter_tagcount.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/python/plugins/filter_tagcount.py	Tue May 18 17:26:08 2010 +0100
@@ -19,6 +19,13 @@
 
 class FilterTagCounter(filter_interface.FilterSAX):
 	
+	def __init__(self, params = []):
+		"""parameters to this filter are the names of tags to print.
+		
+		If no parameters are passed then all tags are reported."""
+		self.interesting = params
+		super(FilterTagCounter, self).__init__()
+		
 	def startDocument(self):
 		# for each element name count the number of occurences
 		# and the amount of body text contained.
@@ -55,7 +62,8 @@
 		# report
 		print "\nsummary:"
 		for name,nos in sorted(self.count.items()):
-			print name, nos[0], nos[1]
+			if name in self.interesting or len(self.interesting) == 0:
+				print name, nos[0], nos[1]
 			
 		print "\nparsing:"
 		print "errors =", self.errors
--- a/sbsv2/raptor/python/raptor.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/python/raptor.py	Tue May 18 17:26:08 2010 +0100
@@ -445,9 +445,10 @@
 	created by the Main function. When operated by an IDE several Raptor
 	objects may be created and operated at the same time."""
 
-
+	# mission enumeration
 	M_BUILD = 1
-	M_VERSION = 2
+	M_QUERY = 2
+	M_VERSION = 3
 
 	def __init__(self, home = None):
 
@@ -517,7 +518,8 @@
 		self.noDependInclude = False
 		self.noDependGenerate = False
 		self.projects = set()
-
+		self.queries = []
+		
 		self.cache = raptor_cache.Cache(self)
 		self.override = {env: str(self.home)}
 		self.targets = []
@@ -714,6 +716,11 @@
 		self.projects.add(projectName.lower())
 		return True
 
+	def AddQuery(self, q):
+		self.queries.append(q)
+		self.mission = Raptor.M_QUERY
+		return True
+	
 	def FilterList(self, value):
 		self.filterList = value
 		return True
@@ -1060,7 +1067,7 @@
 			self.raptor_params = BuildStats(self)
 
 			# Open the requested plugins using the pluginbox
-			self.out.open(self.raptor_params, self.filterList.split(','), self.pbox)
+			self.out.open(self.raptor_params, self.filterList, self.pbox)
 
 			# log header
 			self.out.write("<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n")
@@ -1222,6 +1229,31 @@
 
 		return layers
 
+	def Query(self):
+		"process command-line queries."
+		
+		if self.mission != Raptor.M_QUERY:
+			return 0
+		
+		# establish an object cache based on the current settings
+		self.LoadCache()
+			
+		# our "self" is a valid object for initialising an API Context
+		import raptor_api
+		api = raptor_api.Context(self)
+		
+		print "<sbs version='%s'>" % raptor_version.numericversion()
+		
+		for q in self.queries:
+			try:
+				print api.stringquery(q)
+				
+			except Exception, e:
+				self.Error("exception '%s' with query '%s'", str(e), q)
+		
+		print "</sbs>"	
+		return self.errorCode
+	
 	def Build(self):
 
 		if self.mission != Raptor.M_BUILD: # help or version requested instead.
@@ -1359,6 +1391,9 @@
 	# object which represents a build
 	b = Raptor.CreateCommandlineBuild(argv)
 
+	if b.mission == Raptor.M_QUERY:
+		return b.Query()
+	
 	return b.Build()
 
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/python/raptor_api.py	Tue May 18 17:26:08 2010 +0100
@@ -0,0 +1,221 @@
+#
+# 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: 
+#
+# raptor_api module
+#
+# Python API for Raptor. External code should interact with Raptor via this
+# module only, as it is the only programatic interface considered public. The
+# command line --query option is also implemented using this module.
+
+# constants
+ALL = 1
+
+# objects
+
+class Reply(object):
+	"""object to return values from API calls.
+	"""
+	def __init__(self, text=""):
+		self.text = text
+	
+	def __str__(self):
+		name = type(self).__name__.lower()
+		
+		string = "<" + name
+		children = []
+		longend = False
+		
+		for attribute,value in self.__dict__.items():
+			if attribute != "text":
+				if isinstance(value, Reply):
+					children.append(value)
+				else:
+					string += " %s='%s'" % (attribute, value)
+		
+		if children or self.text:
+			string += ">"
+			longend = True
+		
+		if self.text:
+			string += self.text
+		
+		if children:
+			string += "\n"
+				
+		for c in children:
+			string += str(c)
+			
+		if longend:
+			string += "</%s>\n" % name
+		else:	
+			string += "/>\n"
+		
+		return string
+
+class Alias(Reply):
+	def __init__(self, name, meaning):
+		super(Alias,self).__init__()
+		self.name = name
+		self.meaning = meaning
+
+class Config(Reply):
+	def __init__(self, fullname, outputpath):
+		super(Config,self).__init__()
+		self.fullname = fullname
+		self.outputpath = outputpath
+
+class Product(Reply):
+	def __init__(self, name):
+		super(Product,self).__init__()
+		self.name = name
+
+import generic_path
+import raptor
+import raptor_data
+import re
+
+class Context(object):
+	"""object to contain state information for API calls.
+	
+	For example,
+	
+	api = raptor_api.Context()
+	val = api.getaliases("X")
+	"""
+	def __init__(self, initialiser=None):
+		# this object has a private Raptor object that can either be
+		# passed in or created internally.
+		
+		if initialiser == None:
+			self.__raptor = raptor.Raptor()
+		else:
+			self.__raptor = initialiser
+			
+	def stringquery(self, query):
+		"""turn a string into an API call and execute it.
+		
+		This is a convenience method for "lazy" callers.
+		
+		The return value is also converted into a well-formed XML string.
+		"""
+		
+		if query == "aliases":
+			aliases = self.getaliases()
+			return "".join(map(str, aliases)).strip()
+		
+		elif query == "products":
+			variants = self.getproducts()
+			return "".join(map(str, variants)).strip()
+		
+		elif query.startswith("config"):
+			match = re.match("config\[(.*)\]", query)
+			if match:
+				config = self.getconfig(match.group(1))
+				return str(config).strip()
+			else:
+				raise BadQuery("syntax error")
+		
+		raise BadQuery("unknown query")
+
+	def getaliases(self, type=""):
+		"""extract all aliases of a given type.
+		
+		the default type is "".
+		to get all aliases pass type=ALL
+		"""
+		aliases = []
+		
+		for a in self.__raptor.cache.aliases.values():
+			if type == ALL or a.type == type:
+				# copy the members we want to expose
+				aliases.append( Alias(a.name, a.meaning) )
+			
+		return aliases
+	
+	def getconfig(self, name):
+		"""extract the values for a given configuration.
+		
+		'name' should be an alias or variant followed optionally by a
+		dot-separated list of variants. For example "armv5_urel" or
+		"armv5_urel.savespace.vasco".
+		"""
+		names = name.split(".")
+		if names[0] in self.__raptor.cache.aliases:
+			x = self.__raptor.cache.FindNamedAlias(names[0])
+			
+			if len(names) > 1:
+				fullname = x.meaning + "." + ".".join(names[1:])
+			else:
+				fullname = x.meaning
+				
+		elif names[0] in self.__raptor.cache.variants:
+			fullname = name
+			
+		else:
+			raise BadQuery("'%s' is not an alias or a variant" % names[0])
+		
+		# create an evaluator for the named configuration
+		tmp = raptor_data.Alias("tmp")
+		tmp.SetProperty("meaning", fullname)
+		
+		units = tmp.GenerateBuildUnits(self.__raptor.cache)
+		evaluator = self.__raptor.GetEvaluator(None, units[0])
+		
+		# get the outputpath
+		# this is messy as some configs construct the path inside the FLM
+		# rather than talking it from the XML: usually because of some
+		# conditional logic... but maybe some refactoring could avoid that.
+		releasepath = evaluator.Get("RELEASEPATH")
+		if not releasepath:
+			raise BadQuery("could not get RELEASEPATH for config '%s'" % name)
+		
+		variantplatform = evaluator.Get("VARIANTPLATFORM")
+		varianttype = evaluator.Get("VARIANTTYPE")
+		featurevariantname = evaluator.Get("FEATUREVARIANTNAME")
+		
+		platform = evaluator.Get("TRADITIONAL_PLATFORM")
+		
+		if platform == "TOOLS2":
+			outputpath = releasepath
+		else:
+			if not variantplatform:
+				raise BadQuery("could not get VARIANTPLATFORM for config '%s'" % name)
+			
+			if featurevariantname:
+				variantplatform += featurevariantname
+				
+			if not varianttype:
+				raise BadQuery("could not get VARIANTTYPE for config '%s'" % name)
+			
+			outputpath = str(generic_path.Join(releasepath, variantplatform, varianttype))
+		
+		return Config(fullname, outputpath)
+		
+	def getproducts(self):
+		"""extract all product variants."""
+		
+		variants = []
+		
+		for v in self.__raptor.cache.variants.values():
+			if v.type == "product":
+				# copy the members we want to expose
+				variants.append( Product(v.name) )
+			
+		return variants
+	
+class BadQuery(Exception):
+	pass
+
+# end of the raptor_api module
--- a/sbsv2/raptor/python/raptor_cli.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/python/raptor_cli.py	Tue May 18 17:26:08 2010 +0100
@@ -18,13 +18,8 @@
 # by a raptor.Raptor object.
 #
 
-import re
 import types
 import raptor
-import os
-import sys
-import tempfile
-from raptor_utilities import getOSPlatform
 
 from optparse import OptionParser # for parsing command line parameters
 
@@ -132,6 +127,18 @@
 parser.add_option("-q","--quiet",action="store_true",dest="quiet",
 				help="Run quietly, not generating output messages.")
 
+parser.add_option("--query",action="append",dest="query",
+				help="""Access various build settings and options using a basic API. The current options are:
+				
+				* aliases - return all the values that can be sensibly used with the sbs -c option.
+				
+				* products - return all the values that can be "." appended to an alias to specialise it for a product build.
+				
+				* config[x] - return a set of values that represent the build configuration "x". Typically "x" will be an alias name or an alias followed by "." followed by a product.
+				
+				Multiple --query options can be given.
+				""")
+
 parser.add_option("-s","--sysdef",action="store",dest="sys_def_file",
 				help="System Definition XML filename.")
 
@@ -245,8 +252,7 @@
 	# parse the full set of arguments
 	(options, leftover_args) = parser.parse_args(expanded_args)
 
-	# the leftover_args are either variable assignments of the form a=b
-	# or target names.
+	# the leftover_args are target names.
 	for leftover in leftover_args:
 		Raptor.AddTarget(leftover)
 
@@ -275,6 +281,7 @@
 				 'noDependGenerate': Raptor.SetNoDependGenerate,
 				 'number_of_jobs': Raptor.SetJobs,
 				 'project_name' :  Raptor.AddProject,
+				 'query' : Raptor.AddQuery,
 				 'filter_list' : Raptor.FilterList,
 				 'ignore_os_detection': Raptor.IgnoreOsDetection,
 				 'check' :  Raptor.SetCheck,
--- a/sbsv2/raptor/python/raptor_data.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/python/raptor_data.py	Tue May 18 17:26:08 2010 +0100
@@ -829,12 +829,13 @@
 
 class Variant(Model, Config):
 
-	__slots__ = ('cache','name','host','extends','ops','variantRefs','allOperations')
+	__slots__ = ('cache','name','type','host','extends','ops','variantRefs','allOperations')
 
 	def __init__(self, name = ""):
 		Model.__init__(self)
 		Config.__init__(self)
 		self.name = name
+		self.type = ""
 
 		# Operations defined inside this variant.
 		self.ops = []
@@ -855,6 +856,8 @@
 				self.host = value
 		elif name == "extends":
 			self.extends = value
+		elif name == "type":
+			self.type = value
 		else:
 			raise InvalidPropertyError()
 
@@ -948,6 +951,7 @@
 		Config.__init__(self)
 		self.name = name
 		self.meaning = ""
+		self.type = ""
 		self.varRefs = []
 		self.variants = []
 
@@ -962,6 +966,8 @@
 
 			for u in val.split("."):
 				self.varRefs.append( VariantRef(ref = u) )
+		elif key == "type":
+			self.type = val
 		else:
 			raise InvalidPropertyError()
 
--- a/sbsv2/raptor/python/raptor_make.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/python/raptor_make.py	Tue May 18 17:26:08 2010 +0100
@@ -161,6 +161,12 @@
 			self.talonshell = str(evaluator.Get("TALON_SHELL"))
 			self.talontimeout = str(evaluator.Get("TALON_TIMEOUT"))
 			self.talonretries = str(evaluator.Get("TALON_RETRIES"))
+			
+			# work around for RVCT 2.2 failed compiles
+			delete_on_failed_compile_s = evaluator.Get("DELETE_ON_FAILED_COMPILE")
+			self.delete_on_failed_compile = ""
+			if delete_on_failed_compile_s is not None and delete_on_failed_compile_s != "":
+				self.delete_on_failed_compile = "1"
 
 			# commands
 			self.initCommand = evaluator.Get("initialise")
@@ -274,6 +280,7 @@
 FLMHOME:=%s
 SHELL:=%s
 THIS_FILENAME:=$(firstword $(MAKEFILE_LIST))
+DELETE_ON_FAILED_COMPILE:=%s 
 
 %s
 
@@ -285,6 +292,7 @@
 			 self.raptor.filesystem,
 			 str(self.raptor.systemFLM),
 			 self.shellpath,
+			 self.delete_on_failed_compile,
 			 talon_settings,
 			 self.raptor.systemFLM.Append('globals.mk') )
 
--- a/sbsv2/raptor/python/raptor_meta.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/python/raptor_meta.py	Tue May 18 17:26:08 2010 +0100
@@ -1491,9 +1491,9 @@
 
 				self.__versionhex = "%04x%04x" % (major, minor)
 				self.BuildVariant.AddOperation(raptor_data.Set(varname, "%d.%d" %(major, minor)))
-				self.BuildVariant.AddOperation(raptor_data.Set(varname+"HEX", self.__versionhex))
+				self.BuildVariant.AddOperation(raptor_data.Set("VERSIONHEX", self.__versionhex))
 				self.__debug("Set "+toks[0]+"  OPTION to " + toks[1])
-				self.__debug("Set "+toks[0]+"HEX OPTION to " + "%04x%04x" % (major,minor))
+				self.__debug("Set VERSIONHEX OPTION to " + self.__versionhex)
 
 			else:
 				self.__Raptor.Warn("Invalid version supplied to VERSION (%s), using default value" % toks[1])
--- a/sbsv2/raptor/python/raptor_version.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/python/raptor_version.py	Tue May 18 17:26:08 2010 +0100
@@ -16,7 +16,7 @@
 
 # replace CHANGESET with the Hg changeset for ANY release
 
-version=(2,13,0,"2010-04-12","symbian build system","CHANGESET")
+version=(2,14,0,"2010-05-19","symbian build system","CHANGESET")
 
 def numericversion():
 	"""Raptor version string"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/config/abiv1kit/os_properties.xml	Tue May 18 17:26:08 2010 +0100
@@ -0,0 +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 build/2_0.xsd">
+
+  <!-- This variant modifies the root variant for this particular kit. -->
+  <var name="root.changes">
+
+    <!-- ask for ABIv1 import libraries
+    --> 
+    <set name='SUPPORTS_ABIV1_IMPLIBS' value='1'/>
+  </var>
+  
+</build>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/config/api.xml	Tue May 18 17:26:08 2010 +0100
@@ -0,0 +1,32 @@
+<?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">
+
+	<!-- test data for raptor_api_unit -->
+
+	<alias meaning="a" name="alias_A"/>
+	<alias meaning="a.b" name="alias_B"/>
+	<alias meaning="a.b.c" name="alias_C" type="O"/>
+	<alias meaning="a.b.c.d" name="alias_D" type="X"/>
+ 
+ 	<var name="product_A" type="product"/>
+ 	<var name="product_B"/>
+ 	<var name="product_C" type="product"/>
+ 	<var name="product_D"/>
+ 	
+ 	<var name="buildme">
+ 		<set name="RELEASEPATH" value="/home/raptor" host="lin.*"/>
+ 		<set name="RELEASEPATH" value="C:/home/raptor" host="win.*"/>
+ 		<set name="VARIANTPLATFORM" value="foo"/>
+ 		<set name="VARIANTTYPE" value="bar"/>
+ 	</var>
+ 	
+ 	<var name="foo"/>
+ 	<var name="bar"/>
+ 	
+ 	<alias name="s1" meaning="buildme.foo"/>
+ 	<alias name="s2" meaning="buildme.foo.bar"/>
+ 	
+</build>
--- a/sbsv2/raptor/test/smoke_suite/annofile2log.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/annofile2log.py	Tue May 18 17:26:08 2010 +0100
@@ -19,7 +19,7 @@
 def run():
 	t = SmokeTest()
 	t.id = "43563"
-	t.name = "annofile2log_canned"
+	t.name = "annofile2log"
 	t.description = "test workaround for log corruption from a make engine whose name begins with 'e'"
 	
 	t.usebash = True
--- a/sbsv2/raptor/test/smoke_suite/apply_usecases.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/apply_usecases.py	Tue May 18 17:26:08 2010 +0100
@@ -23,7 +23,7 @@
 
 	# Introduce LINKER_OPTIONS for tools2 linker
 	t.id = "0108"
-	t.name = "apply_linker_options"
+	t.name = "apply_usecases"
 	t.command = "sbs -b smoke_suite/test_resources/apply_usecases/linker_options/bld.inf -c tools2 -f -"
 	t.targets = [
 		"$(EPOCROOT)/epoc32/release/tools2/rel/test_apply_linkeroptions.exe"
--- a/sbsv2/raptor/test/smoke_suite/clean_readonly.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/clean_readonly.py	Tue May 18 17:26:08 2010 +0100
@@ -24,7 +24,7 @@
 	
 	t = AntiTargetSmokeTest()
 	t.id = "10a"
-	t.name = "cleanreadonly" 
+	t.name = "clean_readonly" 
 	t.command = "sbs -b smoke_suite/test_resources/simple_dll/bld.inf -c armv5"
 	t.targets = [
 		"$(EPOCROOT)/epoc32/release/armv5/udeb/createstaticdll.dll.sym",
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/delete_on_failed_compile.py	Tue May 18 17:26:08 2010 +0100
@@ -0,0 +1,109 @@
+#
+# 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: 
+#
+
+import os
+from raptor_tests import AntiTargetSmokeTest
+
+def run():
+	t = AntiTargetSmokeTest()
+	t.id = "116"
+	t.name = "delete_on_failed_compile"
+	t.description = "Test that object files are not present following a forced failed compile."
+	
+	t.usebash = True
+	base_command = "sbs -b smoke_suite/test_resources/simple/bld.inf -c armv5 -k"
+	
+	t.id = "116a" # Ensure everything is reallyclean before the test
+	t.name = "delete_on_failed_compile_reallyclean_01"
+	t.errors = 0
+	t.returncode = 0
+	t.antitargets = [ ]
+	t.command = base_command + " reallyclean"
+	t.run()
+	
+	t.id = "116b"  # Object files should *not* be present after this forced failed compile
+	t.name = "delete_on_failed_compile_build"
+	t.errors = 0
+	t.returncode = 1
+	# None of these files should be present
+	t.addbuildantitargets('smoke_suite/test_resources/simple/bld.inf', 
+		[	"test_/armv5/udeb/test.o",
+			"test_/armv5/udeb/test1.o",
+			"test_/armv5/udeb/test2.o",
+			"test_/armv5/udeb/test3.o",
+			"test_/armv5/udeb/test4.o",
+			"test_/armv5/udeb/test5.o",
+			"test_/armv5/udeb/test6.o",
+			"test_/armv5/urel/test.o",
+			"test_/armv5/urel/test1.o",
+			"test_/armv5/urel/test2.o",
+			"test_/armv5/urel/test3.o",
+			"test_/armv5/urel/test4.o",
+			"test_/armv5/urel/test5.o",
+			"test_/armv5/urel/test6.o"  ])
+	sbshome = os.environ["SBS_HOME"].replace("\\","/").rstrip("/")
+	t.command = base_command.replace("armv5", "armv5.fake_compiler") + \
+	" --configpath=%s/test/smoke_suite/test_resources/simple/compilervariants" % sbshome
+	t.run()
+	
+	t.id = "116c"
+	t.name = "delete_on_failed_compile_reallyclean_02"
+	t.errors = 0
+	t.returncode = 0
+	t.antitargets = [] # Remove the list of anti-targets
+	t.command = base_command + " reallyclean"
+	t.run()
+	
+	t.id = "116d"  # Use a redefined make_engine variant - object files *should* be present
+	t.name = "delete_on_failed_compile_build_redefined_make_engine"
+	t.errors = 0
+	t.returncode = 1
+	t.antitargets = [] # Remove the list of anti-targets
+	# All of these files should be present
+	t.addbuildtargets('smoke_suite/test_resources/simple/bld.inf', 
+		[	"test_/armv5/udeb/test.o",
+			"test_/armv5/udeb/test1.o",
+			"test_/armv5/udeb/test2.o",
+			"test_/armv5/udeb/test3.o",
+			"test_/armv5/udeb/test4.o",
+			"test_/armv5/udeb/test5.o",
+			"test_/armv5/udeb/test6.o",
+			"test_/armv5/urel/test.o",
+			"test_/armv5/urel/test1.o",
+			"test_/armv5/urel/test2.o",
+			"test_/armv5/urel/test3.o",
+			"test_/armv5/urel/test4.o",
+			"test_/armv5/urel/test5.o",
+			"test_/armv5/urel/test6.o"  ])
+	
+	t.command = base_command.replace("armv5", "armv5.fake_compiler") + " -e make_test " \
+	+ " --configpath=%s/test/smoke_suite/test_resources/simple/compilervariants " % sbshome \
+	+ " --configpath=%s/test/smoke_suite/test_resources/simple/makevariants" % sbshome
+	t.run()
+	
+	t.id = "116e"
+	t.name = "delete_on_failed_compile_reallyclean_03"
+	t.errors = 0
+	t.returncode = 0
+	t.antitargets = [] # Remove the list of anti-targets
+	t.targets = [] # Remove the list of targets
+	t.command = base_command + " reallyclean"
+	t.run()
+	
+	t.id = "116"
+	t.name = "delete_on_failed_compile"
+	t.print_result()
+	return t
--- a/sbsv2/raptor/test/smoke_suite/dll_armv5.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/dll_armv5.py	Tue May 18 17:26:08 2010 +0100
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# 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"
@@ -19,7 +19,6 @@
 def run():
 	t = AntiTargetSmokeTest()
 	t.usebash = True
-	result = AntiTargetSmokeTest.PASS
 	
 	command = "sbs -b smoke_suite/test_resources/simple_dll/bld.inf -c %s -f-"
 	maintargets = [
@@ -47,7 +46,7 @@
 		]
 	
 	# Note that ABIv1 import libraries are only generated for RVCT-based armv5
-	# builds on Windows
+	# builds on Windows if the kit asks for it (off by default)
 	
 	t.id = "0009a"
 	t.name = "dll_armv5_rvct"
@@ -56,24 +55,23 @@
 	t.addbuildtargets('smoke_suite/test_resources/simple_dll/bld.inf', buildtargets)
 	t.mustmatch = mustmatch
 	t.mustnotmatch = mustnotmatch
-	t.run("linux")
-	if t.result == AntiTargetSmokeTest.SKIP:
-		t.targets.extend(abiv1libtargets)
-		t.run("windows")
-	if t.result == AntiTargetSmokeTest.FAIL:
-		result = AntiTargetSmokeTest.FAIL
+	t.run()
+	
+	t.id = "0009b"
+	t.name = "dll_armv5_rvct_abiv1"
+	t.command += " --configpath=test/config/abiv1kit"
+	t.targets.extend(abiv1libtargets)
+	t.run("windows")
 		
-	t.id = "0009b"
+	t.id = "0009c"
 	t.name = "dll_armv5_clean"
 	t.command = "sbs -b smoke_suite/test_resources/simple_dll/bld.inf -c armv5 clean"
 	t.targets = []
 	t.mustmatch = []
 	t.mustnotmatch = []
 	t.run()	
-	if t.result == AntiTargetSmokeTest.FAIL:
-		result = AntiTargetSmokeTest.FAIL		
 		
-	t.id = "0009c"
+	t.id = "0009d"
 	t.name = "dll_armv5_gcce"
 	t.command = command % "gcce_armv5"
 	t.targets = maintargets
@@ -82,11 +80,8 @@
 	t.mustmatch = mustmatch
 	t.mustnotmatch = mustnotmatch
 	t.run()	
-	if t.result == AntiTargetSmokeTest.FAIL:
-		result = AntiTargetSmokeTest.FAIL
 	
 	t.id = "9"
 	t.name = "dll_armv5"
-	t.result = result
 	t.print_result()
 	return t
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/filter_params.py	Tue May 18 17:26:08 2010 +0100
@@ -0,0 +1,140 @@
+#
+# 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 = "Test the passing of parameters to log filters"
+	
+	command = "sbs -b smoke_suite/test_resources/simple/bld.inf -c armv5_urel --filters="
+	
+	# no parameters means count all tags	
+	t.name = "filter_params_all_tags"
+	t.command = command + "FilterTagCounter"
+	t.mustmatch_singleline = [
+		"^info \d+ \d+",
+		"^whatlog \d+ \d+",
+		"^clean \d+ \d+"	
+		]
+	t.run()
+	
+	# empty parameter lists are valid
+	t.name = "filter_params_all_tags2"
+	t.command = command + "FilterTagCounter[]"
+	t.run()
+	
+	# parameters mean report only those tags	
+	t.name = "filter_params_info"
+	t.command = command + "FilterTagCounter[info]"
+	t.mustmatch_singleline = [
+		"^info \d+ \d+"
+		]
+	t.mustnotmatch_singleline = [
+		"^whatlog \d+ \d+",
+		"^clean \d+ \d+"	
+		]
+	t.run()
+	
+	# multiple parameters are valid	
+	t.name = "filter_params_info_clean"
+	t.command = command + "FilterTagCounter[info,clean]"
+	t.mustmatch_singleline = [
+		"^info \d+ \d+",
+		"^clean \d+ \d+"
+		]
+	t.mustnotmatch_singleline = [
+		"^whatlog \d+ \d+"
+		]
+	t.run()
+	
+	# using the same filter with different parameters is valid
+	t.name = "filter_params_info_clean2"
+	t.command = command + "FilterTagCounter[info],FilterTagCounter[clean]"
+	t.run()
+	
+	# using the same filter with the same parameters is valid too
+	t.name = "filter_params_info_clean3"
+	t.command = command + "FilterTagCounter[info,clean],FilterTagCounter[info,clean]"
+	t.run()
+	
+	
+	# parameters must work with the sbs_filter script as well
+	
+	command = "sbs_filter --filters=%s < smoke_suite/test_resources/logexamples/filter_component.log"
+	t.logfileOption = lambda :""
+	t.makefileOption = lambda :""
+
+	# should still work with no parameters
+	t.name = "sbs_filter_no_params"
+	t.command = command % "FilterComp"
+	t.mustmatch_singleline = [
+		]
+	t.mustnotmatch_singleline = [
+		"[<>]" # no elements should be printed at all as no bld.inf is selected
+		]
+	t.run()
+	
+	# should work with an empty parameter list
+	t.name = "sbs_filter_no_params2"
+	t.command = command % "FilterComp[]"
+	t.run()
+	
+	# with a parameter
+	t.name = "sbs_filter_one_param"
+	t.command = command % "FilterComp[email]"
+	t.stdout = [
+		"<error bldinf='y:/src/email/bld.inf'>email error #1</error>",
+		"<error bldinf='y:/src/email/bld.inf'>email error #2</error>",
+		"<warning bldinf='y:/src/email/bld.inf'>email warning #1</warning>",
+		"<warning bldinf='y:/src/email/bld.inf'>email warning #2</warning>",
+		"<whatlog bldinf='y:/src/email/bld.inf' config='armv5_urel' mmp='y:/src/email/a.mmp'>",
+		"<build>/epoc32/data/email_1</build>",
+		"<build>/epoc32/data/email_2</build>",
+		"</whatlog>",
+		"<recipe bldinf='y:/src/email/bld.inf' name='dummy'>",
+		"+ make_email",
+		"email was made fine",
+		"<status exit='ok'></status>",
+		"</recipe>",
+		"<fake bldinf='y:src/email/bld.inf'>",
+		"  <foo>",
+		"   <bar>",
+		"     <fb>fb email</fb>",
+		"   </bar>",
+		" </foo>",
+		"</fake>"
+		]
+	t.mustmatch_singleline = []
+	t.mustnotmatch_singleline = []
+	t.warnings = 2
+	t.errors = 2
+	t.run()
+	
+	# with multiple filters
+	t.name = "sbs_filter_multi"
+	t.command = command % "FilterComp[txt],FilterTagCounter[file,recipe]"
+	t.stdout = []
+	t.mustmatch_singleline = [ "txt", "^file \d+", "^recipe \d+" ]
+	t.mustnotmatch_singleline = [ "email" ]
+	t.warnings = 2
+	t.errors = 0
+	t.run()
+	
+	t.name = "filter_params"
+	t.print_result()
+	return t
--- a/sbsv2/raptor/test/smoke_suite/implib_armv5.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/implib_armv5.py	Tue May 18 17:26:08 2010 +0100
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# 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"
@@ -22,7 +22,6 @@
 	t.name = "implib_armv5"
 	t.command = "sbs -b smoke_suite/test_resources/simple_implib/bld.inf" \
 		+ " -c armv5 LIBRARY"
-	# ABIv1 .lib files are not generated on Linux
 	t.targets = [
 		"$(EPOCROOT)/epoc32/release/armv5/lib/simple_implib.dso",
 		"$(EPOCROOT)/epoc32/release/armv5/lib/simple_implib{000a0000}.dso"
@@ -31,13 +30,7 @@
 		['simple_implib_lib/armv5/udeb/simple_implib.prep',
                  'simple_implib_lib/armv5/urel/simple_implib.prep']
 	])
-	t.run("linux")
-	# Run test on Windows if that is the current OS
-	if t.result == SmokeTest.SKIP:
-		t.targets.extend([
-			"$(EPOCROOT)/epoc32/release/armv5/lib/simple_implib.lib",
-			"$(EPOCROOT)/epoc32/release/armv5/lib/simple_implib{000a0000}.lib"
-		])
-		t.run("windows")
-		
+	t.run()
+	
+	t.print_result()	
 	return t
--- a/sbsv2/raptor/test/smoke_suite/implib_armv5_smp.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/implib_armv5_smp.py	Tue May 18 17:26:08 2010 +0100
@@ -27,12 +27,7 @@
 		"$(EPOCROOT)/epoc32/release/armv5/lib/simple_implib.dso",
 		"$(EPOCROOT)/epoc32/release/armv5/lib/simple_implib{000a0000}.dso"
 		]
-	t.run("linux")
-	if t.result == AntiTargetSmokeTest.SKIP:
-		t.antitargets = [
-			'$(EPOCROOT)/epoc32/release/armv5/lib/simple_implib.lib',
-			'$(EPOCROOT)/epoc32/release/armv5/lib/simple_implib{000a0000}.lib'
-		]
-		t.run("windows")
-		
+	t.run()
+	
+	t.print_result()
 	return t
--- a/sbsv2/raptor/test/smoke_suite/implib_armv5_what.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/implib_armv5_what.py	Tue May 18 17:26:08 2010 +0100
@@ -22,18 +22,11 @@
 	t.name = "implib_armv5_what"
 	t.command = "sbs -b smoke_suite/test_resources/simple_implib/bld.inf -c " + \
 			"armv5 --what LIBRARY"
-	# ABIv1 .lib files are not generated on Linux
 	t.stdout = [
 		'$(EPOCROOT)/epoc32/release/armv5/lib/simple_implib.dso',
 		'$(EPOCROOT)/epoc32/release/armv5/lib/simple_implib{000a0000}.dso'
 	]
-	t.run("linux")
-	# Run test on Windows if that is the current OS
-	if t.result == CheckWhatSmokeTest.SKIP:
-		t.stdout.extend([
-			'$(EPOCROOT)/epoc32/release/armv5/lib/simple_implib.lib',
-			'$(EPOCROOT)/epoc32/release/armv5/lib/simple_implib{000a0000}.lib'
-		])
-		t.run("windows")
+	t.run()
 	
+	t.print_result()
 	return t
--- a/sbsv2/raptor/test/smoke_suite/implib_armv5_with_armv5_smp.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/implib_armv5_with_armv5_smp.py	Tue May 18 17:26:08 2010 +0100
@@ -27,12 +27,7 @@
 		"$(EPOCROOT)/epoc32/release/armv5/lib/simple_implib.dso",
 		"$(EPOCROOT)/epoc32/release/armv5/lib/simple_implib{000a0000}.dso"
 		]
-	t.run("linux")
-	if t.result == SmokeTest.SKIP:
-		t.targets.extend([
-			"$(EPOCROOT)/epoc32/release/armv5/lib/simple_implib.lib",
-			"$(EPOCROOT)/epoc32/release/armv5/lib/simple_implib{000a0000}.lib"
-		])
-		t.run("windows")
-		
+	t.run()
+	
+	t.print_result()	
 	return t
--- a/sbsv2/raptor/test/smoke_suite/implib_nodef.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/implib_nodef.py	Tue May 18 17:26:08 2010 +0100
@@ -28,13 +28,7 @@
 		"$(EPOCROOT)/epoc32/release/armv5/lib/implib_implicit_def{000a0000}.dso",
 		"$(EPOCROOT)/epoc32/release/winscw/udeb/implib_implicit_def.lib"
 		]
-	t.run("linux")
-	if t.result == SmokeTest.SKIP:
-		t.targets.extend([
-			"$(EPOCROOT)/epoc32/release/armv5/lib/implib_implicit_def.lib",
-			"$(EPOCROOT)/epoc32/release/armv5/lib/implib_implicit_def{000a0000}.lib"
-			])
-		t.run("windows")
+	t.run()
 
 	t.id = "71b"
 	t.name = "implib_no_def"
--- a/sbsv2/raptor/test/smoke_suite/implib_whatlog.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/implib_whatlog.py	Tue May 18 17:26:08 2010 +0100
@@ -45,16 +45,7 @@
 		"<build>$(EPOCROOT)/epoc32/release/armv5/lib/simple_implib.dso</build>",
 		"<build>$(EPOCROOT)/epoc32/release/armv5/lib/simple_implib{000a0000}.dso</build>"
 	]
-	t.run("linux")
-	if t.result == CheckWhatSmokeTest.SKIP:
-		t.targets.extend([
-			"$(EPOCROOT)/epoc32/release/armv5/lib/simple_implib.lib",
-			"$(EPOCROOT)/epoc32/release/armv5/lib/simple_implib{000a0000}.lib"
-		])
-		t.stdout.extend([
-			"<build>$(EPOCROOT)/epoc32/release/armv5/lib/simple_implib.lib</build>",
-			"<build>$(EPOCROOT)/epoc32/release/armv5/lib/simple_implib{000a0000}.lib</build>"
-		])
-		t.run("windows")
-		
+	t.run()
+	
+	t.print_result()
 	return t
--- a/sbsv2/raptor/test/smoke_suite/lib_versioned.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/lib_versioned.py	Tue May 18 17:26:08 2010 +0100
@@ -49,22 +49,7 @@
 		"$(EPOCROOT)/epoc32/release/winscw/udeb/versionedlib.02.lib",
 		"$(EPOCROOT)/epoc32/release/winscw/udeb/versionedlib01.lib"
 		]
-
-	if sys.platform.lower().startswith("win"):
-		t.targets.extend (	
-		[
-		"$(EPOCROOT)/epoc32/release/armv5/lib/testver.lib",
-		"$(EPOCROOT)/epoc32/release/armv5/lib/versionedlib01.lib",
-		"$(EPOCROOT)/epoc32/release/armv5/lib/versioned.lib.03.lib",
-		"$(EPOCROOT)/epoc32/release/armv5/lib/versionedlib.02.lib",
-		"$(EPOCROOT)/epoc32/release/armv5/lib/testver{00020000}.lib",
-		"$(EPOCROOT)/epoc32/release/armv5/lib/testver{00030000}.lib",
-		"$(EPOCROOT)/epoc32/release/armv5/lib/versioned.lib{000a0000}.03.lib",
-		"$(EPOCROOT)/epoc32/release/armv5/lib/version.ed.lib.04.lib",
-		"$(EPOCROOT)/epoc32/release/armv5/lib/version.ed.lib{000a0000}.04.lib",
-		"$(EPOCROOT)/epoc32/release/armv5/lib/versionedlib01{000a0000}.lib",
-		"$(EPOCROOT)/epoc32/release/armv5/lib/versionedlib{000a0000}.02.lib"
-		] )
-		
 	t.run()
+	
+	t.print_result()
 	return t
--- a/sbsv2/raptor/test/smoke_suite/output_control.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/output_control.py	Tue May 18 17:26:08 2010 +0100
@@ -32,7 +32,7 @@
 	
 	t = SmokeTest()
 	t.id = "82"
-	t.name = "output_control_sbs_build_dir"
+	t.name = "output_control"
 	t.description = "Test building intermediate files into a location other than $EPOCROOT/epoc32/build. Use SBS_BUILD_DIR. environment variable."
 	t.sbs_build_dir = environ['EPOCROOT'].replace("\\","/").rstrip("/") + '/anotherbuilddir'
 	t.environ['SBS_BUILD_DIR'] = t.sbs_build_dir
--- a/sbsv2/raptor/test/smoke_suite/pdll_arm.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/pdll_arm.py	Tue May 18 17:26:08 2010 +0100
@@ -31,10 +31,6 @@
 		"$(EPOCROOT)/epoc32/release/%s/lib/createstaticpdll.dso",
 		"$(EPOCROOT)/epoc32/release/%s/lib/createstaticpdll{000a0000}.dso"
 		]
-	abiv1libtargets = [
-		"$(EPOCROOT)/epoc32/release/%s/lib/createstaticpdll.lib",
-		"$(EPOCROOT)/epoc32/release/%s/lib/createstaticpdll{000a0000}.lib"
-		]
 	buildtargets =  [
 		"createstaticpdll_dll/%s/udeb/CreateStaticDLL.o",
 		"createstaticpdll_dll/%s/urel/CreateStaticDLL.o"
@@ -47,9 +43,6 @@
 		".*ksrt.*"
 		]
 	
-	# Note that ABIv1 import libraries are only generated for RVCT-based armv5
-	# builds on Windows
-	
 	t.id = "0109a"
 	t.name = "pdll_armv5_rvct"
 	t.command = command % "armv5"
@@ -57,10 +50,7 @@
 	t.addbuildtargets('smoke_suite/test_resources/simple_dll/pbld.inf', map(lambda p: p % "armv5", buildtargets))
 	t.mustmatch = mustmatch
 	t.mustnotmatch = mustnotmatch
-	t.run("linux")
-	if t.result == AntiTargetSmokeTest.SKIP:
-		t.targets.extend(map(lambda x: x % "armv5", abiv1libtargets))
-		t.run("windows")
+	t.run()
 		
 	t.id = "0109b"
 	t.name = "pdll_armv5_clean"
@@ -74,7 +64,6 @@
 	t.name = "pdll_armv5_gcce"
 	t.command = command % "gcce_armv5"
 	t.targets = map(lambda p: p % "armv5", maintargets + armv5targets)
-	t.antitargets = map(lambda p: p % "armv5", abiv1libtargets)
 	t.addbuildtargets('smoke_suite/test_resources/simple_dll/pbld.inf', map(lambda p: p % "armv5", buildtargets))
 	t.mustmatch = mustmatch
 	t.mustnotmatch = mustnotmatch
@@ -109,7 +98,6 @@
 	t.name = "pdll_armv7_gcce"
 	t.command = command % "arm.v7.udeb.gcce4_3_2 -c arm.v7.urel.gcce4_3_2"
 	t.targets = map(lambda p: p % "armv7", maintargets)
-	t.antitargets = map(lambda p: p % "armv7", abiv1libtargets)
 	t.addbuildtargets('smoke_suite/test_resources/simple_dll/pbld.inf', map(lambda p: p % "armv7", buildtargets))
 	t.mustmatch = mustmatch
 	t.mustnotmatch = mustnotmatch
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/query_cli.py	Tue May 18 17:26:08 2010 +0100
@@ -0,0 +1,110 @@
+#
+# 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: 
+#
+
+import raptor_tests
+
+def run():
+	
+	t = raptor_tests.SmokeTest()
+	t.description = "Test the --query command-line option"
+
+	t.name = "query_cli_alias"
+	t.command = "sbs --query=aliases"
+	t.mustmatch_singleline = [
+		"<sbs version='2\.\d+\.\d+'>",
+		"<alias.*name='armv5_urel'.*/>",
+		"<alias.*name='armv5_udeb'.*/>",
+		"<alias.*name='winscw_urel'.*/>",
+		"<alias.*name='winscw_udeb'.*/>",
+		"<alias.*name='tools2_rel'.*/>",
+		"<alias.*name='tools2_deb'.*/>",
+		"</sbs>"
+		]
+	t.mustnotmatch_singleline = [
+		"<alias.*name='make'.*/>",
+		"<alias.*name='emake'.*/>"
+		]
+	t.run()
+	
+	t.name = "query_cli_product"
+	t.command = "sbs --query=products --configpath=test/smoke_suite/test_resources/bv"
+	t.mustmatch_singleline = [
+		"<sbs version='2\.\d+\.\d+'>",
+		"<product.*name='test_bv_1'.*/>",
+		"<product.*name='test_bv_2'.*/>",
+		"<product.*name='test_bv_3'.*/>",
+		"</sbs>"
+		]
+	t.mustnotmatch_singleline = [
+		"<product.*name='arm'.*/>",
+		"<product.*name='root'.*/>"
+		]
+	t.run()
+	
+	t.name = "query_cli_config"
+	t.command = "sbs --query=config[armv5_urel]"
+	t.mustmatch_singleline = [
+		"<sbs version='2\.\d+\.\d+'>",
+		"fullname='arm\.v5\.urel\.rvct.*'",
+		"outputpath='.*/epoc32/release/armv5/urel'",
+		"</sbs>"
+		]
+	t.mustnotmatch_singleline = []
+	t.run()
+	
+	t.name = "query_cli_config_bv"
+	t.command = "sbs --query=config[armv5_urel.test_bv_1] --configpath=test/smoke_suite/test_resources/bv"
+	t.mustmatch_singleline = [
+		"<sbs version='2\.\d+\.\d+'>",
+		"fullname='arm\.v5\.urel\.rvct._.\.test_bv_1'",
+		"outputpath='.*/epoc32/release/armv5\.one/urel'",
+		"</sbs>"
+		]
+	t.mustnotmatch_singleline = []
+	t.run()
+	
+	t.name = "query_cli_config_others"
+	t.command = "sbs --query=config[winscw_urel] --query=config[tools2_rel]"
+	
+	if t.onWindows:
+		t2 = "tools2"
+	else:
+		t2 = raptor_tests.ReplaceEnvs("tools2/$(HOSTPLATFORM_DIR)")
+		
+	t.mustmatch_singleline = [
+		"<sbs version='2\.\d+\.\d+'>",
+		"outputpath='.*/epoc32/release/winscw/urel'",
+		"outputpath='.*/epoc32/release/%s/rel'" % t2,
+		"</sbs>"
+		]
+	t.mustnotmatch_singleline = []
+	t.run()
+	
+	t.name = "query_cli_bad"
+	t.command = "sbs --query=nonsense"
+	t.mustmatch_singleline = [
+		"<sbs version='2\.\d+\.\d+'>",
+		"exception 'unknown query' with query 'nonsense'",
+		"</sbs>"
+		]
+	t.mustnotmatch_singleline = []
+	t.errors = 1
+	t.returncode = 1
+	t.run()
+	
+	t.name = "query_cli"
+	t.print_result()
+	return t
--- a/sbsv2/raptor/test/smoke_suite/test_resources/bv/config/variants/bv_test.xml	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/test_resources/bv/config/variants/bv_test.xml	Tue May 18 17:26:08 2010 +0100
@@ -5,7 +5,7 @@
 			xsi:schemaLocation="http://symbian.com/xml/build build/2_0.xsd">
 
 		<!-- test feature variants -->
-		<var name="test_bv_1">
+		<var name="test_bv_1" type="product">
 			<set name='FEATUREVARIANTNAME' value='.one' />
 			<set name='FEATURELISTFILES'
 					value='$(SBS_HOME)/test/smoke_suite/test_resources/bv/listA.txt
@@ -16,7 +16,7 @@
 					value='$(SBS_HOME)/test/smoke_suite/test_resources/bv/var1
 					$(SBS_HOME)/test/smoke_suite/test_resources/bv/hrh' />   
   		</var>
-		<var name="test_bv_2">
+		<var name="test_bv_2" type="product">
 			<set name='FEATUREVARIANTNAME' value='.two' />
 			<set name='FEATURELISTFILES'
 					value='$(SBS_HOME)/test/smoke_suite/test_resources/bv/listA.txt
@@ -27,7 +27,7 @@
 					value='$(SBS_HOME)/test/smoke_suite/test_resources/bv/var2
 					$(SBS_HOME)/test/smoke_suite/test_resources/bv/hrh' />
 		</var>
-		<var name="test_bv_3">
+		<var name="test_bv_3" type="product">
 			<set name='FEATUREVARIANTNAME' value='.three' />
 			<set name='FEATURELISTFILES'
 					value='$(SBS_HOME)/test/smoke_suite/test_resources/bv/listA.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/test_resources/logexamples/filter_component.log	Tue May 18 17:26:08 2010 +0100
@@ -0,0 +1,42 @@
+<buildlog>
+
+<error bldinf="y:/src/email/bld.inf">email error #1</error>
+<error bldinf="y:/src/email/bld.inf">email error #2</error>
+
+<warning bldinf="y:/src/txt/bld.inf">txt warning #1</warning>
+<warning bldinf="y:/src/txt/bld.inf">txt warning #2</warning>
+
+<warning bldinf="y:/src/email/bld.inf">email warning #1</warning>
+<warning bldinf="y:/src/email/bld.inf">email warning #2</warning>
+
+<whatlog bldinf='y:/src/email/bld.inf' mmp='y:/src/email/a.mmp' config='armv5_urel'>
+<build>/epoc32/data/email_1</build>
+<build>/epoc32/data/email_2</build>
+</whatlog>
+
+<clean bldinf='y:/src/txt/bld.inf' mmp='y:/src/txt/b.mmp' config='armv5_udeb'>
+<file>/epoc32/data/txt_1</file>
+<file>/epoc32/data/txt_2</file>
+</clean>
+
+<recipe name='dummy' bldinf='y:/src/txt/bld.inf'>
++ make_txt
+txt was made fine
+<status exit='ok'/>
+</recipe>
+
+<recipe name='dummy' bldinf='y:/src/email/bld.inf'>
++ make_email
+email was made fine
+<status exit='ok'/>
+</recipe>
+
+<fake bldinf='y:src/email/bld.inf'>
+  <foo>
+    <bar>
+      <fb>fb email</fb>
+    </bar>
+  </foo>
+</fake>
+
+</buildlog>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/test_resources/scripts/delete_on_failed_compile.py	Tue May 18 17:26:08 2010 +0100
@@ -0,0 +1,55 @@
+#
+# 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: 
+# delete_on_failed_compile.py
+# This is a test module for verifying the delete on failed compile 
+# work around for RVCT 2.2. It creates a dummy object file and 
+# exits with an error code which should result in object files being deleted.
+# It takes the same arguments as armcc, but ignores them all apart from -o.
+#
+
+import sys
+import os
+import re
+
+# Parse for -o argument.
+objectfile_re = re.compile(".*-o\s(\S*\.(o|pre))\s.*", re.I)
+res = objectfile_re.match(" ".join(sys.argv[1:]))
+
+if res:
+	objectpath = res.group(1)
+	print "Found object file %s" % objectpath
+	objectdirectory = os.path.dirname(objectpath)
+	
+	# Make the directory if it doesn't exist
+	if not os.path.isdir(objectdirectory):
+		try:
+			os.makedirs(objectdirectory)
+		except:
+			print "Not making directory %s" % objectdirectory
+	
+	# Try to write something to the .o file
+	try:
+		fh = open(objectpath, "w")
+		fh.write("Fake object file for delete on failed compile test\n")
+		fh.close()
+	except Exception as error:
+		print "Failed to created object file %s; error was: %s" % (objectfile, str(error))
+else:
+	print "Failed to determine object filename. Commandline used was: %s" % " ".join(sys.argv[1:])
+
+# Always exit with an error
+print "Exiting with non-zero exit code." 
+sys.exit(1)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/test_resources/simple/compilervariants/delete_on_failed_compile_compiler_variants.xml	Tue May 18 17:26:08 2010 +0100
@@ -0,0 +1,8 @@
+<?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">
+	<!-- Fake compiler variant for testing the  -->	
+	<var name="fake_compiler">
+		<set name='CC' value='python -u $(SBS_HOME)/test/smoke_suite/test_resources/scripts/delete_on_failed_compile.py'/>
+	</var>
+
+</build>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/test_resources/simple/makevariants/delete_on_failed_compile_make_variants.xml	Tue May 18 17:26:08 2010 +0100
@@ -0,0 +1,60 @@
+<?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">
+	<!-- Some make engines for test purposes -->
+	
+	<!-- Raptor make engine for GNU make -->
+	<var name="make_engine">
+		<varRef ref="default.locations"/>
+
+		<!-- Shell settings -->
+		<set name='DEFAULT_SHELL' value='$(SBS_HOME)/$(HOSTPLATFORM_DIR)/bin/talon$(DOTEXE)' type='tool'/>
+		<set name='TALON_SHELL' value='$(SBS_SHELL)' type='tool'/>
+		<set name='USE_TALON' value='1'/>
+		<set name='TALON_TIMEOUT' value='600000'/>
+		<set name='TALON_DESCRAMBLE' value='1'/>
+		
+		<!-- Command-line for initialisation -->
+		<set name="initialise" value=""/>
+
+		<!-- Command-line for shutdown -->
+		<set name="shutdown" value=""/>
+
+		<!-- Command-line for build  -->
+		<set name="build" value="$(GNUMAKE38) HAVE_ORDERONLY=1 -r" type="tool"/>
+
+		<!-- Options  -->
+		<set name="makefile" value="-f"/>
+		<set name="keep_going" value="-k"/>
+		<set name="jobs" value="-j"/>
+		
+		<!-- The following are stuck on the commandline before any options
+		     specified by the sbs "mo" option, so they can be overridden -->
+		<set name="defaultoptions" value=""/>
+
+		<!-- How to split out the makefiles -->
+		<set name="selectors" value="export,bitmap,resource_deps,resource,default"/>
+		<set name="export.selector.iface" value="\.export$"/>
+		<set name="export.selector.target" value="EXPORT"/>
+		<set name="bitmap.selector.iface" value="\.(bitmap|extension|mifconv)$"/>
+		<set name="bitmap.selector.target" value="BITMAP"/>
+		<set name="resource_deps.selector.iface" value="\.resource$"/>
+		<set name="resource_deps.selector.target" value="RESOURCE_DEPS"/>
+		<set name="resource_deps.selector.ignoretargets" value="^(RESOURCE|CLEAN|CLEANEXPORT|REALLYCLEAN)$"/>
+		<set name="resource.selector.iface" value="\.(resource|extension|mif2cdlindex|nativejava)$"/>
+		<set name="resource.selector.target" value="RESOURCE"/>
+		<set name="default.selector.iface" value="\.(?!export$|bitmap$|resource$|mifconv$|mif2cdlindex$|nativejava$).*$"/>
+		<set name="default.selector.target" value="ALL"/>
+
+		<!-- is the text output with -j buffered or scrambled? -->
+		<set name="scrambled" value="true"/>
+	</var>
+	
+	<alias name="make_test" meaning="make_engine"/>
+
+	<!-- use the talon shell -->
+	<var name="make_no_talon_engine_test" extends="make_engine_test">
+	        <set name='DEFAULT_SHELL' value='$(SBS_SHELL)' type='tool'/>
+	        <set name='USE_TALON' value=''/>
+	</var>
+</build>
+
--- a/sbsv2/raptor/test/smoke_suite/tracecompiler_whatlog.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/tracecompiler_whatlog.py	Tue May 18 17:26:08 2010 +0100
@@ -62,14 +62,6 @@
 		]		
 	t.run("linux")
 	if t.result == CheckWhatSmokeTest.SKIP:
-		t.targets.extend([
-			'$(EPOCROOT)/epoc32/release/armv5/lib/testTC.lib',
-			'$(EPOCROOT)/epoc32/release/armv5/lib/testTC{000a0000}.lib'
-		])
-		t.stdout.extend([
-			'<build>$(EPOCROOT)/epoc32/release/armv5/lib/testTC.lib</build>',
-			'<build>$(EPOCROOT)/epoc32/release/armv5/lib/testTC{000a0000}.lib</build>'
-		])
 		t.run("windows")
 
 	t.id = "112"
--- a/sbsv2/raptor/test/smoke_suite/unfrozen.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/unfrozen.py	Tue May 18 17:26:08 2010 +0100
@@ -156,14 +156,7 @@
 				]
 	t.warnings = 8
 	# ABIv1 .lib files are not generated on Linux
-	t.run("linux")
-	if t.result == SmokeTest.SKIP:
-		t.targets.extend([
-			"$(EPOCROOT)/epoc32/release/armv5/lib/unfrozensymbols.lib",
-			"$(EPOCROOT)/epoc32/release/armv5/lib/unfrozensymbols{000a0000}.lib",
-			"$(EPOCROOT)/epoc32/release/armv5/lib/unfrozensymbols2.lib",
-			"$(EPOCROOT)/epoc32/release/armv5/lib/unfrozensymbols2{000a0000}.lib"
-			])
-		t.run("windows")
+	t.run()
 	
+	t.print_result()
 	return t
--- a/sbsv2/raptor/test/smoke_suite/whatcomp.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/whatcomp.py	Tue May 18 17:26:08 2010 +0100
@@ -67,7 +67,7 @@
 	t.warnings = warnings
 	t.run()
 
-	t.id = "0106a"
+	t.id = "0106b"
 	t.name = "whatcomp_component_repeated"
 	t.description = """
 			It is possible for what information about a component to not be grouped
@@ -89,5 +89,6 @@
 	t.run()
 
 	t.id = "0106"
+	t.name = "whatcomp"
 	t.print_result()
 	return t
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/unit_suite/raptor_api_unit.py	Tue May 18 17:26:08 2010 +0100
@@ -0,0 +1,104 @@
+#
+# 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: 
+# raptor_api_unit module
+
+import generic_path
+import raptor
+import raptor_api
+import unittest
+
+class TestRaptorApi(unittest.TestCase):
+			
+	def testContext(self):
+		api = raptor_api.Context()
+		
+	def testContextInitialiser(self):
+		r = raptor.Raptor()
+		api = raptor_api.Context(r)
+		
+	def testAliases(self):
+		r = raptor.Raptor()
+		r.cache.Load( generic_path.Join(r.home, "test", "config", "api.xml") )
+
+		api = raptor_api.Context(r)
+	
+		aliases = api.getaliases() # type == ""
+		self.failUnlessEqual(len(aliases), 4)
+		self.failUnlessEqual(set(["alias_A","alias_B","s1","s2"]),
+							 set(a.name for a in aliases))
+		
+		aliases = api.getaliases(raptor_api.ALL) # ignore type
+		self.failUnlessEqual(len(aliases), 6)
+		
+		aliases = api.getaliases("X") # type == "X"
+		self.failUnlessEqual(len(aliases), 1)
+		self.failUnlessEqual(aliases[0].name, "alias_D")
+		self.failUnlessEqual(aliases[0].meaning, "a.b.c.d")
+	
+	def testConfig(self):
+		r = raptor.Raptor()
+		r.cache.Load( generic_path.Join(r.home, "test", "config", "api.xml") )
+
+		api = raptor_api.Context(r)
+		
+		if r.filesystem == "unix":
+			path = "/home/raptor/foo/bar"
+		else:
+			path = "C:/home/raptor/foo/bar"
+			
+		config = api.getconfig("buildme")
+		self.failUnlessEqual(config.fullname, "buildme")
+		self.failUnlessEqual(config.outputpath, path)
+		
+		config = api.getconfig("buildme.foo")
+		self.failUnlessEqual(config.fullname, "buildme.foo")
+		self.failUnlessEqual(config.outputpath, path)
+		
+		config = api.getconfig("s1")
+		self.failUnlessEqual(config.fullname, "buildme.foo")
+		self.failUnlessEqual(config.outputpath, path)
+		
+		config = api.getconfig("s2.product_A")
+		self.failUnlessEqual(config.fullname, "buildme.foo.bar.product_A")
+		self.failUnlessEqual(config.outputpath, path)
+		
+	def testProducts(self):
+		r = raptor.Raptor()
+		r.cache.Load( generic_path.Join(r.home, "test", "config", "api.xml") )
+
+		api = raptor_api.Context(r)
+		
+		products = api.getproducts() # type == "product"
+		self.failUnlessEqual(len(products), 2)
+		self.failUnlessEqual(set(["product_A","product_C"]),
+							 set(p.name for p in products))
+		
+# run all the tests
+
+from raptor_tests import SmokeTest
+
+def run():
+	t = SmokeTest()
+	t.name = "raptor_api_unit"
+
+	tests = unittest.makeSuite(TestRaptorApi)
+	result = unittest.TextTestRunner(verbosity=2).run(tests)
+
+	if result.wasSuccessful():
+		t.result = SmokeTest.PASS
+	else:
+		t.result = SmokeTest.FAIL
+
+	return t
--- a/sbsv2/raptor/test/unit_suite/raptor_cli_unit.py	Tue May 18 17:23:01 2010 +0100
+++ b/sbsv2/raptor/test/unit_suite/raptor_cli_unit.py	Tue May 18 17:26:08 2010 +0100
@@ -153,6 +153,9 @@
 	def AddProject(self, project):
 		return True
 
+	def AddQuery(self, query):
+		return True
+	
 	def PrintVersion(self):
 		return True