--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/bin/vartoxml.py Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +1,207 @@
+#
+# Copyright (c) 2008-2009 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 Binary Variation var file to xml spec generator
+# Given a set of .var files, this script will generate an xml specification file
+#
+
+
+import sys,os,re,fnmatch
+import xml.dom.minidom
+from optparse import OptionParser
+
+doc = xml.dom.minidom.Document()
+class VarFile:
+
+ def __init__(self,aFile):
+ self.virtual = False
+ self.varname = ""
+ self.varhrh = ""
+ self.build_include = ""
+ self.rom_include = ""
+ self.extends = ""
+ self.file = aFile
+
+ # Parse the var file
+ def ParseVarFile(self):
+ file = open(self.file)
+ vardata = file.readlines()
+ for var in vardata:
+ if re.match('VARIANT\s+(?P<VARIANTNAME>\w+)',var):
+ self.varname = re.match('VARIANT\s+(?P<VARIANTNAME>\w+)',var)
+ elif re.match('VARIANT_HRH\s+(?P<VARIANTHRH>.+)',var):
+ self.varhrh = re.match('VARIANT_HRH\s+(?P<VARIANTHRH>.+)',var)
+ elif re.match('VIRTUAL\s+$',var):
+ self.virtual = True
+ elif re.match('BUILD_INCLUDE\s+.+',var):
+ self.build_include = re.match('BUILD_INCLUDE\s+(?P<PROPERTY>\w+)\s+(?P<LOCATION>.+)',var)
+ elif re.match('ROM_INCLUDE\s+.+',var):
+ self.rom_include = re.match('ROM_INCLUDE\s+(?P<PROPERTY>\w+)\s+(?P<LOCATION>.+)',var)
+ elif re.match('EXTENDS\s+(?P<EXTENDS>\w+)',var):
+ self.extends = re.match('EXTENDS\s+(?P<EXTENDSNODE>\w+)',var)
+ if self.varname:
+ self.varname = self.varname.group('VARIANTNAME')
+ if self.varhrh:
+ self.varhrh = self.varhrh.group('VARIANTHRH')
+ if self.extends:
+ self.extends = self.extends.group('EXTENDSNODE')
+ file.close()
+
+ # Write the specs for a variant object and attach it to a parent node
+ def CreateSpec(self,parentNode):
+
+ var = doc.createElement("var")
+ parentNode.appendChild(var)
+
+ # Set the FEATUREVARIANT name
+ vname = doc.createElement("set")
+ vname.setAttribute("name","FEATUREVARIANT")
+ vname.setAttribute("value",self.varname)
+ if self.virtual:
+ vname.setAttribute("abstract","true")
+ var.appendChild(vname)
+
+ # Set the VARIANT_HRH name
+ hrhname = doc.createElement("set")
+ hrhname.setAttribute("name","VARIANT_HRH")
+ hrhname.setAttribute("value",self.varhrh)
+ var.appendChild(hrhname)
+
+ # Set the build includes
+ if self.build_include:
+ buildincs = doc.createElement(self.build_include.group('PROPERTY'))
+ buildincs.setAttribute("name","BUILD_INCLUDE")
+ buildincs.setAttribute("value",self.build_include.group('LOCATION'))
+ var.appendChild(buildincs)
+
+ # Set the rom includes
+ if self.rom_include:
+ buildincs = doc.createElement(self.rom_include.group('PROPERTY'))
+ buildincs.setAttribute("name","ROM_INCLUDE")
+ buildincs.setAttribute("value",self.rom_include.group('LOCATION'))
+ var.appendChild(buildincs)
+
+# Main function
+def main():
+
+ parser = OptionParser(prog = "vartoxml.py")
+ parser.add_option("-s","--sourcefile",action="append",dest="varfile",help="List of var files")
+ parser.add_option("-o","--output",action="store",dest="outputxml",help="Output xml file")
+ parser.add_option("-d","--folder",action="store",dest="folder",help="Folder names to search for var files")
+
+ (options, leftover_args) = parser.parse_args(sys.argv[1:])
+
+ childlist = []
+ addedlist = []
+ nodesList = []
+ childnames = []
+ i = 0
+
+ # Get the list of .var file from the specified folder(s)
+ if options.folder:
+ for folder in options.folder:
+ for fileName in os.listdir (folder):
+ if fnmatch.fnmatch (fileName,'*.var'):
+ if options.varfile:
+ options.varfile.append(fileName)
+ else:
+ options.varfile = []
+ options.varfile.append(fileName)
+
+ # We need some source files for this script to work
+ if not options.varfile:
+ print "Error: No source files specified "
+ sys.exit()
+
+ # Set parent node to gibberish
+ parentNode = doc.createElement("build")
+ doc.appendChild(parentNode)
+ newparentNode = ""
+
+ # Removes duplicate elements in the arguments and iterate through them
+ # to find the top-level abstract parent node
+ for arg in list(set(options.varfile)):
+ varobj = VarFile(arg)
+ varobj.ParseVarFile()
+ if varobj.extends:
+ childlist.append(varobj)
+ else:
+ addedlist.append(varobj)
+ conf = doc.createElement("config")
+ conf.setAttribute("name",varobj.varname)
+ parentNode.appendChild(conf)
+ varobj.CreateSpec(conf)
+ nodesList.append(conf)
+
+ # Names of all the children need to be stored separately
+ for c in childlist:
+ childnames.append(c.varname)
+
+ childlist2 = list(childlist)
+
+ # Check the list is correct, and append orphan nodes to master BUILD node
+ for ch in childlist2:
+ if addedlist:
+ if not ch.extends in addedlist[0].varname:
+ if not ch.extends in childnames:
+ conf = doc.createElement("config")
+ conf.setAttribute("name",ch.varname)
+ parentNode.appendChild(conf)
+ varobj.CreateSpec(conf)
+ nodesList.append(conf)
+ addedlist.append(ch)
+ childlist.remove(ch)
+ else:
+ if not ch.extends in childnames:
+ conf = doc.createElement("config")
+ conf.setAttribute("name",ch.varname)
+ parentNode.appendChild(conf)
+ varobj.CreateSpec(conf)
+ nodesList.append(conf)
+ addedlist.append(ch)
+ childlist.remove(ch)
+
+ # Make a copy of the new childlist
+ childlist2 = list(childlist)
+
+ # Go through all the children, and add them to the xml spec
+ while (childlist2):
+ # Refactor the childlist to remove elements which have been added
+ for add in addedlist:
+ if add in childlist:
+ childlist.remove(add)
+ for ch in childlist:
+ if ch.extends == addedlist[i].varname:
+ addedlist.append(ch)
+ childlist2.remove(ch)
+ conf = doc.createElement("config")
+ conf.setAttribute("name",ch.varname)
+ nodesList[i].appendChild(conf)
+ nodesList.append(conf)
+ ch.CreateSpec(conf)
+ else:
+ pass
+ i = i + 1
+
+ # If output xml file is specified, write to it otherwise print the xml to screen
+ if options.outputxml:
+ file = open(options.outputxml,"w")
+ file.writelines(doc.toprettyxml(indent=" "))
+ file.close()
+ else:
+ print doc.toprettyxml(indent=" ")
+
+
+if __name__ == "__main__":
+ main()