#!/usr/bin/env python # # # Copyright (c) 2007 - 2010, 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 - 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)