diff -r 000000000000 -r 044383f39525 sbsv2/raptor/bin/vartoxml.py --- /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\w+)',var): + self.varname = re.match('VARIANT\s+(?P\w+)',var) + elif re.match('VARIANT_HRH\s+(?P.+)',var): + self.varhrh = re.match('VARIANT_HRH\s+(?P.+)',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\w+)\s+(?P.+)',var) + elif re.match('ROM_INCLUDE\s+.+',var): + self.rom_include = re.match('ROM_INCLUDE\s+(?P\w+)\s+(?P.+)',var) + elif re.match('EXTENDS\s+(?P\w+)',var): + self.extends = re.match('EXTENDS\s+(?P\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()