Support for FEATUREVARIANTSAFE. wip
authorJon Chatten
Fri, 05 Mar 2010 14:37:08 +0000
branchwip
changeset 347 018461a64038
parent 343 927c16c07c88
child 348 7e804508da51
Support for FEATUREVARIANTSAFE.
sbsv2/raptor/lib/flm/e32abiv2.flm
sbsv2/raptor/lib/flm/standard.xml
sbsv2/raptor/test/smoke_suite/featurevariants.py
sbsv2/raptor/test/smoke_suite/test_resources/bv/bv_test.xml
sbsv2/raptor/test/smoke_suite/test_resources/bv/config/properties/os_properties.xml
sbsv2/raptor/test/smoke_suite/test_resources/bv/config/variants/bv_test.xml
--- a/sbsv2/raptor/lib/flm/e32abiv2.flm	Tue Mar 02 13:58:32 2010 +0000
+++ b/sbsv2/raptor/lib/flm/e32abiv2.flm	Fri Mar 05 14:37:08 2010 +0000
@@ -16,15 +16,37 @@
 #
 #
 
-# Only build feature invariant binaries in non-product builds *and*
-# Only build feature variant binaries in product builds.
+# Feature/Binary Variation
+#
+# FEATUREVARIANTNAME != "" implies a product build configuration
+# FEATUREVARIANT == 1 implies a .mmp defined feature variant binary
+#
+# By default:
+#   Build all binaries in non-product builds *and*
+#   Only build feature variant binaries in product builds.
+#
+#   test FEATUREVARIANTNAME=="" or FEATUREVARIANT==1
+#
+# If FEATUREVARIANTSAFE is set:
+#   Only build feature invariant binaries in non-product builds *and*
+#   Only build feature variant binaries in product builds.
 #
-# FEATUREVARIANTNAME != "" implies product build
-# FEATUREVARIANT == 1 implies a feature variant binary
+#   test (FEATUREVARIANTNAME=="" and FEATUREVARIANT=="") or
+#        (FEATUREVARIANTNAME!="" and FEATUREVARIANT==1)
 #
-# test FEATUREVARIANTNAME=="" or FEATUREVARIANT==1
-#
-ifneq ($(or $(call equal,$(FEATUREVARIANTNAME),),$(call equal,$(FEATUREVARIANT),1)),)
+
+DOBUILD:=
+ifeq ($(FEATUREVARIANTSAFE),)
+  DOBUILD:=$(if $(or $(call equal,$(FEATUREVARIANTNAME),),\
+                     $(call equal,$(FEATUREVARIANT),1)),1)
+else
+  DOBUILD:=$(if $(or $(and $(call equal,$(FEATUREVARIANTNAME),),\
+                           $(call equal,$(FEATUREVARIANT),)),\
+                     $(and $(call not,$(call equal,$(FEATUREVARIANTNAME),)),\
+                           $(call equal,$(FEATUREVARIANT),1))),1)
+endif
+
+ifeq ($(DOBUILD),1)
 
 $(if $(FLMDEBUG),$(info <flm name='e32abiv2' target='$(TARGET)' type='$(TARGETTYPE)' outputpath='$(OUTPUTPATH)' metasource='$(METASOURCE)' postlinkfiletype='$(POSTLINKFILETYPE)' />))
 
@@ -1250,7 +1272,7 @@
 # For the --what option and the log file
 $(call raptor_release,$(filter-out %.sym,$(WHATRELEASE)))
 
-endif # FEATUREVARIANTNAME=="" or FEATUREVARIANT==1
+endif # DOBUILD
 
 ## The End
 
--- a/sbsv2/raptor/lib/flm/standard.xml	Tue Mar 02 13:58:32 2010 +0000
+++ b/sbsv2/raptor/lib/flm/standard.xml	Fri Mar 05 14:37:08 2010 +0000
@@ -116,6 +116,7 @@
 		<param name='FEATURELISTFILES' default=''/>
 		<param name='FEATUREVARIANT' default=''/>
 		<param name='FEATUREVARIANTNAME' default=''/>
+		<param name='FEATUREVARIANTSAFE' default=''/>
 		<param name='FPMODE_OPTION'/>
 		<param name='FROMELF'/>
 		<param name='FULLVARIANTPATH'/>
--- a/sbsv2/raptor/test/smoke_suite/featurevariants.py	Tue Mar 02 13:58:32 2010 +0000
+++ b/sbsv2/raptor/test/smoke_suite/featurevariants.py	Fri Mar 05 14:37:08 2010 +0000
@@ -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"
@@ -14,89 +14,134 @@
 # Description: 
 #
 
-from raptor_tests import SmokeTest
+from raptor_tests import AntiTargetSmokeTest, ReplaceEnvs
 import os
 
 def run():
-	t = SmokeTest()
-	
-	# tests for building feature variants
-	t.id = "56"
-	t.name = "featurevariants"
+	t = AntiTargetSmokeTest()
 	t.usebash = True
-	t.command = "sbs -b smoke_suite/test_resources/bv/bld.inf -c armv5 " + \
-                "-c armv5.test_bv_1 -c armv5.test_bv_2 -c armv5.test_bv_3 " + \
-                "--configpath=test/smoke_suite/test_resources/bv -f-"
-	t.targets = [
-		# prebuilt files
+	
+	preBuiltTargets = [
 		"$(EPOCROOT)/epoc32/release/armv5/udeb/dummy.lib",
 		"$(EPOCROOT)/epoc32/release/armv5/urel/dummy.lib",
 		"$(EPOCROOT)/epoc32/release/armv5/udeb/debfake.lib",
-		"$(EPOCROOT)/epoc32/release/armv5/urel/relfake.lib",
-		
-		# built files
+		"$(EPOCROOT)/epoc32/release/armv5/urel/relfake.lib"
+		]
+	
+	invariantTargets = [
 		"$(EPOCROOT)/epoc32/release/armv5/udeb/createstaticdll_invariant.dll",
 		"$(EPOCROOT)/epoc32/release/armv5/udeb/createstaticdll_invariant.dll.map",
 		"$(EPOCROOT)/epoc32/release/armv5/udeb/createstaticdll_invariant.dll.sym",
 		"$(EPOCROOT)/epoc32/release/armv5/urel/createstaticdll_invariant.dll",
 		"$(EPOCROOT)/epoc32/release/armv5/urel/createstaticdll_invariant.dll.map",
 		"$(EPOCROOT)/epoc32/release/armv5/urel/createstaticdll_invariant.dll.sym",
+		"$(EPOCROOT)/epoc32/release/armv5/lib/createstaticdll_invariant.dso",
+		"$(EPOCROOT)/epoc32/release/armv5/lib/createstaticdll_invariant{000a0000}.dso"
+		]
+	
+	variantTargetsDefaultTree = [
+		"$(EPOCROOT)/epoc32/release/armv5/udeb/createstaticdll_variant1.dll",
+		"$(EPOCROOT)/epoc32/release/armv5/udeb/createstaticdll_variant1.dll.map",
+		"$(EPOCROOT)/epoc32/release/armv5/udeb/createstaticdll_variant1.dll.sym",
+		"$(EPOCROOT)/epoc32/release/armv5/udeb/createstaticdll_variant2.dll",
+		"$(EPOCROOT)/epoc32/release/armv5/udeb/createstaticdll_variant2.dll.map",
+		"$(EPOCROOT)/epoc32/release/armv5/udeb/createstaticdll_variant2.dll.sym",
+		"$(EPOCROOT)/epoc32/release/armv5/udeb/createexe_variant3.exe",
+		"$(EPOCROOT)/epoc32/release/armv5/udeb/createexe_variant3.exe.map",
+		"$(EPOCROOT)/epoc32/release/armv5/udeb/createexe_variant3.exe.sym",
 
+		"$(EPOCROOT)/epoc32/release/armv5/urel/createstaticdll_variant1.dll",
+		"$(EPOCROOT)/epoc32/release/armv5/urel/createstaticdll_variant1.dll.map",
+		"$(EPOCROOT)/epoc32/release/armv5/urel/createstaticdll_variant1.dll.sym",
+		"$(EPOCROOT)/epoc32/release/armv5/urel/createstaticdll_variant2.dll",
+		"$(EPOCROOT)/epoc32/release/armv5/urel/createstaticdll_variant2.dll.map",
+		"$(EPOCROOT)/epoc32/release/armv5/urel/createstaticdll_variant2.dll.sym",
+		"$(EPOCROOT)/epoc32/release/armv5/urel/createexe_variant3.exe",
+		"$(EPOCROOT)/epoc32/release/armv5/urel/createexe_variant3.exe.map",
+		"$(EPOCROOT)/epoc32/release/armv5/urel/createexe_variant3.exe.sym"
+		]
+	
+	variantTargetsProductTrees = [		
 		"$(EPOCROOT)/epoc32/release/armv5.one/udeb/createstaticdll_variant1.dll",
 		"$(EPOCROOT)/epoc32/release/armv5.one/udeb/createstaticdll_variant1.dll.map",
+		"$(EPOCROOT)/epoc32/release/armv5.one/udeb/createstaticdll_variant1.dll.sym",
 		"$(EPOCROOT)/epoc32/release/armv5.one/udeb/createstaticdll_variant1.dll.vmap",
 		"$(EPOCROOT)/epoc32/release/armv5.one/udeb/createstaticdll_variant2.dll",
 		"$(EPOCROOT)/epoc32/release/armv5.one/udeb/createstaticdll_variant2.dll.map",
+		"$(EPOCROOT)/epoc32/release/armv5.one/udeb/createstaticdll_variant1.dll.sym",
 		"$(EPOCROOT)/epoc32/release/armv5.one/udeb/createstaticdll_variant2.dll.vmap",
+		"$(EPOCROOT)/epoc32/release/armv5.one/udeb/createexe_variant3.exe",
+		"$(EPOCROOT)/epoc32/release/armv5.one/udeb/createexe_variant3.exe.map",
+		"$(EPOCROOT)/epoc32/release/armv5.one/udeb/createexe_variant3.exe.sym",
 		"$(EPOCROOT)/epoc32/release/armv5.one/udeb/createexe_variant3.exe.vmap",
 
 		"$(EPOCROOT)/epoc32/release/armv5.one/urel/createstaticdll_variant1.dll",
 		"$(EPOCROOT)/epoc32/release/armv5.one/urel/createstaticdll_variant1.dll.map",
+		"$(EPOCROOT)/epoc32/release/armv5.one/urel/createstaticdll_variant1.dll.sym",
 		"$(EPOCROOT)/epoc32/release/armv5.one/urel/createstaticdll_variant1.dll.vmap",
 		"$(EPOCROOT)/epoc32/release/armv5.one/urel/createstaticdll_variant2.dll",
 		"$(EPOCROOT)/epoc32/release/armv5.one/urel/createstaticdll_variant2.dll.map",
+		"$(EPOCROOT)/epoc32/release/armv5.one/urel/createstaticdll_variant2.dll.sym",
 		"$(EPOCROOT)/epoc32/release/armv5.one/urel/createstaticdll_variant2.dll.vmap",
+		"$(EPOCROOT)/epoc32/release/armv5.one/urel/createexe_variant3.exe",
+		"$(EPOCROOT)/epoc32/release/armv5.one/urel/createexe_variant3.exe.map",
+		"$(EPOCROOT)/epoc32/release/armv5.one/urel/createexe_variant3.exe.sym",		
 		"$(EPOCROOT)/epoc32/release/armv5.one/urel/createexe_variant3.exe.vmap",
 
 		"$(EPOCROOT)/epoc32/release/armv5.two/udeb/createstaticdll_variant1.dll",
 		"$(EPOCROOT)/epoc32/release/armv5.two/udeb/createstaticdll_variant1.dll.map",
+		"$(EPOCROOT)/epoc32/release/armv5.two/udeb/createstaticdll_variant1.dll.sym",
 		"$(EPOCROOT)/epoc32/release/armv5.two/udeb/createstaticdll_variant1.dll.vmap",
 		"$(EPOCROOT)/epoc32/release/armv5.two/udeb/createstaticdll_variant2.dll",
 		"$(EPOCROOT)/epoc32/release/armv5.two/udeb/createstaticdll_variant2.dll.map",
+		"$(EPOCROOT)/epoc32/release/armv5.two/udeb/createstaticdll_variant2.dll.sym",
 		"$(EPOCROOT)/epoc32/release/armv5.two/udeb/createstaticdll_variant2.dll.vmap",
+		"$(EPOCROOT)/epoc32/release/armv5.two/udeb/createexe_variant3.exe",
+		"$(EPOCROOT)/epoc32/release/armv5.two/udeb/createexe_variant3.exe.map",
+		"$(EPOCROOT)/epoc32/release/armv5.two/udeb/createexe_variant3.exe.sym",
 		"$(EPOCROOT)/epoc32/release/armv5.two/udeb/createexe_variant3.exe.vmap",
 		
 		"$(EPOCROOT)/epoc32/release/armv5.two/urel/createstaticdll_variant1.dll",
 		"$(EPOCROOT)/epoc32/release/armv5.two/urel/createstaticdll_variant1.dll.map",
+		"$(EPOCROOT)/epoc32/release/armv5.two/urel/createstaticdll_variant1.dll.sym",
 		"$(EPOCROOT)/epoc32/release/armv5.two/urel/createstaticdll_variant1.dll.vmap",
 		"$(EPOCROOT)/epoc32/release/armv5.two/urel/createstaticdll_variant2.dll",
 		"$(EPOCROOT)/epoc32/release/armv5.two/urel/createstaticdll_variant2.dll.map",
+		"$(EPOCROOT)/epoc32/release/armv5.two/urel/createstaticdll_variant2.dll.sym",
 		"$(EPOCROOT)/epoc32/release/armv5.two/urel/createstaticdll_variant2.dll.vmap",
+		"$(EPOCROOT)/epoc32/release/armv5.two/urel/createexe_variant3.exe",
+		"$(EPOCROOT)/epoc32/release/armv5.two/urel/createexe_variant3.exe.map",
+		"$(EPOCROOT)/epoc32/release/armv5.two/urel/createexe_variant3.exe.sym",
 		"$(EPOCROOT)/epoc32/release/armv5.two/urel/createexe_variant3.exe.vmap",
 
 		"$(EPOCROOT)/epoc32/release/armv5.three/udeb/createstaticdll_variant1.dll",
 		"$(EPOCROOT)/epoc32/release/armv5.three/udeb/createstaticdll_variant1.dll.map",
+		"$(EPOCROOT)/epoc32/release/armv5.three/udeb/createstaticdll_variant1.dll.sym",
 		"$(EPOCROOT)/epoc32/release/armv5.three/udeb/createstaticdll_variant1.dll.vmap",
 		"$(EPOCROOT)/epoc32/release/armv5.three/udeb/createstaticdll_variant2.dll",
 		"$(EPOCROOT)/epoc32/release/armv5.three/udeb/createstaticdll_variant2.dll.map",
+		"$(EPOCROOT)/epoc32/release/armv5.three/udeb/createstaticdll_variant2.dll.sym",
 		"$(EPOCROOT)/epoc32/release/armv5.three/udeb/createstaticdll_variant2.dll.vmap",
+		"$(EPOCROOT)/epoc32/release/armv5.three/udeb/createexe_variant3.exe",
+		"$(EPOCROOT)/epoc32/release/armv5.three/udeb/createexe_variant3.exe.map",
+		"$(EPOCROOT)/epoc32/release/armv5.three/udeb/createexe_variant3.exe.sym",
 		"$(EPOCROOT)/epoc32/release/armv5.three/udeb/createexe_variant3.exe.vmap",
 		
 		"$(EPOCROOT)/epoc32/release/armv5.three/urel/createstaticdll_variant1.dll",
 		"$(EPOCROOT)/epoc32/release/armv5.three/urel/createstaticdll_variant1.dll.map",
+		"$(EPOCROOT)/epoc32/release/armv5.three/urel/createstaticdll_variant1.dll.sym",
 		"$(EPOCROOT)/epoc32/release/armv5.three/urel/createstaticdll_variant1.dll.vmap",
 		"$(EPOCROOT)/epoc32/release/armv5.three/urel/createstaticdll_variant2.dll",
 		"$(EPOCROOT)/epoc32/release/armv5.three/urel/createstaticdll_variant2.dll.map",
+		"$(EPOCROOT)/epoc32/release/armv5.three/urel/createstaticdll_variant2.dll.sym",
 		"$(EPOCROOT)/epoc32/release/armv5.three/urel/createstaticdll_variant2.dll.vmap",
+		"$(EPOCROOT)/epoc32/release/armv5.three/urel/createexe_variant3.exe",
+		"$(EPOCROOT)/epoc32/release/armv5.three/urel/createexe_variant3.exe.map",
+		"$(EPOCROOT)/epoc32/release/armv5.three/urel/createexe_variant3.exe.sym",
 		"$(EPOCROOT)/epoc32/release/armv5.three/urel/createexe_variant3.exe.vmap",
-
-		"$(EPOCROOT)/epoc32/release/armv5/lib/createstaticdll_invariant.dso",
-		"$(EPOCROOT)/epoc32/release/armv5/lib/createstaticdll_invariant{000a0000}.dso",
-		"$(EPOCROOT)/epoc32/release/armv5/lib/createstaticdll_variant1.dso",
-		"$(EPOCROOT)/epoc32/release/armv5/lib/createstaticdll_variant1{000a0000}.dso",
-		"$(EPOCROOT)/epoc32/release/armv5/lib/createstaticdll_variant2.dso",
-		"$(EPOCROOT)/epoc32/release/armv5/lib/createstaticdll_variant2{000a0000}.dso",
-
+		]
+	
+	variantTargetsGeneric = [
 		"$(EPOCROOT)/epoc32/data/z/resource/apps/dummy_var1.rsc",
 		"$(EPOCROOT)/epoc32/include/dummy_var1.rsg",
 		"$(EPOCROOT)/epoc32/data/z/resource/apps/dummy_var2.rsc",
@@ -104,9 +149,14 @@
 		"$(EPOCROOT)/epoc32/data/z/resource/apps/dummy_var3.rsc",
 		"$(EPOCROOT)/epoc32/include/dummy_var3.rsg",
 		"$(EPOCROOT)/epoc32/data/z/resource/apps/dummy_inv.rsc",
-		"$(EPOCROOT)/epoc32/include/dummy_inv.rsg"
+		"$(EPOCROOT)/epoc32/include/dummy_inv.rsg",
+		"$(EPOCROOT)/epoc32/release/armv5/lib/createstaticdll_variant1.dso",
+		"$(EPOCROOT)/epoc32/release/armv5/lib/createstaticdll_variant1{000a0000}.dso",
+		"$(EPOCROOT)/epoc32/release/armv5/lib/createstaticdll_variant2.dso",
+		"$(EPOCROOT)/epoc32/release/armv5/lib/createstaticdll_variant2{000a0000}.dso"
 		]
-	t.addbuildtargets('smoke_suite/test_resources/bv/bld.inf', [
+	
+	invariantBuildTargets = [
 		"createstaticdll_invariant_dll/armv5/udeb/CreateStaticDLL_invariant.o",
 		"createstaticdll_invariant_dll/armv5/udeb/CreateStaticDLL_invariant.o.d",
 		"createstaticdll_invariant_dll/armv5/udeb/createstaticdll_invariant_udeb_objects.via",
@@ -119,15 +169,41 @@
 		"createstaticdll_invariant_dll/armv5/urel/createstaticdll_invariant{000a0000}.dso",
 		
 		"dummy_inv_dll/dummy_inv__resource_apps_sc.rpp",
-		"dummy_inv_dll/dummy_inv__resource_apps_sc.rpp.d",
-		"dummy_var1_dll/dummy_var1__resource_apps_sc.rpp",
-		"dummy_var1_dll/dummy_var1__resource_apps_sc.rpp.d",
-		"dummy_var2_dll/dummy_var2__resource_apps_sc.rpp",
-		"dummy_var2_dll/dummy_var2__resource_apps_sc.rpp.d",
-		"dummy_var3_exe/dummy_var3__resource_apps_sc.rpp",
-		"dummy_var3_exe/dummy_var3__resource_apps_sc.rpp.d",
+		"dummy_inv_dll/dummy_inv__resource_apps_sc.rpp.d"
+		]
+
+	variantBuildTargetsDefaultTree = [
+		"createstaticdll_variant1_dll/armv5/udeb/CreateStaticDLL_variant1.o",
+		"createstaticdll_variant1_dll/armv5/udeb/CreateStaticDLL_variant1.o.d",
+		"createstaticdll_variant1_dll/armv5/udeb/createstaticdll_variant1_udeb_objects.via",
+		"createstaticdll_variant1_dll/armv5/udeb/createstaticdll_variant1{000a0000}.def",
+		"createstaticdll_variant1_dll/armv5/udeb/createstaticdll_variant1{000a0000}.dso",
+		"createstaticdll_variant1_dll/armv5/urel/CreateStaticDLL_variant1.o",
+		"createstaticdll_variant1_dll/armv5/urel/CreateStaticDLL_variant1.o.d",
+		"createstaticdll_variant1_dll/armv5/urel/createstaticdll_variant1_urel_objects.via",
+		"createstaticdll_variant1_dll/armv5/urel/createstaticdll_variant1{000a0000}.def",
+		"createstaticdll_variant1_dll/armv5/urel/createstaticdll_variant1{000a0000}.dso",
 		
+		"createstaticdll_variant2_dll/armv5/udeb/CreateStaticDLL_variant2.o",
+		"createstaticdll_variant2_dll/armv5/udeb/CreateStaticDLL_variant2.o.d",
+		"createstaticdll_variant2_dll/armv5/udeb/createstaticdll_variant2_udeb_objects.via",
+		"createstaticdll_variant2_dll/armv5/udeb/createstaticdll_variant2{000a0000}.def",
+		"createstaticdll_variant2_dll/armv5/udeb/createstaticdll_variant2{000a0000}.dso",
+		"createstaticdll_variant2_dll/armv5/urel/CreateStaticDLL_variant2.o",
+		"createstaticdll_variant2_dll/armv5/urel/CreateStaticDLL_variant2.o.d",
+		"createstaticdll_variant2_dll/armv5/urel/createstaticdll_variant2_urel_objects.via",
+		"createstaticdll_variant2_dll/armv5/urel/createstaticdll_variant2{000a0000}.def",
+		"createstaticdll_variant2_dll/armv5/urel/createstaticdll_variant2{000a0000}.dso",
 		
+		"createexe_variant3_exe/armv5/udeb/CreateEXE_variant3.o",
+		"createexe_variant3_exe/armv5/udeb/CreateEXE_variant3.o.d",
+		"createexe_variant3_exe/armv5/udeb/createexe_variant3_udeb_objects.via",
+		"createexe_variant3_exe/armv5/urel/CreateEXE_variant3.o",
+		"createexe_variant3_exe/armv5/urel/CreateEXE_variant3.o.d",
+		"createexe_variant3_exe/armv5/urel/createexe_variant3_urel_objects.via"
+		]
+	
+	variantBuildTargetsProductTrees = [		
 		"createstaticdll_variant1_dll/armv5.one/udeb/CreateStaticDLL_variant1.o",
 		"createstaticdll_variant1_dll/armv5.one/udeb/CreateStaticDLL_variant1.o.d",
 		"createstaticdll_variant1_dll/armv5.one/udeb/createstaticdll_variant1_udeb_objects.via",
@@ -157,7 +233,6 @@
 		"createexe_variant3_exe/armv5.one/urel/CreateEXE_variant3.o.d",
 		"createexe_variant3_exe/armv5.one/urel/createexe_variant3_urel_objects.via",
 		
-		
 		"createstaticdll_variant1_dll/armv5.two/udeb/CreateStaticDLL_variant1.o",
 		"createstaticdll_variant1_dll/armv5.two/udeb/CreateStaticDLL_variant1.o.d",
 		"createstaticdll_variant1_dll/armv5.two/udeb/createstaticdll_variant1_udeb_objects.via",
@@ -187,7 +262,6 @@
 		"createexe_variant3_exe/armv5.two/urel/CreateEXE_variant3.o.d",
 		"createexe_variant3_exe/armv5.two/urel/createexe_variant3_urel_objects.via",
 		
-		
 		"createstaticdll_variant1_dll/armv5.three/udeb/CreateStaticDLL_variant1.o",
 		"createstaticdll_variant1_dll/armv5.three/udeb/CreateStaticDLL_variant1.o.d",
 		"createstaticdll_variant1_dll/armv5.three/udeb/createstaticdll_variant1_udeb_objects.via",
@@ -216,14 +290,59 @@
 		"createexe_variant3_exe/armv5.three/urel/CreateEXE_variant3.o",
 		"createexe_variant3_exe/armv5.three/urel/CreateEXE_variant3.o.d",
 		"createexe_variant3_exe/armv5.three/urel/createexe_variant3_urel_objects.via"
-	])
+		]
+	
+	variantBuildTargetsGeneric = [
+		"dummy_var1_dll/dummy_var1__resource_apps_sc.rpp",
+		"dummy_var1_dll/dummy_var1__resource_apps_sc.rpp.d",
+		"dummy_var2_dll/dummy_var2__resource_apps_sc.rpp",
+		"dummy_var2_dll/dummy_var2__resource_apps_sc.rpp.d",
+		"dummy_var3_exe/dummy_var3__resource_apps_sc.rpp",
+		"dummy_var3_exe/dummy_var3__resource_apps_sc.rpp.d"
+		]
+	
+	sbscommand = "sbs -b smoke_suite/test_resources/bv/bld.inf -c armv5 " + \
+				"-c armv5.test_bv_1 -c armv5.test_bv_2 -c armv5.test_bv_3 -f- " + \
+				"--configpath=test/smoke_suite/test_resources/bv/config/variants"
+	
+	t.id = "56a"
+	t.description = """Build variant and invariant components.
+		In this default mode of operation, all components build for the non-product armv5 config whereas
+		only variant components build for the armv5.* bv configs."""
+	t.name = "featurevariant_build"
+	t.command = sbscommand
+	t.targets = preBuiltTargets + invariantTargets + variantTargetsGeneric + variantTargetsDefaultTree + variantTargetsProductTrees							
+	t.addbuildtargets('smoke_suite/test_resources/bv/bld.inf',
+				invariantBuildTargets + variantBuildTargetsGeneric + variantBuildTargetsDefaultTree + variantBuildTargetsProductTrees	
+				)
 	# Test that static libs are linked from the invariant place.
 	t.mustmatch = [
 		"armlink.*epoc32/release/armv5/urel/bv_static_lib.lib",
 		"armlink.*epoc32/release/armv5/udeb/bv_static_lib.lib"
-	]
+		]
 	t.run()
 	
+	t.id = "56b"
+	t.description = """Build variant and invariant components using an os_properties.xml that sets FEATUREVARIANTSAFE=1.
+		With FEATUREVARIANTSAFE only invariant components build for the non-product armv5 config and
+		only variant components build for the armv5.* bv configs.""" 
+	t.name = "featurevariant_build_featurevariantsafe"
+	t.command = sbscommand + " --configpath=test/smoke_suite/test_resources/bv/config/properties"
+	t.targets = preBuiltTargets + invariantTargets + variantTargetsGeneric + variantTargetsProductTrees
+	t.addbuildtargets('smoke_suite/test_resources/bv/bld.inf',
+				invariantBuildTargets + variantBuildTargetsGeneric + variantBuildTargetsProductTrees	
+				)
+	t.antitargets = variantTargetsDefaultTree
+	t.addbuildantitargets('smoke_suite/test_resources/bv/bld.inf',
+				variantBuildTargetsDefaultTree
+				)
+	# Test that static libs are linked from the invariant place.
+	t.mustmatch = [
+		"armlink.*epoc32/release/armv5/urel/bv_static_lib.lib",
+		"armlink.*epoc32/release/armv5/udeb/bv_static_lib.lib"
+		]
+	t.run()
+
 	
 	# tests for the createvmap script
 	createvmap = "python $(SBS_HOME)/bin/createvmap.py"
@@ -247,7 +366,7 @@
 	srcWithout = " -s " + bvdata + "/without_macros.cpp"
 	badSrc = " -s " + bvdata + "/with_errors.cpp"
 
-	t.id = "56a"
+	t.id = "56c"
 	t.name = "createvmap exits with an error"
 	t.usebash = True
 	t.command = createvmap
@@ -257,7 +376,7 @@
 	t.run()
 
 	
-	t.id = "56b"
+	t.id = "56d"
 	t.name = "createvmap shows cpp errors"
 	t.usebash = True
 	t.command = createvmap + vmap + bvcpp + preinc + listA + badSrc
@@ -267,7 +386,7 @@
 	t.run()
 	
 	
-	t.id = "56c"
+	t.id = "56e"
 	t.name = "createvmap errors on missing feature list"
 	t.usebash = True
 	t.command = createvmap + vmap + bvcpp + preinc + listC + srcWith
@@ -277,7 +396,7 @@
 	t.run()
 	
 	
-	t.id = "56d"
+	t.id = "56f"
 	t.name = "createvmap warns on featureless code"
 	t.usebash = True
 	t.command = createvmap + vmap + bvcpp + preinc + listA + srcWithout
@@ -287,7 +406,7 @@
 	t.run()
 	
 	
-	t.id = "56e"
+	t.id = "56g"
 	t.name = "createvmap creates the right vmap file"
 	t.usebash = True
 	t.command = createvmap + vmap + bvcpp + preinc + listA + listB + srcWith + srcWithout + " && cat " + vmapfile
--- a/sbsv2/raptor/test/smoke_suite/test_resources/bv/bv_test.xml	Tue Mar 02 13:58:32 2010 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-<?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 feature variants -->
-		<var name="test_bv_1">
-			<set name='FEATUREVARIANTNAME' value='.one' />
-			<set name='FEATURELISTFILES'
-					value='$(SBS_HOME)/test/smoke_suite/test_resources/bv/listA.txt
-					$(SBS_HOME)/test/smoke_suite/test_resources/bv/listB.txt' />
-			<set name='VARIANT_HRH'
-					value='$(SBS_HOME)/test/smoke_suite/test_resources/bv/hrh/var1.hrh' />
-			<set name='SYSTEMINCLUDE'
-					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">
-			<set name='FEATUREVARIANTNAME' value='.two' />
-			<set name='FEATURELISTFILES'
-					value='$(SBS_HOME)/test/smoke_suite/test_resources/bv/listA.txt
-					$(SBS_HOME)/test/smoke_suite/test_resources/bv/listB.txt' />
-			<set name='VARIANT_HRH'
-					value='$(SBS_HOME)/test/smoke_suite/test_resources/bv/hrh/var2.hrh' />
-			<set name='SYSTEMINCLUDE'
-					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">
-			<set name='FEATUREVARIANTNAME' value='.three' />
-			<set name='FEATURELISTFILES'
-					value='$(SBS_HOME)/test/smoke_suite/test_resources/bv/listA.txt
-					$(SBS_HOME)/test/smoke_suite/test_resources/bv/listB.txt' />
-			<set name='VARIANT_HRH'
-					value='$(SBS_HOME)/test/smoke_suite/test_resources/bv/hrh/var3.hrh' />
-			<set name='SYSTEMINCLUDE'
-					value='$(SBS_HOME)/test/smoke_suite/test_resources/bv/var3
-					$(SBS_HOME)/test/smoke_suite/test_resources/bv/hrh' />
-		</var>
-	</build>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/test_resources/bv/config/properties/os_properties.xml	Fri Mar 05 14:37:08 2010 +0000
@@ -0,0 +1,12 @@
+<?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">
+        
+  <!-- Modify the root variant to turn on safe generation of Feature Variant binaries -->
+  <var name="root.changes">
+    <set name='FEATUREVARIANTSAFE' value='1'/>
+  </var>
+  
+</build>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/test_resources/bv/config/variants/bv_test.xml	Fri Mar 05 14:37:08 2010 +0000
@@ -0,0 +1,41 @@
+<?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 feature variants -->
+		<var name="test_bv_1">
+			<set name='FEATUREVARIANTNAME' value='.one' />
+			<set name='FEATURELISTFILES'
+					value='$(SBS_HOME)/test/smoke_suite/test_resources/bv/listA.txt
+					$(SBS_HOME)/test/smoke_suite/test_resources/bv/listB.txt' />
+			<set name='VARIANT_HRH'
+					value='$(SBS_HOME)/test/smoke_suite/test_resources/bv/hrh/var1.hrh' />
+			<set name='SYSTEMINCLUDE'
+					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">
+			<set name='FEATUREVARIANTNAME' value='.two' />
+			<set name='FEATURELISTFILES'
+					value='$(SBS_HOME)/test/smoke_suite/test_resources/bv/listA.txt
+					$(SBS_HOME)/test/smoke_suite/test_resources/bv/listB.txt' />
+			<set name='VARIANT_HRH'
+					value='$(SBS_HOME)/test/smoke_suite/test_resources/bv/hrh/var2.hrh' />
+			<set name='SYSTEMINCLUDE'
+					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">
+			<set name='FEATUREVARIANTNAME' value='.three' />
+			<set name='FEATURELISTFILES'
+					value='$(SBS_HOME)/test/smoke_suite/test_resources/bv/listA.txt
+					$(SBS_HOME)/test/smoke_suite/test_resources/bv/listB.txt' />
+			<set name='VARIANT_HRH'
+					value='$(SBS_HOME)/test/smoke_suite/test_resources/bv/hrh/var3.hrh' />
+			<set name='SYSTEMINCLUDE'
+					value='$(SBS_HOME)/test/smoke_suite/test_resources/bv/var3
+					$(SBS_HOME)/test/smoke_suite/test_resources/bv/hrh' />
+		</var>
+	</build>