Signed-off-by: lgao4 Reviewed-by: gikidy git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12372 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			2479 lines
		
	
	
		
			87 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			2479 lines
		
	
	
		
			87 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/env python
 | |
| #
 | |
| #
 | |
| # Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
 | |
| # This program and the accompanying materials
 | |
| # are licensed and made available under the terms and conditions of the BSD License
 | |
| # which accompanies this distribution.  The full text of the license may be found at
 | |
| # http://opensource.org/licenses/bsd-license.php
 | |
| # 
 | |
| # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
| # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| 
 | |
| 
 | |
| """ This program converts EDK II MSA files into EDK II Extended INF format files """
 | |
| 
 | |
| import os, re, sys, fnmatch, xml.dom.minidom
 | |
| from optparse import OptionParser
 | |
| from AutoGenExterns import *
 | |
| from Common.XmlRoutines import  *             # XmlParseFile, XmlElement, XmlAttribute, XmlList, XmlElementData, XmlNode
 | |
| from Common.EdkIIWorkspace import *
 | |
| from Common.BuildVersion import gBUILD_VERSION
 | |
| 
 | |
| versionNumber = ("0.9" + " " + gBUILD_VERSION)
 | |
| __version__ = "%prog Version " + versionNumber
 | |
| __copyright__ = "Copyright (c) 2007 - 2010, Intel Corporation  All rights reserved."
 | |
| 
 | |
| commonHeaderFilename = "CommonHeader.h"
 | |
| entryPointFilename   = "EntryPoint.c"
 | |
| 
 | |
| AutoGenLibraryMapping = {
 | |
|     "HiiLib":"HiiLibFramework",
 | |
|     "EdkIfrSupportLib":"IfrSupportLibFramework",
 | |
|     "EdkScsiLib":"ScsiLib",
 | |
|     "EdkUsbLib":"UsbLib",
 | |
|     "EdkFvbServiceLib":"FvbServiceLib",
 | |
|     "EdkGraphicsLib":"GraphicsLib"
 | |
|     }
 | |
|     
 | |
| def myOptionParser():
 | |
|     """ Argument Parser """
 | |
|     usage = "%prog [options] -f input_filename"
 | |
|     parser = OptionParser(usage=usage,description=__copyright__,version="%prog " + str(versionNumber))
 | |
|     parser.add_option("-f", "--file", dest="filename", help="Name of MSA file to convert")
 | |
|     parser.add_option("-o", "--output", dest="outfile", help="Specific Name of the INF file to create, otherwise it is the MSA filename with the extension repalced.")
 | |
|     parser.add_option("-a", "--auto", action="store_true", dest="autowrite", default=False, help="Automatically create output files and write the INF file")
 | |
|     parser.add_option("-i", "--interactive", action="store_true", dest="interactive", default=False, help="Set Interactive mode, user must approve each change.")
 | |
|     parser.add_option("-q", "--quiet", action="store_const", const=0, dest="verbose", help="Do not print any messages, just return either 0 for succes or 1 for failure")
 | |
|     parser.add_option("-v", "--verbose", action="count", dest="verbose", help="Do not print any messages, just return either 0 for succes or 1 for failure")
 | |
|     parser.add_option("-d", "--debug", action="store_true", dest="debug", default=False, help="Enable printing of debug messages.")
 | |
|     parser.add_option("-c", "--convert", action="store_true", dest="convert", default=False, help="Convert package: OldMdePkg->MdePkg EdkModulePkg->MdeModulePkg.")
 | |
|     parser.add_option("-e", "--event", action="store_true", dest="event", default=False, help="Enable handling of Exit Boot Services & Virtual Address Changed Event")
 | |
|     parser.add_option("-m", "--manual", action="store_true", dest="manual", default=False, help="Generate CommonHeader.txt, user picks up & copy it to a module common header")
 | |
|     parser.add_option("-w", "--workspace", dest="workspace", default=str(os.environ.get('WORKSPACE')), help="Specify workspace directory.")
 | |
|     (options, args) = parser.parse_args(sys.argv[1:])
 | |
| 
 | |
|     return options,args
 | |
| 
 | |
| 
 | |
| def openDatabase(f):
 | |
|     """ Parse XML in the FrameworkDatabase.db file pointed to by f """
 | |
|     if (options.debug and options.verbose > 1):
 | |
|         print "Opening the database file:", f
 | |
|     if os.path.exists(f):
 | |
|         fdb = XmlParseFile(f)
 | |
|     else:
 | |
|         return "None"
 | |
|     return fdb
 | |
| 
 | |
| def openSpd(s):
 | |
|     """ Parse XML in the SPD file pointed to by s """
 | |
|     if (options.debug and options.verbose > 1):
 | |
|         print "Opening the SPD file:", s
 | |
|     if os.path.exists(s):
 | |
|         spd = XmlParseFile(s)
 | |
|     else:
 | |
|         return "None"
 | |
|     return spd
 | |
| 
 | |
| def openMsa(m):
 | |
|     """ Parse XML in the MSA file pointed to by m """
 | |
|     if (options.debug and options.verbose > 1):
 | |
|         print "Opening the MSA file:", m
 | |
|     if os.path.exists(m):
 | |
|         msa = XmlParseFile(m)
 | |
|     else:
 | |
|         return "None"
 | |
|     return msa
 | |
| 
 | |
| def AddGuid(ArchList, CName, Usage):
 | |
|     """ Add a GUID to the Architecture array that the GUID is valid for. """
 | |
|     if "IA32" in ArchList:
 | |
|         GuidCNameIa32.insert(0, str("  %-45s # %s" % (CName, Usage)))
 | |
|     if "X64" in ArchList:
 | |
|         GuidCNameX64.insert(0, str("  %-45s # %s" % (CName, Usage)))
 | |
|     if "IPF" in ArchList:
 | |
|         GuidCNameIPF.insert(0, str("  %-45s # %s" % (CName, Usage)))
 | |
|     if "EBC" in ArchList:
 | |
|         GuidCNameEBC.insert(0, str("  %-45s # %s" % (CName, Usage)))
 | |
|     if "ALL" in ArchList:
 | |
|         GuidCName.insert(0, str("  %-45s # %s" % (CName, Usage)))
 | |
| 
 | |
| 
 | |
| def removeDups(CN, ListName):
 | |
|     """ Remove Duplicate Entries from the Guid List passed in """
 | |
|     for Entry in ListName[:]:
 | |
|         if " " + CN + " " in Entry:
 | |
|             if (options.verbose > 1):
 | |
|                 print "Removing C Name %s Entry from Guids List." % (CN)
 | |
|             ListName.remove(Entry)
 | |
| 
 | |
| def chkArch(Archs):
 | |
|     """ Process the supported architectures passed in to combine if possible """
 | |
|     Archs = Archs.upper()
 | |
|     if (("IA32" in Archs) & ("X64" in Archs) & ("IPF" in Archs) & ("EBC" in Archs)):
 | |
|         Archs = "ALL"
 | |
|     if (len(Archs) == 0):
 | |
|         Archs = "ALL"
 | |
|     return Archs
 | |
| 
 | |
| def saveSourceFile(moduleDir, sourceFilename, sourceFileContents):
 | |
|     newFilename = os.path.join(moduleDir, sourceFilename)
 | |
|     
 | |
|     try:
 | |
|         f = open(newFilename, "w+")
 | |
|         f.write(sourceFileContents)
 | |
|         f.close()
 | |
|     except:
 | |
|         print "IO error in saving %s" % sourceFilename
 | |
|         
 | |
|     return sourceFilename
 | |
| 
 | |
| def openSourceFile(moduleDir, sourceFilename):
 | |
|     newFilename = os.path.join(moduleDir, sourceFilename)
 | |
|     sourceFileContents = ""
 | |
|     try:
 | |
|         f = open(newFilename, "r")
 | |
|         sourceFileContents = f.read()
 | |
|         f.close()
 | |
|     except:
 | |
|         print "IO error in opening %s" % sourceFilename
 | |
|         
 | |
|     return sourceFileContents
 | |
| 
 | |
| def MatchOption(eline, ToolChainFamily, Targets, Archs, ToolCode, Value):
 | |
|     IDs = eline.split("_")
 | |
|     
 | |
|     if len(IDs) < 5:
 | |
|         return []
 | |
|     
 | |
|     MatchedTargets = []
 | |
|     if (Targets[0] == "*") or IDs[0] in Targets:
 | |
|         MatchedTargets.append(IDs[0])
 | |
|     elif IDs[0] == "*":
 | |
|         MatchedTargets = Targets
 | |
| 
 | |
|     MatchedArchs = []
 | |
|     if Archs[0] == "*" or IDs[2] in Archs:
 | |
|         MatchedArchs.append(IDs[2])
 | |
|     elif IDs[2] == "*":
 | |
|         MatchedArchs = Archs
 | |
| 
 | |
|     if IDs[3] != ToolCode and IDs[3] != "*":
 | |
|         return []
 | |
|     
 | |
|     result = []
 | |
|     for arch in MatchedArchs:
 | |
|         for target in MatchedTargets:
 | |
|             line = "%s:%s_%s_%s_%s_FLAGS = %s" % (ToolChainFamily, target, IDs[1], arch, ToolCode, Value)
 | |
|             result.append(line)
 | |
| 
 | |
|     return result
 | |
|         
 | |
| def main():
 | |
| 
 | |
|     AutoGenSource = ""
 | |
|     AutoGenHeader = ""
 | |
|     AutoGenDeclaration = ""
 | |
|     AutoGenModuleFolder = None
 | |
| 
 | |
|     workspace = ""
 | |
| 
 | |
|     if (options.workspace == None):
 | |
|         print "ERROR: E0000: WORKSPACE not defined.\n  Please set the WORKSPACE environment variable to the location of the EDK II install directory."
 | |
|         sys.exit(1)
 | |
|     else:
 | |
|         workspace = options.workspace
 | |
|         if (options.debug):
 | |
|             print "Using Workspace:", workspace
 | |
| 
 | |
|     try:
 | |
|         options.verbose +=1
 | |
|     except:
 | |
|         options.verbose = 1
 | |
|         pass
 | |
| 
 | |
| 
 | |
|     FdbPath = os.path.join(workspace, "Conf")
 | |
|     FdbPath = os.path.join(FdbPath, "FrameworkDatabase.db")
 | |
|     if os.path.exists(FdbPath):
 | |
|         FdbFile = FdbPath
 | |
|     else:
 | |
|         print "ERROR: E0001: WORKSPACE does not contain the FrameworkDatabase File.\n  Please run EdkSetup from the EDK II install directory.\n"
 | |
|         sys.exit(1)
 | |
| 
 | |
|     Fdb = openDatabase(FdbFile)
 | |
|     if (Fdb == 'None'):
 | |
|         print "ERROR: E0002 Could not open the Framework Database file:", FdbFile
 | |
|         sys.exit(1)
 | |
| 
 | |
|     if (options.debug):
 | |
|         print "FrameworkDataBase.db file:", FdbFile
 | |
| 
 | |
|     #
 | |
|     InitializeAutoGen(workspace, Fdb)
 | |
| 
 | |
|     if (options.filename):
 | |
|         filename = options.filename
 | |
|         if ((options.verbose > 1) | (options.autowrite)):
 | |
|             print "Filename:", filename
 | |
|     else:
 | |
|         print "ERROR: E0001 - You must specify an input filename"
 | |
|         sys.exit(1)
 | |
| 
 | |
|     if (options.outfile):
 | |
|         outputFile = options.outfile
 | |
|     else:
 | |
|        outputFile = filename.replace('.msa', '.inf')
 | |
| 
 | |
|     if ((options.verbose > 2) or (options.debug)):
 | |
|         print "Output Filename:", outputFile
 | |
| 
 | |
|     Msa = openMsa(filename)
 | |
|     if (Msa == 'None'):
 | |
|         ## Maybe developer think WORKSPACE macro is the root directory of file name
 | |
|         ## So we will try to add WORKSPACE path into filename
 | |
|         MsaFileName = ""
 | |
|         MsaFileName = os.path.join(workspace, filename)
 | |
|         Msa = openMsa(MsaFileName)
 | |
|         if (Msa == 'None'):
 | |
|             print "ERROR: E0002: Could not open the file:", filename
 | |
|             sys.exit(1)
 | |
| 
 | |
|     AutoGenModuleFolder = os.path.dirname(filename)
 | |
|         
 | |
|     MsaHeader = "/ModuleSurfaceArea/MsaHeader/"
 | |
|     MsaDefs = "/ModuleSurfaceArea/ModuleDefinitions/"
 | |
|     BaseName = str(XmlElement(Msa, MsaDefs + "OutputFileBasename")).strip()
 | |
| 
 | |
|     if (len(BaseName) < 1):
 | |
|       BaseName = str(XmlElement(Msa, MsaHeader + "BaseName")).strip()
 | |
|       BaseName = re.sub(' ', '_', BaseName)
 | |
| 
 | |
|     GuidValue = str(XmlElement(Msa, MsaHeader + "GuidValue")).strip()
 | |
|     VerString = str(XmlElement(Msa, MsaHeader + "Version")).strip()
 | |
|     ModType = str(XmlElement(Msa, MsaHeader + "ModuleType")).strip()
 | |
|     CopyRight = str(XmlElement(Msa, MsaHeader + "Copyright")).strip()
 | |
|     Abstract = str(XmlElement(Msa, MsaHeader + "Abstract")).strip()
 | |
|     Description = str(XmlElement(Msa, MsaHeader + "Description")).strip().replace("  ", " ").replace("  ", " ").replace("  ", " ")
 | |
|     if not CopyRight.find("2007"):
 | |
|         CopyRight = CopyRight.replace("2006", "2007")
 | |
|     License = str(XmlElement(Msa, MsaHeader + "License")).strip().replace("  ", " ")
 | |
|     MsaDefs = "/ModuleSurfaceArea/ModuleDefinitions/"
 | |
|     BinModule = ""
 | |
|     try:
 | |
|         BinModule = str(XmlElement(Msa, MsaDefs + "BinaryModule")).strip()
 | |
|     except:
 | |
|         pass
 | |
| 
 | |
|     SupportedArchitectures = ""
 | |
|     try:
 | |
|         SupportedArchitectures = str(XmlElement(Msa, MsaDefs + "SupportedArchitectures")).strip()
 | |
|     except:
 | |
|         pass
 | |
| 
 | |
|     DefinesComments = []
 | |
|     if (len(SupportedArchitectures) > 0):
 | |
|         DefinesComments.insert(0, "\n#\n# The following information is for reference only and not required by the build tools.\n#\n")
 | |
|         DefinesComments.append("#  VALID_ARCHITECTURES           = " + SupportedArchitectures + "\n")
 | |
|         DefinesComments.append("#\n")
 | |
| 
 | |
|     MsaExtern = "/ModuleSurfaceArea/Externs/"
 | |
|     PcdIsDriver = ""
 | |
|     try:
 | |
|         PcdIsDriver = str(XmlElement(Msa, MsaExtern + "PcdIsDriver")).strip()
 | |
|     except:
 | |
|         pass
 | |
| 
 | |
|     SpecList = []
 | |
|     List = []
 | |
|     try:
 | |
|         List = XmlList(Msa, MsaExtern + "Specification")
 | |
|     except:
 | |
|         pass
 | |
| 
 | |
|     if (len(List) > 0):
 | |
|         for spec in List[:]:
 | |
|             SpecList.insert(0, str(XmlElementData(spec)).strip())
 | |
| 
 | |
|     DriverModules = []
 | |
|     LibraryModules = []
 | |
|     Externlist = []
 | |
|     Flag = (DefinesComments == [])
 | |
| 
 | |
|     # Data structure to insert autogen code
 | |
|     AutoGenDriverModel = []
 | |
|     AutoGenExitBootServices = []
 | |
|     AutoGenVirtualAddressChanged = []
 | |
|     AutoGenEntryPoint = ""
 | |
|     AutoGenUnload = ""
 | |
|     AutoGenGuid = []
 | |
|     AutoGenLibClass = []
 | |
|     AutoGenPackage = []
 | |
|     AutoGenSourceFiles = []
 | |
|     OldEntryPoint = ""
 | |
|     OldUnload = ""
 | |
|     
 | |
|     try:
 | |
|         Externlist = XmlList(Msa, MsaExtern + "Extern")
 | |
|     except:
 | |
|         pass
 | |
| 
 | |
|     if (len(Externlist) > 0):
 | |
|         if (options.debug and options.verbose > 2):
 | |
|             print "In Extern Parsing Routine"
 | |
|         for extern in Externlist:
 | |
|             EntryPoint = ""
 | |
|             Unload = ""
 | |
|             DBinding = ""
 | |
|             CompName = ""
 | |
|             Diag = ""
 | |
|             Config = ""
 | |
|             Constr = ""
 | |
|             Destr = ""
 | |
|             CallBack = ""
 | |
|             lFlag = False
 | |
|             AutoGenDriverModelItem = []
 | |
|             try:
 | |
|                 EntryPoint = str(XmlElementData(extern.getElementsByTagName("ModuleEntryPoint")[0])).strip()
 | |
|                 AutoGenEntryPoint = EntryPoint
 | |
|                 #DriverModules.append("  %-30s = %s\n" % ("ENTRY_POINT" , EntryPoint))
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             try:
 | |
|                 Unload = str(XmlElementData(extern.getElementsByTagName("ModuleUnloadImage")[0])).strip()
 | |
|                 AutoGenUnload = Unload
 | |
|                 DriverModules.append("  %-30s = %s\n" % ("UNLOAD_IMAGE", Unload))
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             try:
 | |
|                 DBinding = str(XmlElementData(extern.getElementsByTagName("DriverBinding")[0])).strip()
 | |
|                 AutoGenDriverModelItem.append("&" + DBinding)
 | |
|                 DefinesComments.append("#  %-29s =  %-45s\n" % ("DRIVER_BINDING", DBinding))
 | |
|                 lFlag = True
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             try:
 | |
|                 CompName = str(XmlElementData(extern.getElementsByTagName("ComponentName")[0])).strip()
 | |
|                 AutoGenDriverModelItem.append("&" + CompName)
 | |
|                 DefinesComments.append("#  %-29s =  %-45s\n" % ("COMPONENT_NAME", CompName))
 | |
|                 lFlag = True
 | |
|             except:
 | |
|                 if lFlag:
 | |
|                     AutoGenDriverModelItem.append("NULL")
 | |
|                 pass
 | |
| 
 | |
|             try:
 | |
|                 Config = str(XmlElementData(extern.getElementsByTagName("DriverConfig")[0])).strip()
 | |
|                 AutoGenDriverModelItem.append("&" + Config)
 | |
|                 DefinesComments.append("#  %-29s =  %-45s\n" % ("DRIVER_CONFIG", Config))
 | |
|                 lFlag = True
 | |
|             except:
 | |
|                 if lFlag:
 | |
|                     AutoGenDriverModelItem.append("NULL")
 | |
|                 pass
 | |
| 
 | |
|             try:
 | |
|                 Diag = str(XmlElementData(extern.getElementsByTagName("DriverDiag")[0])).strip()
 | |
|                 AutoGenDriverModelItem.append("&" + Diag)
 | |
|                 DefinesComments.append("#  %-29s =  %-45s\n" % ("DRIVER_DIAG", Diag))
 | |
|                 lFlag = True
 | |
|             except:
 | |
|                 if lFlag:
 | |
|                     AutoGenDriverModelItem.append("NULL")
 | |
|                 pass
 | |
| 
 | |
|             if len(AutoGenDriverModelItem) > 0:
 | |
|                 AutoGenDriverModel.append(AutoGenDriverModelItem)
 | |
|                 
 | |
|             try:
 | |
|                 Constr = str(XmlElementData(extern.getElementsByTagName("Constructor")[0])).strip()
 | |
|                 LibraryModules.append("  %-30s = %s\n" % ("CONSTRUCTOR", Constr))
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             try:
 | |
|                 Destr = str(XmlElementData(extern.getElementsByTagName("Destructor")[0])).strip()
 | |
|                 LibraryModules.append("  %-30s = %s\n" % ("DESTRUCTOR", Destr))
 | |
|             except:
 | |
|                 pass
 | |
|     
 | |
|             try:
 | |
|                 CallBack = str(XmlElement(extern, "Extern/SetVirtualAddressMapCallBack")).strip()
 | |
|                 if CallBack != "":
 | |
|                     AutoGenVirtualAddressChanged.append(CallBack)
 | |
|                     DefinesComments.append("#  %-29s =  %-45s\n" % ("VIRTUAL_ADDRESS_MAP_CALLBACK", CallBack))
 | |
|                     lFlag = True
 | |
|             except:
 | |
| 
 | |
|                 pass
 | |
| 
 | |
|             try:
 | |
|                 CallBack = str(XmlElement(extern, "Extern/ExitBootServicesCallBack")).strip()
 | |
|                 if CallBack != "":
 | |
|                     AutoGenExitBootServices.append(CallBack)
 | |
|                     DefinesComments.append("#  %-29s =  %-45s\n" % ("EXIT_BOOT_SERVICES_CALLBACK", CallBack))
 | |
|                     lFlag = True
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|        
 | |
|     Flag = False
 | |
| 
 | |
|     """ Get the Module's custom build options """
 | |
|     MBOlines = []
 | |
|     MBO = "/ModuleSurfaceArea/ModuleBuildOptions/Options/Option"
 | |
|     mboList = []
 | |
|     try:
 | |
|         mboList = XmlList(Msa, MBO)
 | |
|     except:
 | |
|         pass
 | |
| 
 | |
|     if (len(mboList) > 0):
 | |
|         for Option in mboList:
 | |
|             Targets = []
 | |
|             Archs = []
 | |
| 
 | |
|             bt = ""
 | |
|             try:
 | |
|                 bt = str(Option.getAttribute("BuildTargets"))
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             if (len(bt) > 0):
 | |
|                 if (re.findall(" ", bt) > 0):
 | |
|                     Targets = bt.split()
 | |
|                 else:
 | |
|                     Targets.insert(0, bt)
 | |
|             else:
 | |
|                 Targets.insert(0, "*")
 | |
| 
 | |
|             if (options.debug and options.verbose > 2):
 | |
|                 print "Targets", len(Targets), Targets
 | |
| 
 | |
|             pro = ""
 | |
|             try:
 | |
|                 pro = Option.getAttribute("SupArchList")
 | |
|                 if (re.findall(" ", pro) > 0):
 | |
|                     Archs = pro.split()
 | |
|                 elif (re.findall(",", pro) > 0):
 | |
|                     Archs = pro.split(",")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             if (len(pro) == 0):
 | |
|                 Archs.insert(0, "*")
 | |
| 
 | |
|             if (options.debug and options.verbose > 2):
 | |
|                 print "Archs", len(Archs), Archs
 | |
| 
 | |
|             ToolCode = ""
 | |
|             try:
 | |
|                 ToolCode = str(Option.getAttribute("ToolCode"))
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             if (len(ToolCode) == 0):
 | |
|                 ToolCode="*"
 | |
| 
 | |
|             value = ""
 | |
|             try:
 | |
|                 value = str(XmlElementData(Option))
 | |
|             except:
 | |
|                 pass
 | |
|             Tags = []
 | |
|             TagName = ""
 | |
|             try:
 | |
|                 TagName = str(Option.getAttribute("TagName"))
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             if (len(TagName) > 0) :
 | |
|                 if (options.debug and options.verbose > 2):
 | |
|                     print "TagName was defined:", TagName
 | |
|                 Tags.insert(0, TagName)
 | |
|             else:
 | |
|                 if (options.debug and options.verbose > 2):
 | |
|                     print "TagName was NOT defined!"
 | |
|                 TagName = "*"
 | |
|                 Tags.insert(0, "*")
 | |
| 
 | |
|             Family = ""
 | |
|             try:
 | |
|                 Family = str(Option.getAttribute("ToolChainFamily")).strip()
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             if (len(Family) > 0):
 | |
|                 if (options.debug):
 | |
|                     print "Searching tools_def.txt for Tool Tags that belong to:", Family, "family"
 | |
|                 TCF = []
 | |
|                 tdFile = ""
 | |
|                 tdPath = os.path.join(workspace, "Tools")
 | |
|                 tdPath = os.path.join(tdPath, "Conf")
 | |
|                 tdPath = os.path.join(tdPath, "tools_def.txt")
 | |
|                 tdPath = tdPath.replace("\\", "/")
 | |
|                 if os.path.exists(tdPath):
 | |
|                     tdFile = tdPath
 | |
|                 else:
 | |
|                     tdPath = os.path.join(workspace, "Conf")
 | |
|                     tdPath = os.path.join(tdPath, "tools_def.txt")
 | |
|                     if os.path.exists(tdPath):
 | |
|                         tdFile = tdPath
 | |
|                     else:
 | |
|                         print "ERROR: E0001: WORKSPACE does not contain the tools_def.txt File.\n  Please run EdkSetup from the EDK II install directory.\n"
 | |
|                         sys.exit(1)
 | |
| 
 | |
|                 if (options.debug and options.verbose > 2):
 | |
|                     print "Opening:", tdFile
 | |
| 
 | |
|                 TagNameList = []
 | |
|                 tools_def = open(tdFile, "r")
 | |
|                 for tdline in tools_def:
 | |
|                     if "# " in tdline:
 | |
|                         continue
 | |
|                     if "FAMILY" in tdline:
 | |
|                         if (options.debug and options.verbose > 2):
 | |
|                             print "Testing for FAMILY:", Family, "in the line:", tdline.strip()
 | |
|                         if Family in tdline:
 | |
|                             enter = tdline.split("=")[0]
 | |
|                             if (options.debug and options.verbose > 2):
 | |
|                                 print "Adding TNL:", tdline
 | |
|                             TagNameList.insert(0, enter)
 | |
|                 tools_def.close()
 | |
| 
 | |
|                 if (options.debug and options.verbose > 2):
 | |
|                     print "TagNameList:", TagNameList
 | |
| 
 | |
|                 olinesSet = {}
 | |
|                 for eline in TagNameList:
 | |
|                     if "# " in eline:
 | |
|                         continue
 | |
|                     if (options.debug and options.verbose > 2):
 | |
|                         print "ToolsDef entry:", eline
 | |
|                         
 | |
|                     olines = MatchOption(eline, Family, Targets, Archs, ToolCode, value)
 | |
|                     for oline in olines:
 | |
|                         olinesSet[oline] = 1
 | |
|                         
 | |
|                 for oline in olinesSet:
 | |
|                     if (options.debug and options.verbose > 2):
 | |
|                         print "Adding:", str(oline)
 | |
|                     MBOlines.insert(0, oline)
 | |
|             else:
 | |
|                 for targ in Targets:
 | |
|                     for arch in Archs:
 | |
|                         oline = "  %s_%s_%s_%s_FLAGS = %s" % (targ, Tags[0], arch, str(ToolCode), str(Value))
 | |
|                         if (options.debug and options.verbose > 2):
 | |
|                             print "Adding:", str(oline)
 | |
|                         MBOlines.insert(0, oline)
 | |
|            
 | |
| 
 | |
| 
 | |
| 
 | |
|             for tag in Tags:
 | |
|                 for targ in Targets:
 | |
|                     for arch in Archs:
 | |
|                         oline = "  " + str(targ) + "_" + str(tag) + "_" + str(arch) + "_" + str(ToolCode) + "_FLAGS  = " + str(value)
 | |
|                         if (options.debug and options.verbose > 2):
 | |
|                             print "Adding:", str(oline)
 | |
|                         #MBOlines.insert(0, oline)
 | |
|   
 | |
| 
 | |
|     """ Get the Library Class information """
 | |
|     MsaLcDefs = "/ModuleSurfaceArea/LibraryClassDefinitions/LibraryClass"
 | |
|     LcDefList = []
 | |
|     try:
 | |
|         LcDefList = XmlList(Msa, MsaLcDefs)
 | |
|     except:
 | |
|         pass
 | |
| 
 | |
|     IamLibrary = []
 | |
|     LibClassList = []
 | |
|     LibClassListIa32 = []
 | |
|     LibClassListX64 = []
 | |
|     LibClassListIpf = []
 | |
|     LibClassListEbc = []
 | |
| 
 | |
|     
 | |
|     if (len(LcDefList) > 0):
 | |
|         for Lc in LcDefList:
 | |
|             lcKeyword = ""
 | |
|             try:
 | |
|                 lcKeyword = str(XmlElementData(Lc.getElementsByTagName("Keyword")[0]))
 | |
|             except:
 | |
|                 raise SyntaxError, "The MSA is not correctly formed, a Library Class Keyword Element is required"
 | |
| 
 | |
|             lcUsage = ""
 | |
|             try:
 | |
|                 lcUsage = str(XmlAttribute(Lc, "Usage"))
 | |
|             except:
 | |
|                 raise SyntaxError, "The MSA is not correctly formed, a Usage Attribute is required for all Library Class Elements"
 | |
| 
 | |
|             Archs = ""
 | |
|             try:
 | |
|                 Archs = str(XmlAttribute(Lc, "SupArchList"))
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             Archs = chkArch(Archs)
 | |
| 
 | |
|             if (options.debug and options.verbose > 2):
 | |
|                 print "Attr: ",  lcUsage, lcKeyword, Archs
 | |
| 
 | |
|             if (options.convert):
 | |
|                 lcKeyword = AutoGenLibraryMapping.get(lcKeyword, lcKeyword)
 | |
|                 
 | |
|             if re.findall("PRODUCED", lcUsage, re.IGNORECASE):
 | |
|                 try:
 | |
|                     lcSupModList = ""
 | |
| 
 | |
|                     try:
 | |
|                         lcSupModList = str(XmlAttribute(Lc, "SupModuleList"))
 | |
|                     except:
 | |
|                         lcSupModList = ""
 | |
|                     pass
 | |
| 
 | |
|                     lcLine = lcKeyword
 | |
|                     AutoGenLibClass.append(lcKeyword)
 | |
|                     if len(lcSupModList) > 0:
 | |
|                         lcLine = lcLine + "|" + lcSupModList
 | |
|                     IamLibrary.insert(0, lcLine)
 | |
|                 except:
 | |
|                     pass
 | |
|             elif lcKeyword != "UefiDriverModelLib":
 | |
|                 AutoGenLibClass.append(lcKeyword)
 | |
|                 # This section handles the library classes that are CONSUMED
 | |
|                 if "IA32" in Archs:
 | |
|                     LibClassListIa32.insert(0, lcKeyword)
 | |
|                 if "X64" in Archs:
 | |
|                     LibClassListX64.insert(0, lcKeyword)
 | |
|                 if "IPF" in Archs:
 | |
|                     LibClassListIpf.insert(0, lcKeyword)
 | |
|                 if "EBC" in Archs:
 | |
|                     LibClassListEbc.insert(0, lcKeyword)
 | |
|                 if "ALL" in Archs:
 | |
|                     LibClassList.insert(0, lcKeyword)
 | |
|         if len(AutoGenDriverModel) > 0 and "UefiLib" not in LibClassList:
 | |
|             AutoGenLibClass.append("UefiLib")
 | |
|             LibClassList.insert(0, "UefiLib")
 | |
|     
 | |
|     AutoGenDxsFiles = []
 | |
|     """ Get the Source File list """
 | |
|     SrcFilenames = []
 | |
|     SrcFilenamesIa32 = []
 | |
|     SrcFilenamesX64 = []
 | |
|     SrcFilenamesIpf = []
 | |
|     SrcFilenamesEbc = []
 | |
|     SrcFiles = "/ModuleSurfaceArea/SourceFiles/Filename"
 | |
|     SrcList = []
 | |
|     try:
 | |
|         SrcList = XmlList(Msa, SrcFiles)
 | |
|     except:
 | |
|         pass
 | |
| 
 | |
|     if (len(SrcList) > 0):
 | |
|         for fn in SrcList:
 | |
|             file = ""
 | |
|             Archs = ""
 | |
| 
 | |
|             try:
 | |
|                 Archs = fn.getAttribute("SupArchList")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             Archs = chkArch(Archs)
 | |
| 
 | |
|             try:
 | |
|                 file = str(XmlElementData(fn))
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             if file.endswith(".dxs"):
 | |
|                 AutoGenDxsFiles.append((file, Archs))
 | |
|             else:
 | |
|                 AutoGenSourceFiles.append(file)
 | |
|                 if "IA32" in Archs:
 | |
|                     SrcFilenamesIa32.insert(0, file)
 | |
|                 if "X64" in Archs:
 | |
|                     SrcFilenamesX64.insert(0, file)
 | |
|                 if "IPF" in Archs:
 | |
|                     SrcFilenamesIpf.insert(0, file)
 | |
|                 if "EBC" in Archs:
 | |
|                     SrcFilenamesEbc.insert(0, file)
 | |
|                 if "ALL" in Archs:
 | |
|                     SrcFilenames.insert(0, file)
 | |
| 
 | |
|     """ Package Dependency section """
 | |
|     DbPkgList = "/FrameworkDatabase/PackageList/Filename"
 | |
|     WorkspacePkgs = []
 | |
|     try:
 | |
|         WorkspacePkgs = XmlList(Fdb, DbPkgList)
 | |
|     except:
 | |
|         print "Could not tet the package data from the database"
 | |
|         sys.exit(1)
 | |
| 
 | |
|     PkgDb = []
 | |
|     HeaderLocations = []
 | |
| 
 | |
|     if (options.debug and options.verbose > 1):
 | |
|         print "Found %s packages in the WORKSPACE" % (len(WorkspacePkgs))
 | |
| 
 | |
|     Dirs = []
 | |
|     GuidDecls = []
 | |
|     if (len(WorkspacePkgs) > 0):
 | |
|         SpdHeader = "/PackageSurfaceArea/SpdHeader/"
 | |
|         for Pkg in WorkspacePkgs[:]:
 | |
|             PackageGuid = ""
 | |
|             PackageVersion = ""
 | |
|             file = ""
 | |
|             try:
 | |
|                 file = str(XmlElementData(Pkg))
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             if (options.debug and options.verbose > 2):
 | |
|                 print "PKG:", file
 | |
| 
 | |
|             if fnmatch.fnmatch(file, "*.dec"):
 | |
|                 print "parsing " + os.path.join(workspace, file)
 | |
|                 PackageGuid = ""
 | |
|                 PackageVersion = ""
 | |
|                 try:
 | |
|                     Lines = open(os.path.join(workspace, file)).readlines()
 | |
|                 except:
 | |
|                     print "Could not parse the Package file:", file
 | |
|                     sys.exit(1)
 | |
|                     
 | |
|                 for Line in Lines:
 | |
|                     Line = Line.split("#")[0]
 | |
|                     Items = Line.split("=")
 | |
|                     if len(Items) != 2:
 | |
|                         continue
 | |
| 
 | |
|                     Key = Items[0].strip().upper()
 | |
|                     if Key == "PACKAGE_GUID":
 | |
|                         PackageGuid = Items[1].strip()
 | |
|                     if Key == "PACKAGE_VERSION":
 | |
|                         PackageVersion = Items[1].strip()
 | |
| 
 | |
|             else:
 | |
|                 Spd = openSpd(os.path.join(workspace, file))
 | |
|                 if (Spd == 'None'):
 | |
|                     print "Could not parse the Package file:", file
 | |
|                     sys.exit(1)
 | |
| 
 | |
|                 path = os.path.split(file)[0]
 | |
|                 file = file.replace(".nspd", ".dec")
 | |
|                 file = file.replace(".spd", ".dec")
 | |
| 
 | |
|                 try:
 | |
|                     PackageGuid = str(XmlElement(Spd, SpdHeader + "GuidValue"))
 | |
|                 except:
 | |
|                     pass
 | |
| 
 | |
|                 try:
 | |
|                     PackageVersion = str(XmlElement(Spd, SpdHeader + "Version"))
 | |
|                 except:
 | |
|                     pass
 | |
| 
 | |
|             file = file + "|" + PackageGuid + "|" + PackageVersion
 | |
|             PkgDb.insert(0, file)
 | |
| 
 | |
|             GuidEntries = []
 | |
|             try:
 | |
|                 GuidEntries = XmlList(Spd, "/PackageSurfaceArea/GuidDeclarations/Entry")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             if (len(GuidEntries) > 0):
 | |
|                 for Entry in GuidEntries[:]:
 | |
|                     try:
 | |
|                         GuidDecls.append(str(XmlElementData(Entry.getElementsByTagName("C_Name")[0])).strip())
 | |
|                     except:
 | |
|                         pass
 | |
| 
 | |
|        
 | |
|             pHdrs = []
 | |
|             try:
 | |
|                 pHdrs = XmlList(Spd, "/PackageSurfaceArea/PackageHeaders/IncludePkgHeader")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             if (len(pHdrs) > 0):
 | |
|                 for Hdr in pHdrs[:]:
 | |
|                     try:
 | |
|                         ModTypeList = str(Hdr.getAttribute("ModuleType"))
 | |
|                         if (ModType in ModTypeList):
 | |
|                             HeaderName= str(XmlElementData(Hdr))[0]
 | |
|                             Dirs.insert(0, os.path.join(packagepath,str(os.path.split(HeaderName))))
 | |
|                     except:
 | |
|                         pass
 | |
| 
 | |
|             # Get the Guid:Header from the Packages
 | |
|             SpdLcDec = "/PackageSurfaceArea/LibraryClassDeclarations/LibraryClass"
 | |
|             lcList = []
 | |
|             try:
 | |
|                 lcList = XmlList(Spd, SpdLcDec)
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             if (len(lcList) > 0):
 | |
|                 for Lc in lcList[:]:
 | |
|                     Name = ""
 | |
|                     try:
 | |
|                         Name = Lc.getAttribute("Name")
 | |
|                     except:
 | |
|                         pass
 | |
| 
 | |
|                     Header = ""
 | |
|                     try:
 | |
|                         Header = XmlElementData(Lc.getElementsByTagName("IncludeHeader")[0])
 | |
|                     except:
 | |
|                         pass
 | |
| 
 | |
|                     if ((len(Name) > 0) and (len(Header) > 0)):
 | |
|                         line = Name + "|" + os.path.join(path, Header)
 | |
|                         if (options.debug and options.verbose > 2):
 | |
|                             print "Adding:", line
 | |
|                         HeaderLocations.insert(0, line)
 | |
| 
 | |
|             ishList = []
 | |
|             try:
 | |
|                 IndStdHeaders = "/PackageSurfaceArea/IndustryStdIncludes/IndustryStdHeader"
 | |
|                 ishList = XmlList(Spd, IndStdHeaders)
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             if (len(ishList) > 0):
 | |
|                 for Lc in ishList[:]:
 | |
|                     Name = ""
 | |
|                     try:
 | |
|                         Name = str(Lc.getAttribute("Name")).strip()
 | |
|                     except:
 | |
|                         pass
 | |
| 
 | |
|                     Header = ""
 | |
|                     try:
 | |
|                         Header = str(XmlElementData(Lc.getElementsByTagName("IncludeHeader")[0])).strip()
 | |
|                     except:
 | |
|                         pass
 | |
| 
 | |
|                     if ((len(Name) > 0) and (len(Header) > 0)):
 | |
|                         line = Name + "|" + os.path.join(path, Header)
 | |
|                         HeaderLocations.insert(0, str(line))
 | |
| 
 | |
|     PkgList = []
 | |
|     PkgListIa32 = []
 | |
|     PkgListX64 = []
 | |
|     PkgListIpf = []
 | |
|     PkgListEbc = []
 | |
|     Pkgs = "/ModuleSurfaceArea/PackageDependencies/Package"
 | |
|     pkgL = []
 | |
|     try:
 | |
|        pkgL = XmlList(Msa, Pkgs)
 | |
|     except:
 | |
|        pass
 | |
|    
 | |
| 
 | |
|     gUnknownPkgGuid = {}
 | |
|     if (len(pkgL) > 0):
 | |
|         if (options.debug and options.verbose > 1):
 | |
|             print "Found %s packages in the module" % (len(pkgL))
 | |
|         for pkg in pkgL[:]:
 | |
|             Archs = ""
 | |
|             pkgGuid = ""
 | |
|             pkgVer = ""
 | |
|             
 | |
|             FindPkgGuid = False
 | |
|             try:
 | |
|                 Archs = pkg.getAttribute("SupArchList")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             Archs = chkArch(Archs)
 | |
| 
 | |
|             try:
 | |
|                 pkgGuid = pkg.getAttribute("PackageGuid")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             if options.convert:
 | |
|                 if pkgGuid.lower() == "5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec":
 | |
|                     pkgGuid = "1E73767F-8F52-4603-AEB4-F29B510B6766"
 | |
|                 if pkgGuid.lower() == "68169ab0-d41b-4009-9060-292c253ac43d":
 | |
|                     pkgGuid = "BA0D78D6-2CAF-414b-BD4D-B6762A894288"
 | |
|             AutoGenPackage.append(pkgGuid)
 | |
|             try:
 | |
|                 pkgVer = pkg.getAttribute("PackageVersion")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             for PkgEntry in PkgDb[:]:
 | |
|                 if pkgGuid in PkgEntry:
 | |
|                     if len(pkgVer) > 0:
 | |
|                         if pkgVer in PkgEntry:
 | |
|                             FindPkgGuid = True
 | |
|                             if "IA32" in Archs:
 | |
|                                 PkgListIa32.insert(0, PkgEntry.split("|")[0])
 | |
|                             if "X64" in Archs:
 | |
|                                 PkgListX64.insert(0, PkgEntry.split("|")[0])
 | |
|                             if "IPF" in Archs:
 | |
|                                 PkgListIpf.insert(0, PkgEntry.split("|")[0])
 | |
|                             if "EBC" in Archs:
 | |
|                                 PkgListEbc.insert(0, PkgEntry.split("|")[0])
 | |
|                             if "ALL" in Archs:
 | |
|                                 PkgList.insert(0, PkgEntry.split("|")[0])
 | |
|                     else:
 | |
|                         FindPkgGuid = True
 | |
|                         if "IA32" in Archs:
 | |
|                             PkgListIa32.insert(0, PkgEntry.split("|")[0])
 | |
|                         if "X64" in Archs:
 | |
|                             PkgListX64.insert(0, PkgEntry.split("|")[0])
 | |
|                         if "IPF" in Archs:
 | |
|                             PkgListIpf.insert(0, PkgEntry.split("|")[0])
 | |
|                         if "EBC" in Archs:
 | |
|                             PkgListEbc.insert(0, PkgEntry.split("|")[0])
 | |
|                         if "ALL" in Archs:
 | |
|                             PkgList.insert(0, PkgEntry.split("|")[0])
 | |
| 
 | |
|             if not FindPkgGuid:
 | |
|                 gUnknownPkgGuid[str(pkgGuid)] = 1
 | |
| 
 | |
|     for UnknownPkgGuid in gUnknownPkgGuid:
 | |
|         print "Cannot resolve package dependency Guid:", UnknownPkgGuid
 | |
| 
 | |
|     PkgList.reverse()
 | |
|     PkgListIa32.reverse()
 | |
|     PkgListX64.reverse()
 | |
|     PkgListIpf.reverse()
 | |
|     PkgListEbc.reverse()
 | |
|     if (options.debug):
 | |
|         print "Package List:", PkgList
 | |
| 
 | |
| 
 | |
|     
 | |
|     """ Setup the Global GuidCName arrays that will hold data from various MSA locations """
 | |
|     global GuidCName
 | |
|     global GuidCNameIa32
 | |
|     global GuidCNameX64
 | |
|     global GuidCNameIPF
 | |
|     global GuidCNameEBC
 | |
|     GuidCName = []
 | |
|     GuidCNameIa32 = []
 | |
|     GuidCNameX64 = []
 | |
|     GuidCNameIPF = []
 | |
|     GuidCNameEBC = []
 | |
| 
 | |
|     """ Check for the GUIDs Element """
 | |
|     Guids = "/ModuleSurfaceArea/Guids/GuidCNames"
 | |
|     GuidList = []
 | |
|     try:
 | |
|         GuidList = XmlList(Msa, Guids)
 | |
|     except:
 | |
|         pass
 | |
| 
 | |
|     if (len(GuidList) > 0):
 | |
|         for Guid in GuidList:
 | |
|             Archs = ""
 | |
|             Usage = ""
 | |
|             CName = ""
 | |
| 
 | |
|             try:
 | |
|                 Archs = Guid.getAttribute("SupArchList")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             Archs = chkArch(Archs)
 | |
| 
 | |
|             try:
 | |
|                 Usage = Guid.getAttribute("Usage")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             try:
 | |
|                 CName = str(XmlElementData(Guid.getElementsByTagName("GuidCName")[0]))
 | |
|                 if CName in GuidDecls:
 | |
|                     if (options.debug and options.verbose > 1):
 | |
|                         print "Guids Adding Guid CName: %-45s # %s Archs: %s" % (CName, Usage, Archs)
 | |
|                     AddGuid(Archs, CName, Usage)
 | |
|                     AutoGenGuid.append(CName)
 | |
|                 else:
 | |
|                     raise AssertionError, "Guid %s defined in %s is not declared in any package (.dec) file!" % (CName, filename)
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|     if (options.debug and options.verbose > 2):
 | |
|         print "Guid C Name List:", GuidCName
 | |
| 
 | |
|     """ Check for Events """
 | |
|     Guids = "/ModuleSurfaceArea/Events/CreateEvents/EventTypes"
 | |
|     GuidList = []
 | |
|     try:
 | |
|         GuidList = XmlList(Msa, Guids)
 | |
|     except:
 | |
|         pass
 | |
| 
 | |
|     if (len(GuidList) > 0):
 | |
|         for Guid in GuidList:
 | |
|             Archs = ""
 | |
|             Usage = ""
 | |
|             CName = ""
 | |
| 
 | |
|             try:
 | |
|                 Archs = Guid.getAttribute("SupArchList")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             Archs = chkArch(Archs)
 | |
| 
 | |
|             try:
 | |
|                 Usage = Guid.getAttribute("Usage")
 | |
|                 Type = str(XmlElementData(Guid.getElementsByTagName("EventType")[0]))
 | |
|                 Usage += "  Create Event: " + Type
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             try:
 | |
|                 CName = str(Guid.getAttribute("EventGuidCName"))
 | |
|                 if CName in GuidDecls:
 | |
|                     if (options.debug and options.verbose > 1):
 | |
|                         print "CreateEvent Adding Guid CName: %-45s # %s Archs: %s" % (CName, Usage, Archs)
 | |
|                     AddGuid(Archs, CName, Usage)
 | |
|                     AutoGenGuid.append(CName)
 | |
|                 else:
 | |
|                     if (len(DefinesComments) == 0):
 | |
|                         DefinesComments.insert(0, "\n#\n# The following information is for reference only and not required by the build tools.\n#\n")
 | |
|                     DefinesComments.append("#  Create Event Guid C Name: " + CName + " Event Type: " + Type + "\n")
 | |
|                     Flag = True
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|     if (Flag):
 | |
|         DefinesComments.append("#\n")
 | |
|         Flag = False
 | |
| 
 | |
|     Guids = "/ModuleSurfaceArea/Events/SignalEvents/EventTypes"
 | |
|     GuidList = []
 | |
|     try:
 | |
|         GuidList = XmlList(Msa, Guids)
 | |
|     except:
 | |
|         pass
 | |
| 
 | |
|     if (len(GuidList) > 0):
 | |
|         for Guid in GuidList:
 | |
|             Archs = ""
 | |
|             Usage = ""
 | |
|             CName = ""
 | |
| 
 | |
|             try:
 | |
|                 Archs = Guid.getAttribute("SupArchList")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             Archs = chkArch(Archs)
 | |
| 
 | |
|             try:
 | |
|                 Usage = Guid.getAttribute("Usage")
 | |
|                 Type = str(XmlElementData(Guid.getElementsByTagName("EventType")[0]))
 | |
|                 Usage += "  Signal Event: " + Type
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             try:
 | |
|                 CName = str(Guid.getAttribute("EventGuidCName"))
 | |
|                 if CName in GuidDecls:
 | |
|                     if (options.debug and options.verbose > 1):
 | |
|                         print "SignalEvent Adding Guid CName: %-45s # %s Archs: %s" % (CName, Usage, Archs)
 | |
|                     AddGuid(Archs, CName, Usage)
 | |
|                     AutoGenGuid.append(CName)
 | |
|                 else:
 | |
|                     if (len(DefinesComments) == 0):
 | |
|                         DefinesComments.insert(0, "\n#\n# The following information is for reference only and not required by the build tools.\n#\n")
 | |
|                     DefinesComments.append("#  Signal Event Guid C Name: " + CName + " Event Type: " + Type + "\n")
 | |
|                     Flag = True
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|     if (Flag):
 | |
|         DefinesComments.append("#\n")
 | |
|         Flag = False
 | |
| 
 | |
|     """ Check the HOB guids """
 | |
|     Guids = "/ModuleSurfaceArea/Hobs/HobTypes"
 | |
|     GuidList = []
 | |
|     try:
 | |
|         GuidList = XmlList(Msa, Guids)
 | |
|     except:
 | |
|         pass
 | |
| 
 | |
|     if (len(GuidList) > 0):
 | |
|         for Guid in GuidList:
 | |
|             Archs = ""
 | |
|             Usage = ""
 | |
|             CName = ""
 | |
| 
 | |
|             try:
 | |
|                 Archs = Guid.getAttribute("SupArchList")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             Archs = chkArch(Archs)
 | |
| 
 | |
|             try:
 | |
|                 Usage = Guid.getAttribute("Usage")
 | |
|                 Type = str(XmlElementData(Guid.getElementsByTagName("HobType")[0]))
 | |
|                 Usage += "  Hob: " + Type
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             try:
 | |
|                 CName = str(Guid.getAttribute("HobGuidCName"))
 | |
|                 if CName in GuidDecls:
 | |
|                     if (options.debug and options.verbose > 1):
 | |
|                         print "Hob Adding Guid CName: %-45s # %s Archs: %s" % (CName, Usage, Archs)
 | |
|                     AddGuid(Archs, CName, Usage)
 | |
|                     AutoGenGuid.append(CName)
 | |
|                 else:
 | |
|                     if (len(DefinesComments) == 0):
 | |
|                         DefinesComments.insert(0, "\n#\n# The following information is for reference only and not required by the build tools.\n#\n")
 | |
|                     DefinesComments.append("#  HOB Guid C Name: " + CName + " Hob Type: " + Type + "\n")
 | |
|                     Flag = True
 | |
|             except:
 | |
|                 if (len(DefinesComments) == 0):
 | |
|                     DefinesComments.insert(0, "\n#\n# The following information is for reference only and not required by the build tools.\n#\n")
 | |
|                 DefinesComments.append("#  HOB: " + Type + "\n")
 | |
|                 Flag = True
 | |
|                 pass
 | |
|       
 | |
|     if (Flag):
 | |
|         DefinesComments.append("#\n")
 | |
|         Flag = False
 | |
| 
 | |
|     """ Check for the SystemTables Element """
 | |
|     Guids = "/ModuleSurfaceArea/SystemTables/SystemTableCNames"
 | |
|     GuidList = []
 | |
|     try:
 | |
|         GuidList = XmlList(Msa, Guids)
 | |
|     except:
 | |
|         pass
 | |
| 
 | |
|     if (len(GuidList) > 0):
 | |
|         for Guid in GuidList:
 | |
|             Archs = ""
 | |
|             Usage = ""
 | |
|             CName = ""
 | |
| 
 | |
|             try:
 | |
|                 Archs = Guid.getAttribute("SupArchList")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             Archs = chkArch(Archs)
 | |
| 
 | |
|             try:
 | |
|                 Usage = Guid.getAttribute("Usage")
 | |
|                 Usage += "  System Table"
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             try:
 | |
|                 CName = str(XmlElementData(Guid.getElementsByTagName("SystemTableCName")[0]))
 | |
|                 if (options.debug and options.verbose > 1):
 | |
|                     print "System Table Adding Guid CName: %-45s # %s Archs: %s" % (CName, Usage, Archs)
 | |
|                 AddGuid(Archs, CName, Usage)
 | |
|                 AutoGenGuid.append(CName)
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|     """ Check for the DataHubs Element """
 | |
|     Guids = "/ModuleSurfaceArea/DataHubs/DataHubRecord"
 | |
|     GuidList = []
 | |
|     try:
 | |
|         GuidList = XmlList(Msa, Guids)
 | |
|     except:
 | |
|         pass
 | |
| 
 | |
|     if (len(GuidList) > 0):
 | |
|         for Guid in GuidList:
 | |
|             Archs = ""
 | |
|             Usage = ""
 | |
|             CName = ""
 | |
| 
 | |
|             try:
 | |
|                 Archs = Guid.getAttribute("SupArchList")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             Archs = chkArch(Archs)
 | |
| 
 | |
|             try:
 | |
|                 Usage = Guid.getAttribute("Usage")
 | |
|                 Usage += "  Data Hub"
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             try:
 | |
|                 CName = str(XmlElementData(Guid.getElementsByTagName("DataHubCName")[0]))
 | |
|                 if (options.debug and options.verbose > 1):
 | |
|                     print "Data Hub Adding Guid CName: %-45s # %s Archs: %s" % (CName, Usage, Archs)
 | |
|                 AddGuid(Archs, CName, Usage)
 | |
|                 AutoGenGuid.append(CName)
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|     """ Check for the HiiPackages Element """
 | |
|     Guids = "/ModuleSurfaceArea/HiiPackages/HiiPackage"
 | |
|     GuidList = []
 | |
|     try:
 | |
|         GuidList = XmlList(Msa, Guids)
 | |
|     except:
 | |
|         pass
 | |
| 
 | |
|     if (len(GuidList) > 0):
 | |
|         for Guid in GuidList:
 | |
|             Archs = ""
 | |
|             Usage = ""
 | |
|             CName = ""
 | |
| 
 | |
|             try:
 | |
|                 Archs = Guid.getAttribute("SupArchList")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             Archs = chkArch(Archs)
 | |
| 
 | |
|             try:
 | |
|                 Usage = Guid.getAttribute("Usage")
 | |
|                 Usage += "  HII Formset"
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             try:
 | |
|                 CName = str(XmlElementData(Guid.getElementsByTagName("HiiCName")[0]))
 | |
|                 if (options.debug and options.verbose > 1):
 | |
|                     print "Hii Formset Adding Guid CName: %-45s # %s Archs: %s" % (CName, Usage, Archs)
 | |
|                 AddGuid(Archs, CName, Usage)
 | |
|                 AutoGenGuid.append(CName)
 | |
|             except:
 | |
|                 pass
 | |
|  
 | |
|     """ Check for the Variables Element """
 | |
|     Guids = "/ModuleSurfaceArea/Variables/Variable"
 | |
|     GuidList = []
 | |
|     try:
 | |
|         GuidList = XmlList(Msa, Guids)
 | |
|     except:
 | |
|         pass
 | |
| 
 | |
|     if (len(GuidList) > 0):
 | |
|         for Guid in GuidList:
 | |
|             Archs = ""
 | |
|             Usage = ""
 | |
|             CName = ""
 | |
|             VariableName = ""
 | |
| 
 | |
|             try:
 | |
|                 Archs = Guid.getAttribute("SupArchList")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             Archs = chkArch(Archs)
 | |
| 
 | |
|             try:
 | |
|                 Usage = Guid.getAttribute("Usage")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             try:
 | |
|                 VariableName = str(XmlElementData(Guid.getElementsByTagName("VariableName")[0]))
 | |
|                 CName = str(XmlElementData(Guid.getElementsByTagName("GuidC_Name")[0]))
 | |
| 
 | |
|                 HexData = VariableName.strip().split()
 | |
|                 UniString = " L\""
 | |
|                 for dig in HexData[:]:
 | |
|                     UniString += str(unichr(eval(dig)))
 | |
|                 UniString += "\""
 | |
| 
 | |
|                 Usage += UniString
 | |
|       
 | |
|                 if CName in set(GuidDecls):
 | |
|                     removeDups(CName, GuidCName)
 | |
|                     removeDups(CName, GuidCNameIa32)
 | |
|                     removeDups(CName, GuidCNameX64)
 | |
|                     removeDups(CName, GuidCNameIPF)
 | |
|                     removeDups(CName, GuidCNameEBC)
 | |
| 
 | |
|                     if (options.debug):
 | |
|                         print "Variable Adding Guid CName: %-45s # %s Archs: %s" % (CName, Usage, Archs)
 | |
|                     AddGuid(Archs, CName, Usage)
 | |
|                     AutoGenGuid.append(CName)
 | |
|                 else:
 | |
|                     if (len(DefinesComments) == 0):
 | |
|                         DefinesComments.insert(0, "\n#\n# The following information is for reference only and not required by the build tools.\n#\n")
 | |
|                     DefinesComments.append("#  Variable Guid C Name: " + CName + " Variable Name:" + UniString + "\n")
 | |
|                     Flag = True
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|     if (Flag):
 | |
|         DefinesComments.append("#\n")
 | |
|         Flag = False
 | |
| 
 | |
|     """ Check for the Protocol Element """
 | |
|     Protocols = "/ModuleSurfaceArea/Protocols/Protocol"
 | |
|     ProtocolList = []
 | |
|     ProtocolCName = []
 | |
|     ProtocolCNameIa32 = []
 | |
|     ProtocolCNameX64 = []
 | |
|     ProtocolCNameIPF = []
 | |
|     ProtocolCNameEBC = []
 | |
| 
 | |
|     try:
 | |
|         ProtocolList = XmlList(Msa, Protocols)
 | |
|     except:
 | |
|         pass
 | |
| 
 | |
|     if (len(ProtocolList) > 0):
 | |
|         for Protocol in ProtocolList:
 | |
|             Archs = ""
 | |
|             Usage = ""
 | |
|             CName = ""
 | |
| 
 | |
|             try:
 | |
|                 Archs = Protocol.getAttribute("SupArchList")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             Archs = chkArch(Archs)
 | |
| 
 | |
|             try:
 | |
|                 Usage = Protocol.getAttribute("Usage")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             try:
 | |
|                 CName = str(XmlElementData(Protocol.getElementsByTagName("ProtocolCName")[0]))
 | |
|                 AutoGenGuid.append(CName)
 | |
|                 removeDups(CName, GuidCName)
 | |
|                 removeDups(CName, GuidCNameIa32)
 | |
|                 removeDups(CName, GuidCNameX64)
 | |
|                 removeDups(CName, GuidCNameIPF)
 | |
|                 removeDups(CName, GuidCNameEBC)
 | |
|       
 | |
|                 if (options.debug and options.verbose > 1):
 | |
|                     print "Found %s - %s - %s " % (CName, Usage, str(len(Archs)))
 | |
| 
 | |
|                 if "IA32" in Archs:
 | |
|                     ProtocolCNameIa32.insert(0, str("  %-45s # PROTOCOL %s" % (CName, Usage)))
 | |
|                 if "X64" in Archs:
 | |
|                     ProtocolCNameX64.insert(0, str("  %-45s # PROTOCOL %s" % (CName, Usage)))
 | |
|                 if "IPF" in Archs:
 | |
|                     ProtocolCNameIPF.insert(0, str("  %-45s # PROTOCOL %s" % (CName, Usage)))
 | |
|                 if "EBC" in Archs:
 | |
|                     ProtocolCNameEBC.insert(0, str("  %-45s # PROTOCOL %s" % (CName, Usage)))
 | |
|                 if "ALL" in Archs:
 | |
|                     ProtocolCName.insert(0, str("  %-45s # PROTOCOL %s" % (CName, Usage)))
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
| 
 | |
|     Protocols = "/ModuleSurfaceArea/Protocols/ProtocolNotify"
 | |
|     try:
 | |
|         ProtocolList = XmlList(Msa, Protocols)
 | |
|     except:
 | |
|         pass
 | |
| 
 | |
|     if (len(ProtocolList) > 0):
 | |
|         for Protocol in ProtocolList:
 | |
|             Archs = ""
 | |
|             Usage = ""
 | |
|             CName = ""
 | |
| 
 | |
|             try:
 | |
|                 Archs = Protocol.getAttribute("SupArchList")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             Archs = chkArch(Archs)
 | |
| 
 | |
|             try:
 | |
|                 Usage = Protocol.getAttribute("Usage")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             try:
 | |
|                 CName = str(XmlElementData(Protocol.getElementsByTagName("ProtocolNotifyCName")[0]))
 | |
|                 AutoGenGuid.append(CName)
 | |
|                 removeDups(CName, GuidCName)
 | |
|                 removeDups(CName, GuidCNameIa32)
 | |
|                 removeDups(CName, GuidCNameX64)
 | |
|                 removeDups(CName, GuidCNameIPF)
 | |
|                 removeDups(CName, GuidCNameEBC)
 | |
|       
 | |
|                 if "IA32" in Archs:
 | |
|                     ProtocolCNameIa32.insert(0, "  %-45s # PROTOCOL_NOTIFY %s" % (CName, Usage))
 | |
|                 if "X64" in Archs:
 | |
|                     ProtocolCNameX64.insert(0, "  %-45s # PROTOCOL_NOTIFY %s" % (CName, Usage))
 | |
|                 if "IPF" in Archs:
 | |
|                     ProtocolCNameIPF.insert(0, "  %-45s # PROTOCOL_NOTIFY %s" % (CName, Usage))
 | |
|                 if "EBC" in Archs:
 | |
|                     ProtocolCNameEBC.insert(0, "  %-45s # PROTOCOL_NOTIFY %s" % (CName, Usage))
 | |
|                 if "ALL" in Archs:
 | |
|                     ProtocolCName.insert(0, "  %-45s # PROTOCOL_NOTIFY %s" % (CName, Usage))
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|     """ Check for the PPIs Element """
 | |
|     PPIs = "/ModuleSurfaceArea/PPIs/Ppi"
 | |
|     PPIsList = []
 | |
|     PpiCName = []
 | |
|     PpiCNameIa32 = []
 | |
|     PpiCNameX64 = []
 | |
|     PpiCNameIPF = []
 | |
|     PpiCNameEBC = []
 | |
| 
 | |
|     try:
 | |
|         PPIsList = XmlList(Msa, PPIs)
 | |
|     except:
 | |
|         pass
 | |
| 
 | |
|     if (len(PPIsList) > 0):
 | |
|         for Ppi in PPIsList:
 | |
|             Archs = ""
 | |
|             Usage = ""
 | |
|             CName = ""
 | |
| 
 | |
|             try:
 | |
|                 Archs = str(Ppi.getAttribute("SupArchList"))
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             Archs = chkArch(Archs)
 | |
| 
 | |
|             try:
 | |
|                 Usage = str(Ppi.getAttribute("Usage"))
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             try:
 | |
|                 CName = str(XmlElementData(Ppi.getElementsByTagName("PpiCName")[0])).strip()
 | |
|                 AutoGenGuid.append(CName)
 | |
|                 removeDups(CName, GuidCName)
 | |
|                 removeDups(CName, GuidCNameIa32)
 | |
|                 removeDups(CName, GuidCNameX64)
 | |
|                 removeDups(CName, GuidCNameIPF)
 | |
|                 removeDups(CName, GuidCNameEBC)
 | |
|       
 | |
|                 if "IA32" in Archs:
 | |
|                     PpiCNameIa32.insert(0, "  %-45s # PPI %s" % (CName, Usage))
 | |
|                 if "X64" in Archs:
 | |
|                     PpiCNameX64.insert(0, "  %-45s # PPI %s" % (CName, Usage))
 | |
|                 if "IPF" in Archs:
 | |
|                     PpiCNameIPF.insert(0, "  %-45s # PPI %s" % (CName, Usage))
 | |
|                 if "EBC" in Archs:
 | |
|                     PpiCNameEBC.insert(0, "  %-45s # PPI %s" % (CName, Usage))
 | |
|                 if "ALL" in Archs:
 | |
|                     PpiCName.insert(0, "  %-45s # PPI %s" % (CName, Usage))
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
| 
 | |
|     PPIs = "/ModuleSurfaceArea/PPIs/PpiNotify"
 | |
|     try:
 | |
|         PPIsList = XmlList(Msa, PPIs)
 | |
|     except:
 | |
|         pass 
 | |
| 
 | |
|     if (len(PPIsList) > 0):
 | |
|         for Ppi in PPIsList:
 | |
|             Archs = ""
 | |
|             Usage = ""
 | |
|             CName = ""
 | |
| 
 | |
|             try:
 | |
|                 Archs = Ppi.getAttribute("SupArchList")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             Archs = chkArch(Archs)
 | |
| 
 | |
|             try:
 | |
|                 Usage = Ppi.getAttribute("Usage")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             try:
 | |
|                 CName = str(XmlElementData(Ppi.getElementsByTagName("PpiNotifyCName")[0]))
 | |
|                 AutoGenGuid.append(CName)
 | |
|                 removeDups(CName, GuidCName)
 | |
|                 removeDups(CName, GuidCNameIa32)
 | |
|                 removeDups(CName, GuidCNameX64)
 | |
|                 removeDups(CName, GuidCNameIPF)
 | |
|                 removeDups(CName, GuidCNameEBC)
 | |
|       
 | |
|                 if "IA32" in Archs:
 | |
|                     PpiCNameIa32.insert(0, "  %-45s # PPI_NOTIFY %s" % (CName, Usage))
 | |
|                 if "X64" in Archs:
 | |
|                     PpiCNameX64.insert(0,  "  %-45s # PPI_NOTIFY %s" % (CName, Usage))
 | |
|                 if "IPF" in Archs:
 | |
|                     PpiCNameIPF.insert(0,  "  %-45s # PPI_NOTIFY %s" % (CName, Usage))
 | |
|                 if "EBC" in Archs:
 | |
|                     PpiCNameEBC.insert(0,  "  %-45s # PPI_NOTIFY %s" % (CName, Usage))
 | |
|                 if "ALL" in Archs:
 | |
|                     PpiCName.insert(0,     "  %-45s # PPI_NOTIFY %s" % (CName, Usage))
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
| 
 | |
|     """ Get the PCD entries now """
 | |
|     PcdCoded = "/ModuleSurfaceArea/PcdCoded/PcdEntry"
 | |
|     PcdList = []
 | |
|     try:
 | |
|         PcdList = XmlList(Msa, PcdCoded)
 | |
|     except:
 | |
|         pass
 | |
| 
 | |
|     (PcdFF, PcdFFIa32, PcdFFX64, PcdFFIpf, PcdFFEbc) = ([],[],[],[],[])
 | |
|     (PcdFAB, PcdFABIa32, PcdFABX64, PcdFABIpf, PcdFABEbc) = ([],[],[],[],[])
 | |
|     (PcdPIM, PcdPIMIa32, PcdPIMX64, PcdPIMIpf, PcdPIMEbc) = ([],[],[],[],[])
 | |
|     (PcdDY, PcdDYIa32, PcdDYX64, PcdDYIpf, PcdDYEbc) = ([],[],[],[],[])
 | |
|     (PcdDYE, PcdDYEIa32, PcdDYEX64, PcdDYEIpf, PcdDYEEbc) = ([],[],[],[],[])
 | |
| 
 | |
|     if (len(PcdList) > 0):
 | |
|         for Pcd in PcdList:
 | |
|             Archs = ""
 | |
|             Usage = ""
 | |
|             CName = ""
 | |
|             DefVal = ""
 | |
| 
 | |
|             try:
 | |
|                 Archs = Pcd.getAttribute("SupArchList")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             Archs = chkArch(Archs)
 | |
| 
 | |
|             try:
 | |
|                 ItemType = Pcd.getAttribute("PcdItemType")
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             try:
 | |
|                 CName = str(XmlElementData(Pcd.getElementsByTagName("C_Name")[0]))
 | |
|             except:
 | |
|                 raise SyntaxError, "ERROR: MSA has a PCD with no Pcd C_Name defined"
 | |
| 
 | |
|             try:
 | |
|                 TSGC = str(XmlElementData(Pcd.getElementsByTagName("TokenSpaceGuidCName")[0]))
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             try:
 | |
|                 DefVal = str(XmlElementData(Pcd.getElementsByTagName("DefaultValue")))
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
|             if (len(DefVal) > 0):
 | |
|                 line = TSGC + "." + CName + "|" + DefVal
 | |
|             else:
 | |
|                 line = TSGC + "." + CName
 | |
| 
 | |
|             if (ItemType == "FEATURE_FLAG"):
 | |
|                 if ("IA32" in Archs):
 | |
|                     PcdFFIa32.insert(0, line)
 | |
|                 if ("IPF" in Archs):
 | |
|                     PcdFFIpf.insert(0, line)
 | |
|                 if ("X64" in Archs):
 | |
|                     PcdFFX64.insert(0, line)
 | |
|                 if ("EBC" in Archs):
 | |
|                     PcdFFEbc.insert(0, line)
 | |
|                 if ("ALL" in Archs):
 | |
|                     PcdFF.insert(0, line)
 | |
|             elif (ItemType == "FIXED_AT_BUILD"):
 | |
|                 if ("IA32" in Archs):
 | |
|                     PcdFABIa32.insert(0, line)
 | |
|                 if ("IPF" in Archs):
 | |
|                     PcdFABIpf.insert(0, line)
 | |
|                 if ("X64" in Archs):
 | |
|                     PcdFABX64.insert(0, line)
 | |
|                 if ("EBC" in Archs):
 | |
|                     PcdFABEbc.insert(0, line)
 | |
|                 if ("ALL" in Archs):
 | |
|                     PcdFAB.insert(0, line)
 | |
|             elif (ItemType == "PATCHABLE_IN_MODULE"):
 | |
|                 if ("IA32" in Archs):
 | |
|                     PcdPIMIa32.insert(0, line)
 | |
|                 if ("IPF" in Archs):
 | |
|                     PcdPIMIpf.insert(0, line)
 | |
|                 if ("X64" in Archs):
 | |
|                     PcdPIMX64.insert(0, line)
 | |
|                 if ("EBC" in Archs):
 | |
|                     PcdPIMEbc.insert(0, line)
 | |
|                 if ("ALL" in Archs):
 | |
|                     PcdFAB.insert(0, line)
 | |
|             elif (ItemType == "DYNAMIC_EX"):
 | |
|                 if ("IA32" in Archs):
 | |
|                     PcdDYEIa32.insert(0, line)
 | |
|                 if ("IPF" in Archs):
 | |
|                     PcdDYEIpf.insert(0, line)
 | |
|                 if ("X64" in Archs):
 | |
|                     PcdDYEX64.insert(0, line)
 | |
|                 if ("EBC" in Archs):
 | |
|                     PcdDYEEbc.insert(0, line)
 | |
|                 if ("ALL" in Archs):
 | |
|                     PcdDYE.insert(0, line)
 | |
|             else:
 | |
|                 if ("IA32" in Archs):
 | |
|                     PcdDYIa32.insert(0, line)
 | |
|                 if ("IPF" in Archs):
 | |
|                     PcdDYIpf.insert(0, line)
 | |
|                 if ("X64" in Archs):
 | |
|                     PcdDYX64.insert(0, line)
 | |
|                 if ("EBC" in Archs):
 | |
|                     PcdDYEbc.insert(0, line)
 | |
|                 if ("ALL" in Archs):
 | |
|                     PcdDY.insert(0, line)
 | |
| 
 | |
|     """ User Extensions Section """
 | |
|     UEList = []
 | |
|     UESectionList = []
 | |
|     try:
 | |
|         UESectionList = XmlList(Msa, "/ModuleSurfaceArea/UserExtensions")
 | |
|     except:
 | |
|         pass
 | |
| 
 | |
|     if (len(UESectionList) > 0):
 | |
|         for UE in UESectionList[:]:
 | |
|             UserId = ""
 | |
|             Identifier = ""
 | |
|             Value = ""
 | |
| 
 | |
|             try:
 | |
|                 UserId = str(UE.getAttribute("UserID"))
 | |
|             except:
 | |
|                 raise SyntaxError, "ERROR: Malformed MSA, No UserID Specified in UserExtensions element"
 | |
| 
 | |
|             try:
 | |
|                 Identifier = str(UE.getAttribute("Identifier"))
 | |
|             except:
 | |
|                 raise SyntaxError, "ERROR: Malformed MSA, No Identifier Specified in UserExtensions element"
 | |
| 
 | |
|             if (options.debug):
 | |
|                 print "FOUND A UE Element", UserId, Identifier
 | |
| 
 | |
|             try:
 | |
|                 Value = str(XmlElementData(UE))
 | |
|             except:
 | |
|                 pass
 | |
|       
 | |
|             Entry = [UserId, Identifier, Value]
 | |
|             UEList.insert(0, Entry)
 | |
| 
 | |
| 
 | |
| 
 | |
|     if (len(Externlist) > 0):
 | |
|         AutoGenSource = ""
 | |
|         AutoGenDefinitionSource = ""
 | |
|         AutoGenEntryPointSource = ""
 | |
|         AutoGenUnloadSource = ""
 | |
|         if (len(AutoGenDriverModel) > 0):
 | |
|             AutoGenCode = AddDriverBindingProtocolStatement(AutoGenDriverModel)
 | |
|             AutoGenEntryPointSource += AutoGenCode[0]
 | |
|             AutoGenUnloadSource += AutoGenCode[1]
 | |
|             AutoGenDeclaration += AutoGenCode[3]
 | |
|             
 | |
| 
 | |
|         if (len(AutoGenExitBootServices) > 0):
 | |
|             print "[Warning] Please manually add Create Event statement for Exit Boot Service Event!"
 | |
|             if options.event:
 | |
|                 AutoGenCode = AddBootServiceEventStatement(AutoGenExitBootServices)
 | |
|                 AutoGenEntryPointSource += AutoGenCode[0]
 | |
|                 AutoGenUnloadSource += AutoGenCode[1]
 | |
|                 AutoGenDefinitionSource += AutoGenCode[2]
 | |
|                 AutoGenDeclaration += AutoGenCode[3]
 | |
| 
 | |
|         if (len(AutoGenVirtualAddressChanged) > 0):
 | |
|             print "[Warning] Please manually add Create Event statement for Virtual Address Change Event!"
 | |
|             if options.event:
 | |
|                 AutoGenCode = AddVirtualAddressEventStatement(AutoGenVirtualAddressChanged)
 | |
|                 AutoGenEntryPointSource += AutoGenCode[0]
 | |
|                 AutoGenUnloadSource += AutoGenCode[1]
 | |
|                 AutoGenDefinitionSource += AutoGenCode[2]
 | |
|                 AutoGenDeclaration += AutoGenCode[3]
 | |
|             
 | |
|         if AutoGenEntryPointSource != "":
 | |
|             OldEntryPoint = AutoGenEntryPoint
 | |
|             AutoGenCode   = AddNewEntryPointContentsStatement(BaseName, AutoGenEntryPoint, AutoGenEntryPointSource)
 | |
|             AutoGenEntryPoint = AutoGenCode[0]
 | |
|             AutoGenEntryPointSource = AutoGenCode[1]
 | |
|             AutoGenDeclaration += AutoGenCode[2]
 | |
|                 
 | |
|             
 | |
|         if AutoGenEntryPoint != "":    
 | |
|             DriverModules.insert(0, "  %-30s = %s\n" % ("ENTRY_POINT" , AutoGenEntryPoint))
 | |
|          
 | |
|         AutoGenSource = AutoGenDefinitionSource + AutoGenEntryPointSource + AutoGenUnloadSource     
 | |
|         
 | |
|         if (lFlag):
 | |
|             DefinesComments.append("#\n")
 | |
| 
 | |
|         if (Flag and len(DefinesComments) > 0):
 | |
|             DefinesComments.insert(0, "\n#\n# The following information is for reference only and not required by the build tools.\n#\n")
 | |
| 
 | |
|         if (options.debug and options.verbose > 2):
 | |
|             if (len(DriverModules) > 0):
 | |
|                 print DriverModules
 | |
|             if (len(LibraryModules) > 0):
 | |
|                 print LibraryModules
 | |
|             if (len(DefinesComments) > 0):
 | |
|                 print DefinesComments
 | |
| 
 | |
|     Depex = []
 | |
|     DepexIa32 = []
 | |
|     DepexX64 = []
 | |
|     DepexIpf = []
 | |
|     DepexEbc = []
 | |
|     
 | |
|     for DxsFile, Archs in AutoGenDxsFiles:
 | |
|         fileContents = openSourceFile(AutoGenModuleFolder, DxsFile)
 | |
|         Contents, Unresolved = TranslateDpxSection(fileContents)
 | |
|         if Contents == "":
 | |
|             print "[warning] Cannot read dxs expression"
 | |
|         else:
 | |
|             if (len(Unresolved) > 0):
 | |
|                 print "[warning] Guid Macro(s): %s cannot find corresponding cNames. Please resolve it in [depex] section in extened inf" % ",".join(Unresolved)
 | |
|                 
 | |
|             if ("IA32" in Archs):
 | |
|                 DepexIa32.insert(0, Contents)
 | |
|             if ("IPF" in Archs):
 | |
|                 DepexIpf.insert(0, Contents)
 | |
|             if ("X64" in Archs):
 | |
|                 DepexX64.insert(0, Contents)
 | |
|             if ("EBC" in Archs):
 | |
|                 DepexEbc.insert(0, Contents)
 | |
|             if ("ALL" in Archs):
 | |
|                 Depex.insert(0, Contents)
 | |
| 
 | |
|     AutoGenSourceHeaderFormat = "/**@file\n  %s\n\n  %s\n  %s\n  %s\n**/\n\n%s"
 | |
|     includeCommonHeaderFileStatement = "#include \"%s\"" % commonHeaderFilename
 | |
| 
 | |
|     AutoGenHeader += AddSystemIncludeStatement(ModType, AutoGenPackage)
 | |
|     AutoGenHeader += AddGuidStatement(AutoGenGuid)
 | |
|     AutoGenHeader += AddLibraryClassStatement(AutoGenLibClass)
 | |
| 
 | |
|     if options.manual:
 | |
|         saveSourceFile(AutoGenModuleFolder, "CommonHeader.txt", AutoGenHeader)
 | |
|     else:
 | |
|  
 | |
|         commonHeaderFilename2 = re.sub("(?=[^a-z])", "_", commonHeaderFilename)
 | |
|         commonHeaderFilename2 = "_" + commonHeaderFilename2.replace(".", "").upper() + "_"
 | |
|         briefDiscription = "Common header file shared by all source files."
 | |
|         detailedDiscription = "This file includes package header files, library classes and protocol, PPI & GUID definitions.\n"
 | |
|         AutoGenHeader += AutoGenDeclaration
 | |
|         AutoGenHeader = "#ifndef %s\n#define %s\n\n\n%s\n#endif\n" % (commonHeaderFilename2, commonHeaderFilename2, AutoGenHeader)
 | |
|         AutoGenHeader = AutoGenSourceHeaderFormat % (briefDiscription, detailedDiscription, CopyRight, License, AutoGenHeader)
 | |
|         saveSourceFile(AutoGenModuleFolder, commonHeaderFilename, AutoGenHeader)
 | |
|         SrcFilenames.append(commonHeaderFilename)
 | |
| 
 | |
|         for source in AutoGenSourceFiles:
 | |
|             extension = os.path.splitext(source)[1]
 | |
|             if extension == ".c":
 | |
|                 sourceContents = openSourceFile(AutoGenModuleFolder, source)
 | |
|                 sourceContents = AddCommonInclusionStatement(sourceContents, includeCommonHeaderFileStatement)
 | |
|                 saveSourceFile(AutoGenModuleFolder, source, sourceContents)
 | |
|     
 | |
| 
 | |
|     if AutoGenSource != "":
 | |
|         briefDiscription = "Entry Point Source file."
 | |
|         detailedDiscription = "This file contains the user entry point \n"
 | |
|         AutoGenSource = AutoGenSourceHeaderFormat % (briefDiscription, detailedDiscription, CopyRight, License, AutoGenSource)
 | |
|         AutoGenSource = AddCommonInclusionStatement(AutoGenSource, includeCommonHeaderFileStatement)
 | |
| 
 | |
|         saveSourceFile(AutoGenModuleFolder, entryPointFilename, AutoGenSource)
 | |
|         SrcFilenames.append(entryPointFilename)
 | |
|     
 | |
|     
 | |
| 
 | |
|       
 | |
|     # DONE Getting data, now output it in INF format.
 | |
|     Msa.unlink()
 | |
|     Fdb.unlink()
 | |
|     Output = []
 | |
| 
 | |
|     """ Print the converted data format """
 | |
|     head =  "#/** @file\n"
 | |
|     head += "# " + str(Abstract) + "\n#\n"
 | |
|     head += "# " + str(Description).strip().replace("\n", "\n# ") + "\n"
 | |
|     head += "# " + str(CopyRight) + "\n#\n"
 | |
|     head += "#  " + str(License).replace("\n", "\n# ").replace("  ", " ").strip() + "\n#\n"
 | |
|     head += "#\n#**/\n"
 | |
|   
 | |
|     Output.append(head)
 | |
|     if (options.debug):
 | |
|         print head
 | |
| 
 | |
| ##    Defines = "\n" + "#"*80+ "\n#\n"
 | |
| ##    if (BinModule != "false"):
 | |
| ##        Defines += "# Defines Section - statements that will be processed to generate a binary image.\n"
 | |
| ##    else:
 | |
| ##        Defines += "# Defines Section - statements that will be processed to create a Makefile.\n"
 | |
| ##    Defines += "#\n" + "#"*80 + "\n"
 | |
| 
 | |
|     Defines  = "\n"
 | |
|     Defines += "[Defines]\n"
 | |
|     Defines += "  %-30s = %s\n" % ("INF_VERSION", "0x00010005")
 | |
|     Defines += "  %-30s = %s\n" % ("BASE_NAME", BaseName)
 | |
|     Defines += "  %-30s = %s\n" % ("FILE_GUID", GuidValue)
 | |
|     Defines += "  %-30s = %s\n" % ("MODULE_TYPE", ModType)
 | |
|     Defines += "  %-30s = %s\n" % ("VERSION_STRING", VerString)
 | |
|   
 | |
|     if (len(PcdIsDriver) > 0):
 | |
|         Defines += "  %-30s = %s\n" %  ("PCD_DRIVER", PcdIsDriver)
 | |
|   
 | |
|     if (len(IamLibrary) > 0):
 | |
|         lcstr = ""
 | |
|         for lc in IamLibrary[:]:
 | |
|             lcstr += lc + " "
 | |
|             Defines += "  %-30s = %s" %  ("LIBRARY_CLASS", lcstr)
 | |
|         Defines += "\n"
 | |
|   
 | |
|     if (len(SpecList) > 0):
 | |
|         for spec in SpecList[:]:
 | |
|             (specname, specval) = spec.split()
 | |
|             Defines += "  %-30s = %s\n" %  (specname, specval)
 | |
|         Defines += "\n"
 | |
|   
 | |
|     if (len(DriverModules) > 0):
 | |
|         for line in DriverModules[:]:
 | |
|             Defines += line
 | |
| 
 | |
|     if (len(LibraryModules) > 0):
 | |
|         for line in LibraryModules[:]:
 | |
|             Defines += line
 | |
|      
 | |
|     if (len(DefinesComments) > 0):
 | |
|         for line in DefinesComments[:]:
 | |
|             Defines += line
 | |
|   
 | |
|     Output.append(Defines)
 | |
|   
 | |
|     if (options.debug):
 | |
|         print Defines
 | |
|   
 | |
|     if (BinModule != "false"):
 | |
|         """ Binary Module, so sources are really binaries. """
 | |
| ##        Sources = "\n" + "#"*80 + "\n#\n"
 | |
| ##        Sources += "# Binaries Section - list of binary files that are required for the build\n# to succeed.\n"
 | |
| ##        Sources += "#\n" + "#"*80 + "\n\n"
 | |
|         Sources = "\n"
 | |
|         if ModType == "UEFI_APPLICATION":
 | |
|             FileType = "UEFI_APP"
 | |
|             if options.verbose > 0:
 | |
|                 print "WARNING: Binary Module: %s is assuming UEFI_APPLICATION file type." % (options.filename)
 | |
|         else:
 | |
|             FileType = "FV"
 | |
|             if options.verbose > 0:
 | |
|                 print "WARNING: Binary Module: %s is assuming FV file type." % (options.filename)
 | |
|   
 | |
|         if (len(SrcFilenames) > 0):
 | |
|             Sources += "[Binaries.common]\n"
 | |
|             for file in SrcFilenames[:]:
 | |
|                 file = file.replace("\\", "/")
 | |
|                 Sources += "  " + FileType + "|" + file + "\n"
 | |
|             Sources += "\n"
 | |
|   
 | |
|         if (len(SrcFilenamesIa32) > 0):
 | |
|             Sources += "[Binaries.Ia32]\n"
 | |
|             for file in SrcFilenamesIa32[:]:
 | |
|                 file = file.replace("\\", "/")
 | |
|                 Sources += "  " + FileType + "|" + file + "\n"
 | |
|             Sources += "\n"
 | |
|   
 | |
|         if (len(SrcFilenamesX64) > 0):
 | |
|             Sources += "[Binaries.X64]\n"
 | |
|             for file in SrcFilenamesX64[:]:
 | |
|                 file = file.replace("\\", "/")
 | |
|                 Sources += "  " + FileType + "|" + file + "\n"
 | |
|             Sources += "\n"
 | |
|   
 | |
|         if (len(SrcFilenamesIpf) > 0):
 | |
|             Sources += "[Binaries.IPF]\n"
 | |
|             for file in SrcFilenamesIpf[:]:
 | |
|                 file = file.replace("\\", "/")
 | |
|                 Sources += "  " + FileType + "|" + file + "\n"
 | |
|             Sources += "\n"
 | |
|   
 | |
|         if (len(SrcFilenamesEbc) > 0):
 | |
|             Sources += "[Binaries.EBC]\n"
 | |
|             for file in SrcFilenamesEbc[:]:
 | |
|                 file = file.replace("\\", "/")
 | |
|                 Sources += "  " + FileType + "|" + file + "\n"
 | |
|             Sources += "\n"
 | |
|   
 | |
|         Output.append(Sources)
 | |
|         if (options.debug):
 | |
|             print Sources
 | |
|     else: 
 | |
| ##        Sources = "\n" + "#"*80 + "\n#\n"
 | |
| ##        Sources += "# Sources Section - list of files that are required for the build to succeed.\n"
 | |
| ##        Sources += "#\n" + "#"*80 + "\n\n"
 | |
|         Sources = "\n"
 | |
|         if (len(SrcFilenames) > 0):
 | |
|             Sources += "[Sources.common]\n"
 | |
|             for file in SrcFilenames[:]:
 | |
|                 Sources += "  " + file + "\n"
 | |
|             Sources += "\n"
 | |
|   
 | |
|         if (len(SrcFilenamesIa32) > 0):
 | |
|             Sources += "[Sources.Ia32]\n"
 | |
|             for file in SrcFilenamesIa32[:]:
 | |
|                 Sources += "  " + file + "\n"
 | |
|             Sources += "\n"
 | |
|   
 | |
|         if (len(SrcFilenamesX64) > 0):
 | |
|             Sources += "[Sources.X64]\n"
 | |
|             for file in SrcFilenamesX64[:]:
 | |
|                 Sources += "  " + file + "\n"
 | |
|             Sources += "\n"
 | |
|   
 | |
|         if (len(SrcFilenamesIpf) > 0):
 | |
|             Sources += "[Sources.IPF]\n"
 | |
|             for file in SrcFilenamesIpf[:]:
 | |
|                 Sources += "  " + file + "\n"
 | |
|             Sources += "\n"
 | |
|   
 | |
|         if (len(SrcFilenamesEbc) > 0):
 | |
|             Sources += "[Sources.EBC]\n"
 | |
|             for file in SrcFilenamesEbc[:]:
 | |
|                 Sources += "  " + file + "\n"
 | |
|             Sources += "\n"
 | |
|   
 | |
|         Output.append(Sources)
 | |
|         if (options.debug):
 | |
|             print Sources
 | |
|   
 | |
| 
 | |
|     includeLine = ""
 | |
|     if ((len(HeaderLocations) > 0) or (len(Dirs) > 0)):
 | |
|         allLcs = set(LibClassList + LibClassListIa32 + LibClassListX64 + LibClassListIpf + LibClassListEbc + Dirs)
 | |
|         Lines = []
 | |
|         for line in HeaderLocations[:]:
 | |
|             for Lc in allLcs:
 | |
|                 (keyword, header) = line.split("|")
 | |
|                 if Lc in keyword:
 | |
|                     if (options.debug):
 | |
|                         print "FOUND", Lc, "in", keyword, "header", header
 | |
|                     path = "$(WORKSPACE)/" + os.path.split(header)[0]
 | |
|                     Lines.insert(0, path.strip())
 | |
|         Includes = ""
 | |
| ##        Includes = "\n" + "#"*80 + "\n#\n"
 | |
| ##        Includes += "# Includes Section - list of Include locations that are required for\n"
 | |
| ##        Includes += "#                    this module.\n"
 | |
| ##        Includes += "#\n" + "#"*80 + "\n\n"
 | |
| ##        Includes += "[Includes]\n"
 | |
| ##        includeLines = []
 | |
| ##        includeLines = set(Lines)
 | |
| ##        if (options.debug):
 | |
| ##            print "There are", len(includeLines), "entries"
 | |
| ##        for Line in includeLines:
 | |
| ##            Includes += "  " + str(Line).strip().replace("\\", "/") + "\n"
 | |
|   
 | |
|         Output.append(Includes)
 | |
|         if (options.debug):
 | |
|             print Includes
 | |
|   
 | |
|          
 | |
|   
 | |
|     if ((len(PkgList) + len(PkgListIa32) + len(PkgListX64) + len(PkgListIpf) + len(PkgListEbc)) > 0):
 | |
|         """ We do this if and only if we have Package Dependencies """
 | |
| ##        PackageDepends = "\n" + "#"*80 + "\n#\n"
 | |
| ##        PackageDepends += "# Package Dependency Section - list of Package files that are required for\n"
 | |
| ##        PackageDepends += "#                              this module.\n"
 | |
| ##        PackageDepends += "#\n" + "#"*80 + "\n\n"
 | |
|         PackageDepends = "\n"
 | |
|         if (len(PkgList) > 0):
 | |
|             PackageDepends += "[Packages]\n"
 | |
|             for lc in PkgList[:]:
 | |
|                 lc = lc.replace("\\", "/")
 | |
|                 PackageDepends += "  " + lc + "\n"
 | |
|             PackageDepends += "\n"
 | |
|   
 | |
|         if (len(PkgListIa32) > 0):
 | |
|             PackageDepends += "[Packages.IA32]\n"
 | |
|             for lc in PkgListIa32[:]:
 | |
|                 lc = lc.replace("\\", "/")
 | |
|                 PackageDepends += "  " + lc + "\n"
 | |
|             PackageDepends += "\n"
 | |
|   
 | |
|         if (len(PkgListX64) > 0):
 | |
|             PackageDepends += "[Packages.X64]\n"
 | |
|             for lc in PkgListX64[:]:
 | |
|                 lc = lc.replace("\\", "/")
 | |
|                 PackageDepends += "  " + lc + "\n"
 | |
|             PackageDepends += "\n"
 | |
|   
 | |
|         if (len(PkgListIpf) > 0):
 | |
|             PackageDepends += "[Packages.IPF]\n"
 | |
|             for lc in PkgListIpf[:]:
 | |
|                 lc = lc.replace("\\", "/")
 | |
|                 PackageDepends += "  " + lc + "\n"
 | |
|             PackageDepends += "\n"
 | |
|   
 | |
|         if (len(PkgListEbc) > 0):
 | |
|             PackageDepends += "[Packages.EBC]\n"
 | |
|             for lc in PkgListEbc[:]:
 | |
|                 lc = lc.replace("\\", "/")
 | |
|                 PackageDepends += "  " + lc + "\n"
 | |
|             PackageDepends += "\n"
 | |
|   
 | |
|         Output.append(PackageDepends)
 | |
|         if (options.debug):
 | |
|             print PackageDepends
 | |
|   
 | |
|     if ((len(LibClassList) + len(LibClassListIa32) + len(LibClassListX64) + len(LibClassListIpf) + len(LibClassListEbc)) > 0):
 | |
| ##        LibraryClasses = "\n" + "#"*80 + "\n#\n"
 | |
| ##        LibraryClasses += "# Library Class Section - list of Library Classes that are required for\n"
 | |
| ##        LibraryClasses += "#                         this module.\n"
 | |
| ##        LibraryClasses += "#\n" + "#"*80 + "\n\n"
 | |
|   
 | |
|         LibraryClasses = "\n"
 | |
|         if (len(LibClassList) > 0):
 | |
|             LibraryClasses += "[LibraryClasses]\n"
 | |
|             for lc in LibClassList[:]:
 | |
|               LibraryClasses += "  " + lc + "\n"
 | |
|             LibraryClasses += "\n"
 | |
|   
 | |
|         if (len(LibClassListIa32) > 0):
 | |
|             LibraryClasses += "[LibraryClasses.IA32]\n"
 | |
|             for lc in LibClassListIa32[:]:
 | |
|                 LibraryClasses += "  " + lc + "\n"
 | |
|             LibraryClasses += "\n"
 | |
|   
 | |
|         if (len(LibClassListX64) > 0):
 | |
|             LibraryClasses += "[LibraryClasses.X64]\n"
 | |
|             for lc in LibClassListX64[:]:
 | |
|                 LibraryClasses += "  " + lc + "\n"
 | |
|             LibraryClasses += "\n"
 | |
|   
 | |
|         if (len(LibClassListIpf) > 0):
 | |
|             LibraryClasses += "[LibraryClasses.IPF]\n"
 | |
|             for lc in LibClassListIpf[:]:
 | |
|                 LibraryClasses += "  " + lc + "\n"
 | |
|             LibraryClasses += "\n"
 | |
|   
 | |
|         if (len(LibClassListEbc) > 0):
 | |
|             LibraryClasses += "[LibraryClasses.EBC]\n"
 | |
|             for lc in LibClassListEbc[:]:
 | |
|                 LibraryClasses += "  " + lc + "\n"
 | |
|             LibraryClasses += "\n"
 | |
|   
 | |
|         Output.append(LibraryClasses)
 | |
|         if (options.debug):
 | |
|             print LibraryClasses
 | |
|   
 | |
|     # Print the Guids sections
 | |
|     if (len(GuidCName) + len(GuidCNameIa32) + len(GuidCNameIPF) + len(GuidCNameX64) + len(GuidCNameEBC)) > 0:
 | |
| ##        GuidSection = "\n" + "#"*80 + "\n#\n"
 | |
| ##        GuidSection += "# Guid C Name Section - list of Guids that this module uses or produces.\n"
 | |
| ##        GuidSection += "#\n" + "#"*80 + "\n\n"
 | |
|         GuidSection = "\n"
 | |
|         if (len(GuidCName) > 0):
 | |
|             GuidSection += "[Guids]\n"
 | |
|             for Guid in GuidCName[:]:
 | |
|                 GuidSection += Guid + "\n"
 | |
|             GuidSection += "\n"
 | |
|   
 | |
|         if (len(GuidCNameIa32) > 0):
 | |
|             GuidSection += "[Guids.IA32]\n"
 | |
|             for Guid in GuidCNameIa32[:]:
 | |
|                 GuidSection += Guid + "\n"
 | |
|             GuidSection += "\n"
 | |
|   
 | |
|         if (len(GuidCNameX64) > 0):
 | |
|             GuidSection += "[Guids.X64]\n"
 | |
|             for Guid in GuidCNameX64[:]:
 | |
|                 GuidSection += Guid + "\n"
 | |
|             GuidSection += "\n"
 | |
|   
 | |
|         if (len(GuidCNameIPF) > 0):
 | |
|             GuidSection += "[Guids.IPF]\n"
 | |
|             for Guid in GuidCNameIPF[:]:
 | |
|                 GuidSection += Guid + "\n"
 | |
|             GuidSection += "\n"
 | |
|   
 | |
|         if (len(GuidCNameEBC) > 0):
 | |
|             GuidSection += "[Guids.EBC]\n"
 | |
|             for Guid in GuidCNameEBC[:]:
 | |
|                 GuidSection += Guid + "\n"
 | |
|             GuidSection += "\n"
 | |
|   
 | |
|         Output.append(GuidSection)
 | |
|         if (options.debug and options.verbose > 1):
 | |
|             print GuidSection
 | |
|   
 | |
|     # Print the Protocol sections
 | |
|     if (len(ProtocolCName) + len(ProtocolCNameIa32) + len(ProtocolCNameIPF) + len(ProtocolCNameX64) + len(ProtocolCNameEBC)) > 0:
 | |
| ##        ProtocolsSection = "\n" + "#"*80 + "\n#\n"
 | |
| ##        ProtocolsSection += "# Protocol C Name Section - list of Protocol and Protocol Notify C Names\n"
 | |
| ##        ProtocolsSection += "#                           that this module uses or produces.\n"
 | |
| ##        ProtocolsSection += "#\n" + "#"*80 + "\n\n"
 | |
|   
 | |
|         ProtocolsSection = "\n"
 | |
|         if (len(ProtocolCName) > 0):
 | |
|             ProtocolsSection += "[Protocols]\n"
 | |
|             for Guid in ProtocolCName[:]:
 | |
|                 ProtocolsSection += Guid + "\n"
 | |
|             ProtocolsSection += "\n"
 | |
|   
 | |
|         if (len(ProtocolCNameIa32) > 0):
 | |
|             ProtocolsSection += "[Protocols.IA32]\n"
 | |
|             for Guid in ProtocolCNameIa32[:]:
 | |
|                 ProtocolsSection += Guid + "\n"
 | |
|             ProtocolsSection += "\n"
 | |
|   
 | |
|         if (len(ProtocolCNameX64) > 0):
 | |
|             ProtocolsSection += "[Protocols.X64]\n"
 | |
|             for Guid in ProtocolCNameX64[:]:
 | |
|                 ProtocolsSection += Guid + "\n"
 | |
|             ProtocolsSection += "\n"
 | |
|   
 | |
|         if (len(ProtocolCNameIPF) > 0):
 | |
|             ProtocolsSection += "[Protocols.IPF]\n"
 | |
|             for Guid in ProtocolCNameIPF[:]:
 | |
|                 ProtocolsSection += Guid + "\n"
 | |
|             ProtocolsSection += "\n"
 | |
|   
 | |
|         if (len(ProtocolCNameEBC) > 0):
 | |
|             ProtocolsSection += "[Protocols.EBC]\n"
 | |
|             for Guid in ProtocolCNameEBC[:]:
 | |
|                 ProtocolsSection += Guid + "\n"
 | |
|             ProtocolsSection += "\n"
 | |
|   
 | |
|         Output.append(ProtocolsSection)
 | |
|         if (options.debug):
 | |
|           print ProtocolsSection
 | |
|   
 | |
|     # Print the PPI sections
 | |
|     if (len(PpiCName) + len(PpiCNameIa32) + len(PpiCNameIPF) + len(PpiCNameX64) + len(PpiCNameEBC)) > 0:
 | |
| ##        PpiSection = "\n" + "#"*80 + "\n#\n"
 | |
| ##        PpiSection += "# PPI C Name Section - list of PPI and PPI Notify C Names that this module\n"
 | |
| ##        PpiSection += "#                      uses or produces.\n"
 | |
| ##        PpiSection += "#\n" + "#"*80 + "\n\n"
 | |
|   
 | |
|         PpiSection = "\n"
 | |
|         if (len(PpiCName) > 0):
 | |
|             PpiSection += "[Ppis]\n"
 | |
|             for Guid in PpiCName[:]:
 | |
|                 PpiSection += Guid + "\n"
 | |
|             PpiSection += "\n"
 | |
|   
 | |
|         if (len(PpiCNameIa32) > 0):
 | |
|             PpiSection += "[Ppis.IA32]\n"
 | |
|             for Guid in PpiCNameIa32[:]:
 | |
|                 PpiSection += Guid + "\n"
 | |
|             PpiSection += "\n"
 | |
|   
 | |
|         if (len(PpiCNameX64) > 0):
 | |
|             PpiSection += "[Ppis.X64]\n"
 | |
|             for Guid in PpiCNameX64[:]:
 | |
|                 PpiSection += Guid + "\n"
 | |
|             PpiSection += "\n"
 | |
|   
 | |
|         if (len(PpiCNameIPF) > 0):
 | |
|             PpiSection += "[Ppis.IPF]\n"
 | |
|             for Guid in PpiCNameIPF[:]:
 | |
|                 PpiSection += Guid + "\n"
 | |
|             PpiSection += "\n"
 | |
|   
 | |
|         if (len(PpiCNameEBC) > 0):
 | |
|             PpiSection += "[Ppis.EBC]\n"
 | |
|             for Guid in PpiCNameEBC[:]:
 | |
|                 PpiSection += Guid + "\n"
 | |
|             PpiSection += "\n"
 | |
|   
 | |
|         Output.append(PpiSection)
 | |
|         if (options.debug):
 | |
|             print PpiSection
 | |
|   
 | |
|     # Print the PCD sections
 | |
|     if ((len(PcdFF)+len(PcdFFIa32)+len(PcdFFX64)+len(PcdFFIpf)+len(PcdFFEbc)) > 0):
 | |
| ##        FeatureFlagSection = "\n" + "#"*80 + "\n#\n"
 | |
| ##        FeatureFlagSection += "# Pcd FEATURE_FLAG - list of PCDs that this module is coded for.\n"
 | |
| ##        FeatureFlagSection += "#\n" + "#"*80 + "\n\n"
 | |
|   
 | |
|         FeatureFlagSection = "\n"
 | |
|         if (len(PcdFF) > 0):
 | |
|             FeatureFlagSection += "[FeaturePcd.common]\n"
 | |
|             for Entry in PcdFF[:]:
 | |
|                 FeatureFlagSection += "  " + Entry + "\n"
 | |
|             FeatureFlagSection += "\n"
 | |
|         if (len(PcdFFIa32) > 0):
 | |
|             FeatureFlagSection += "[FeaturePcd.IA32]\n"
 | |
|             for Entry in PcdFFIa32[:]:
 | |
|                 FeatureFlagSection += "  " + Entry + "\n"
 | |
|             FeatureFlagSection += "\n"
 | |
|         if (len(PcdFFX64) > 0):
 | |
|             FeatureFlagSection += "[FeaturePcd.X64]\n"
 | |
|             for Entry in PcdFFX64[:]:
 | |
|                 FeatureFlagSection += "  " + Entry + "\n"
 | |
|             FeatureFlagSection += "\n"
 | |
|         if (len(PcdFFIpf) > 0):
 | |
|             FeatureFlagSection += "[PcdsFeatureFlag.IPF]\n"
 | |
|             for Entry in PcdFFIpf[:]:
 | |
|                 FeatureFlagSection += "  " + Entry + "\n"
 | |
|             FeatureFlagSection += "\n"
 | |
|         if (len(PcdFFEbc) > 0):
 | |
|             FeatureFlagSection += "[FeaturePcd.EBC]\n"
 | |
|             for Entry in PcdFFEbc[:]:
 | |
|                 FeatureFlagSection += "  " + Entry + "\n"
 | |
|             FeatureFlagSection += "\n"
 | |
|   
 | |
|         Output.append(FeatureFlagSection)
 | |
|         if (options.debug):
 | |
|           print FeatureFlagSection
 | |
|   
 | |
|     if ((len(PcdFAB)+len(PcdFABIa32)+len(PcdFABX64)+len(PcdFABIpf)+len(PcdFABEbc)) > 0):
 | |
| ##        FixedAtBuildSection = "\n" + "#"*80 + "\n#\n"
 | |
| ##        FixedAtBuildSection += "# Pcd FIXED_AT_BUILD - list of PCDs that this module is coded for.\n"
 | |
| ##        FixedAtBuildSection += "#\n" + "#"*80 + "\n\n"
 | |
|   
 | |
|         FixedAtBuildSection = "\n"
 | |
|         if (len(PcdFAB) > 0):
 | |
|             FixedAtBuildSection += "[FixedPcd.common]\n"
 | |
|             for Entry in PcdFAB[:]:
 | |
|                 FixedAtBuildSection += "  " + Entry + "\n"
 | |
|             FixedAtBuildSection += "\n"
 | |
|         if (len(PcdFABIa32) > 0):
 | |
|             FixedAtBuildSection += "[FixedPcd.IA32]\n"
 | |
|             for Entry in PcdFABIa32[:]:
 | |
|                 FixedAtBuildSection += "  " + Entry + "\n"
 | |
|             FixedAtBuildSection += "\n"
 | |
|         if (len(PcdFABX64) > 0):
 | |
|             FixedAtBuildSection += "[FixedPcd.X64]\n"
 | |
|             for Entry in PcdFABX64[:]:
 | |
|                 FixedAtBuildSection += "  " + Entry + "\n"
 | |
|             FixedAtBuildSection += "\n"
 | |
|         if (len(PcdFABIpf) > 0):
 | |
|             FixedAtBuildSection += "[FixedPcd.IPF]\n"
 | |
|             for Entry in PcdFABIpf[:]:
 | |
|                 FixedAtBuildSection += "  " + Entry + "\n"
 | |
|             FixedAtBuildSection += "\n"
 | |
|         if (len(PcdFABEbc) > 0):
 | |
|             FixedAtBuildSection += "[FixedPcd.EBC]\n"
 | |
|             for Entry in PcdFABEbc[:]:
 | |
|                 FixedAtBuildSection += "  " + Entry + "\n"
 | |
|             FixedAtBuildSection += "\n"
 | |
|   
 | |
|         Output.append(FixedAtBuildSection)
 | |
|         if (options.debug):
 | |
|             print FixedAtBuildSection
 | |
|   
 | |
|     if ((len(PcdPIM)+len(PcdPIMIa32)+len(PcdPIMX64)+len(PcdPIMIpf)+len(PcdPIMEbc)) > 0):
 | |
| ##        PatchableInModuleSection = "\n" + "#"*80 + "\n#\n"
 | |
| ##        PatchableInModuleSection += "# Pcd PATCHABLE_IN_MODULE - list of PCDs that this module is coded for.\n"
 | |
| ##        PatchableInModuleSection += "#\n" + "#"*80 + "\n\n"
 | |
|     
 | |
|         PatchableInModuleSection = "\n"
 | |
|         if (len(PcdPIM) > 0):
 | |
|             PatchableInModuleSection += "[PatchPcd.common]\n"
 | |
|             for Entry in PcdPIM[:]:
 | |
|                 PatchableInModuleSection += "  " + Entry + "\n"
 | |
|             PatchableInModuleSection += "\n"
 | |
|         if (len(PcdPIMIa32) > 0):
 | |
|             PatchableInModuleSection += "[PatchPcd.IA32]\n"
 | |
|             for Entry in PcdPIMIa32[:]:
 | |
|                 PatchableInModuleSection += "  " + Entry + "\n"
 | |
|             PatchableInModuleSection += "\n"
 | |
|         if (len(PcdPIMX64) > 0):
 | |
|             PatchableInModuleSection += "[PatchPcd.X64]\n"
 | |
|             for Entry in PcdPIMX64[:]:
 | |
|                 PatchableInModuleSection += "  " + Entry + "\n"
 | |
|             PatchableInModuleSection += "\n"
 | |
|         if (len(PcdPIMIpf) > 0):
 | |
|             PatchableInModuleSection += "[PatchPcd.IPF]\n"
 | |
|             for Entry in PcdPIMIpf[:]:
 | |
|                 PatchableInModuleSection += "  " + Entry + "\n"
 | |
|             PatchableInModuleSection += "\n"
 | |
|         if (len(PcdPIMEbc) > 0):
 | |
|             PatchableInModuleSection += "[PatchPcd.EBC]\n"
 | |
|             for Entry in PcdPIMEbc[:]:
 | |
|                 PatchableInModuleSection += "  " + Entry + "\n"
 | |
|             PatchableInModuleSection += "\n"
 | |
|   
 | |
|         Output.append(PatchableInModuleSection)
 | |
|         if (options.debug):
 | |
|             print PatchableInModuleSection
 | |
|   
 | |
|     if ((len(PcdDYE)+len(PcdDYEIa32)+len(PcdDYEX64)+len(PcdDYEIpf)+len(PcdDYEEbc)) > 0):
 | |
| ##        DynamicExSection = "\n" + "#"*80 + "\n#\n"
 | |
| ##        DynamicExSection += "# Pcd DYNAMIC_EX - list of PCDs that this module is coded for.\n"
 | |
| ##        DynamicExSection += "#\n" + "#"*80 + "\n\n"
 | |
|   
 | |
|         DynamicExSection = "\n"
 | |
|         if (len(PcdDYE) > 0):
 | |
|             DynamicExSection += "[PcdEx.common]\n"
 | |
|             for Entry in PcdDYE[:]:
 | |
|                 DynamicExSection += "  " + Entry + "\n"
 | |
|             DynamicExSection += "\n"
 | |
|         if (len(PcdDYEIa32) > 0):
 | |
|             DynamicExSection += "[PcdEx.IA32]\n"
 | |
|             for Entry in PcdDYEIa32[:]:
 | |
|                 DynamicExSection += "  " + Entry + "\n"
 | |
|             DynamicExSection += "\n"
 | |
|         if (len(PcdDYEX64) > 0):
 | |
|             DynamicExSection += "[PcdEx.X64]\n"
 | |
|             for Entry in PcdDYEX64[:]:
 | |
|                 DynamicExSection += "  " + Entry + "\n"
 | |
|             DynamicExSection += "\n"
 | |
|         if (len(PcdDYEIpf) > 0):
 | |
|             DynamicExSection += "[PcdEx.IPF]\n"
 | |
|             for Entry in PcdDYEIpf[:]:
 | |
|                 DynamicExSection += "  " + Entry + "\n"
 | |
|             DynamicExSection += "\n"
 | |
|         if (len(PcdDYEEbc) > 0):
 | |
|             DynamicExSection += "[PcdEx.EBC]\n"
 | |
|             for Entry in PcdDYEEbc[:]:
 | |
|                 DynamicExSection += "  " + Entry + "\n"
 | |
|             DynamicExSection += "\n"
 | |
|     
 | |
|         Output.append(DynamicExSection)
 | |
|         if (options.debug):
 | |
|             print DynamicExSection
 | |
|   
 | |
|     if ((len(PcdDY)+len(PcdDYIa32)+len(PcdDYX64)+len(PcdDYIpf)+len(PcdDYEbc)) > 0):
 | |
| ##        DynamicSection = "\n" + "#"*80 + "\n#\n"
 | |
| ##        DynamicSection += "# Pcd DYNAMIC - list of PCDs that this module is coded for.\n"
 | |
| ##        DynamicSection += "#\n" + "#"*80 + "\n\n"
 | |
|       
 | |
|         DynamicSection = "\n"
 | |
|         if (len(PcdDY) > 0):
 | |
|             DynamicSection += "[Pcd.common]\n"
 | |
|             for Entry in PcdDY[:]:
 | |
|                 DynamicSection += "  " + Entry + "\n"
 | |
|             DynamicSection += "\n"
 | |
|         if (len(PcdDYIa32) > 0):
 | |
|             DynamicSection += "[Pcd.IA32]\n"
 | |
|             for Entry in PcdDYIa32[:]:
 | |
|                 DynamicSection += "  " + Entry + "\n"
 | |
|             DynamicSection += "\n"
 | |
|         if (len(PcdDYX64) > 0):
 | |
|             DynamicSection += "[Pcd.X64]\n"
 | |
|             for Entry in PcdDYX64[:]:
 | |
|                 DynamicSection += "  " + Entry + "\n"
 | |
|             DynamicSection += "\n"
 | |
|         if (len(PcdDYIpf) > 0):
 | |
|             DynamicSection += "[Pcd.IPF]\n"
 | |
|             for Entry in PcdDYIpf[:]:
 | |
|                 DynamicSection += "  " + Entry + "\n"
 | |
|             DynamicSection += "\n"
 | |
|         if (len(PcdDYEbc) > 0):
 | |
|             DynamicSection += "[Pcd.EBC]\n"
 | |
|             for Entry in PcdDYEbc[:]:
 | |
|                 DynamicSection += "  " + Entry + "\n"
 | |
|             DynamicSection += "\n"
 | |
|     
 | |
|         Output.append(DynamicSection)
 | |
|         if (options.debug):
 | |
|             print DynamicSection
 | |
|   
 | |
|     if ((len(Depex) + len(DepexIa32) + len(DepexX64) + len(DepexIpf) + len(DepexEbc)) > 0):
 | |
|         """ We do this if and only if we have Package Dependencies """
 | |
| ##        Dpx = "\n" + "#"*80 + "\n#\n"
 | |
| ##        Dpx += "# Dependency Expression Section - list of Dependency expressions that are required for\n"
 | |
| ##        Dpx += "#                              this module.\n"
 | |
| ##        Dpx += "#\n" + "#"*80 + "\n\n"
 | |
|         Dpx = "\n"
 | |
|         if (len(Depex) > 0):
 | |
|             Dpx += "[Depex]\n"
 | |
|             for lc in Depex[:]:
 | |
|                 Dpx += "  " + lc + "\n"
 | |
|             Dpx += "\n"
 | |
| 
 | |
|         if (len(DepexIa32) > 0):
 | |
|             Dpx += "[Depex.IA32]\n"
 | |
|             for lc in DepexIa32[:]:
 | |
|                 Dpx += "  " + lc + "\n"
 | |
|             Dpx += "\n"
 | |
| 
 | |
|         if (len(DepexX64) > 0):
 | |
|             Dpx += "[Depex.X64]\n"
 | |
|             for lc in DepexX64[:]:
 | |
|                 Dpx += "  " + lc + "\n"
 | |
|             Dpx += "\n"
 | |
| 
 | |
|         if (len(DepexIpf) > 0):
 | |
|             Dpx += "[Depex.IPF]\n"
 | |
|             for lc in DepexIpf[:]:
 | |
|                 Dpx += "  " + lc + "\n"
 | |
|             Dpx += "\n"
 | |
| 
 | |
|         if (len(DepexEbc) > 0):
 | |
|             Dpx += "[Depex.EBC]\n"
 | |
|             for lc in DepexEbc[:]:
 | |
|                 Dpx += "  " + lc + "\n"
 | |
|             Dpx += "\n"
 | |
| 
 | |
|         Output.append(Dpx)
 | |
|         if (options.debug):
 | |
|             print Dpx
 | |
|             
 | |
|     if (len(MBOlines) > 0):
 | |
|         BuildSection = ""
 | |
| ##        BuildSection = "\n" + "#"*80 + "\n#\n"
 | |
| ##        BuildSection += "# Build Options - list of custom build options for this module.\n"
 | |
| ##        BuildSection += "#\n" + "#"*80 + "\n\n"
 | |
|         BuildSection += "\n[BuildOptions]\n"
 | |
|         for mbo in MBOlines:
 | |
|             tool, targs = mbo.split("=",2)
 | |
|             BuildSection += "  %-40s = %s\n" %  (tool.strip(), targs.strip())
 | |
| 
 | |
|         Output.append(BuildSection)
 | |
|         if (options.debug):
 | |
|             print BuildSection
 | |
|   
 | |
| 
 | |
|     if (len(UEList) > 0):
 | |
|         UserExtensionSection = ""
 | |
|         for UE in UEList[:]:
 | |
|             UserExtensionSection += "[UserExtensions." + UE[0] + '."' + UE[1] + '"]\n'
 | |
|             if (len(UE[2]) > 0):
 | |
|                 UserExtensionSection += '"' + UE[2] + '"\n'
 | |
|             else:
 | |
|                 UserExtensionSection += "\n"
 | |
|   
 | |
|         Output.append(UserExtensionSection)
 | |
|         if (options.debug):
 | |
|             print UserExtensionSection
 | |
| 
 | |
|     print "write file", outputFile
 | |
|     if (options.autowrite):
 | |
|         fo = open(outputFile, "w")
 | |
|         for Section in Output[:]:
 | |
|             fo.writelines(Section)
 | |
|             if (options.verbose > 1):
 | |
|                 print Section
 | |
|         fo.close()
 | |
|     elif (options.outfile):
 | |
|         fo = open(outputFile, "w")
 | |
|         for Section in Output[:]:
 | |
|             fo.writelines(Section)
 | |
|         fo.close()
 | |
|     else:
 | |
|         for Section in Output[:]:
 | |
|             print Section
 | |
| 
 | |
|   
 | |
| if __name__ == '__main__':
 | |
| 
 | |
|     global options
 | |
|     global args
 | |
|     options,args = myOptionParser()
 | |
|     
 | |
|     main()
 | |
|     sys.exit(0)
 | |
|   
 |