summaryrefslogtreecommitdiff
path: root/BaseTools/Source/Python/MigrationMsa2Inf/MigrationMsa2Inf.py
diff options
context:
space:
mode:
Diffstat (limited to 'BaseTools/Source/Python/MigrationMsa2Inf/MigrationMsa2Inf.py')
-rw-r--r--BaseTools/Source/Python/MigrationMsa2Inf/MigrationMsa2Inf.py2477
1 files changed, 2477 insertions, 0 deletions
diff --git a/BaseTools/Source/Python/MigrationMsa2Inf/MigrationMsa2Inf.py b/BaseTools/Source/Python/MigrationMsa2Inf/MigrationMsa2Inf.py
new file mode 100644
index 0000000000..01de21239c
--- /dev/null
+++ b/BaseTools/Source/Python/MigrationMsa2Inf/MigrationMsa2Inf.py
@@ -0,0 +1,2477 @@
+#!/usr/bin/env python
+#
+#
+# Copyright (c) 2007, Intel Corporation
+# All rights reserved. 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 *
+
+versionNumber = "0.9"
+__version__ = "%prog Version " + versionNumber
+__copyright__ = "Copyright (c) 2007, 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)
+