## @file # Store a Module class object to an INF file. # # 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. # ## # Import Modules # from LoadMsa import LoadMsa from CommonDataClass.ModuleClass import * from Common.MigrationUtilities import * ## Get the produced library class. # # Return the item of Library Class based on Library . # # @param LibraryClasses A list of library classes the module produces. # # @retval LibraryClassItem A text format library class item. # def GetModuleLibraryClass(LibraryClasses): ProducedLibraryClasses = [] for LibraryClass in LibraryClasses: ProducedLibraryClass = LibraryClass.LibraryClass SupportedModueTypes = " ".join(LibraryClass.SupModuleList) if SupportedModueTypes != "": ProducedLibraryClass += "|" + SupportedModueTypes ProducedLibraryClasses.append(ProducedLibraryClass) return "|".join(ProducedLibraryClasses) ## Store Defines section. # # Write [Defines] section to the InfFile based on Module class object. # Different CPU architectures are specified in the subsection if possible. # # @param InfFile The output INF file to store the Defines section. # @param Module An input Module class object. # def StoreModuleDefinesSection(InfFile, Module): ModuleHeader = Module.Header DefinesTupleList = [] DefinesTupleList.append(("INF_VERSION", ModuleHeader.InfVersion)) if ModuleHeader.Name != "": DefinesTupleList.append(("BASE_NAME", ModuleHeader.Name)) if ModuleHeader.Guid != "": DefinesTupleList.append(("FILE_GUID", ModuleHeader.Guid)) if ModuleHeader.Version != "": DefinesTupleList.append(("VERSION_STRING", ModuleHeader.Version)) if ModuleHeader.ModuleType != "": DefinesTupleList.append(("MODULE_TYPE", ModuleHeader.ModuleType)) if ModuleHeader.UefiSpecificationVersion != "": DefinesTupleList.append(("UEFI_SPECIFICATION_VERSION", ModuleHeader.UefiSpecificationVersion)) if ModuleHeader.EdkReleaseVersion != "": DefinesTupleList.append(("EDK_RELEASE_VERSION", ModuleHeader.EdkReleaseVersion)) ProducedLibraryClass = GetModuleLibraryClass(ModuleHeader.LibraryClass) if ProducedLibraryClass != "": DefinesTupleList.append(("LIBRARY_CLASS", ProducedLibraryClass)) if ModuleHeader.MakefileName != "": DefinesTupleList.append(("MAKEFILE_NAME", ModuleHeader.MakeFileName)) if ModuleHeader.PcdIsDriver != "": DefinesTupleList.append(("PCD_DRIVER", "TRUE")) if len(Module.ExternImages) > 0: ModuleEntryPoint = Module.ExternImages[0].ModuleEntryPoint ModuleUnloadImage = Module.ExternImages[0].ModuleUnloadImage if ModuleEntryPoint != "": DefinesTupleList.append(("ENTRY_POINT", ModuleEntryPoint)) if ModuleUnloadImage != "": DefinesTupleList.append(("UNLOAD_IMAGE", ModuleUnloadImage)) if len(Module.ExternLibraries) > 0: Constructor = Module.ExternLibraries[0].Constructor Destructor = Module.ExternLibraries[0].Destructor if Constructor != "": DefinesTupleList.append(("CONSTRUCTOR", Constructor)) if Destructor != "": DefinesTupleList.append(("DESTRUCTOR", Destructor)) StoreDefinesSection(InfFile, DefinesTupleList) ## Return a Module Source Item. # # Read the input ModuleSourceFile class object and return one line of Source Item. # # @param ModuleSourceFile An input ModuleSourceFile class object. # # @retval SourceItem A Module Source Item. # def GetModuleSourceItem(ModuleSourceFile): Source = [] Source.append(ModuleSourceFile.SourceFile) Source.append(ModuleSourceFile.ToolChainFamily) Source.append(ModuleSourceFile.TagName) Source.append(ModuleSourceFile.ToolCode) Source.append(ModuleSourceFile.FeatureFlag) return "|".join(Source).rstrip("|") ## Store Sources section. # # Write [Sources] section to the InfFile based on Module class object. # Different CPU architectures are specified in the subsection if possible. # # @param InfFile The output INF file to store the Sources section. # @param Module An input Module class object. # def StoreModuleSourcesSection(InfFile, Module): Section = GetSection("Sources", GetModuleSourceItem, Module.Sources) StoreTextFile(InfFile, Section) ## Return a Module Binary Item. # # Read the input ModuleBinaryFile class object and return one line of Binary Item. # # @param ModuleBinaryFile An input ModuleBinaryFile class object. # # @retval BinaryItem A Module Binary Item. # def GetModuleBinaryItem(ModuleBinaryFile): Binary = [] Binary.append(ModuleBinaryFile.FileType) Binary.append(ModuleBinaryFile.BinaryFile) Binary.append(ModuleBinaryFile.Target) Binary.append(ModuleBinaryFile.FeatureFlag) return "|".join(Binary).rstrip("|") ## Store Binaries section. # # Write [Binaries] section to the InfFile based on Module class object. # Different CPU architectures are specified in the subsection if possible. # # @param InfFile The output INF file to store the Binaries section. # @param Module An input Module class object. # def StoreModuleBinariesSection(InfFile, Module): Section = GetSection("Binaries", GetModuleBinaryItem, Module.Binaries) StoreTextFile(InfFile, Section) ## Return a Module Library Class Item. # # Read the input LibraryClass class object and return one line of Library Class Item. # # @param LibraryClass An input LibraryClass class object. # # @retval LibraryClassItem A Module Library Class Item. # def GetModuleLibraryClassItem(LibraryClass): if "ALWAYS_PRODUCED" in LibraryClass.Usage: return "" LibraryClassList = [] LibraryClassList.append(LibraryClass.LibraryClass) LibraryClassList.append(LibraryClass.RecommendedInstance) LibraryClassList.append(LibraryClass.FeatureFlag) return "|".join(LibraryClassList).rstrip("|") ## Store Library Classes section. # # Write [LibraryClasses] section to the InfFile based on Module class object. # Different CPU architectures are specified in the subsection if possible. # # @param InfFile The output INF file to store the Library Classes section. # @param Module An input Module class object. # def StoreModuleLibraryClassesSection(InfFile, Module): Section = GetSection("LibraryClasses", GetModuleLibraryClassItem, Module.LibraryClasses) StoreTextFile(InfFile, Section) ## Return a Module Package Item. # # Read the input PackageDependency class object and return one line of Package Item. # # @param PackageDependency An input PackageDependency class object. # # @retval PackageItem A Module Package Item. # def GetModulePackageItem(PackageDependency): return PackageDependency.FilePath ## Store Packages section. # # Write [Packages] section to the InfFile based on Module class object. # Different CPU architectures are specified in the subsection if possible. # # @param InfFile The output INF file to store the Packages section. # @param Module An input Module class object. # def StoreModulePackagesSection(InfFile, Module): Section = GetSection("Packages", GetModulePackageItem, Module.PackageDependencies) StoreTextFile(InfFile, Section) ## Return a Module Guid C Name Item. # # Read the input Guid class object and return one line of Guid C Name Item. # # @param Guid An input Guid class object. # # @retval GuidCNameItem A Module Guid C Name Item. # def GetModuleGuidCNameItem(Guid): try: return Guid.GuidCName except: return Guid.CName ## Store Protocols section. # # Write [Protocols] section to the InfFile based on Module class object. # Different CPU architectures are specified in the subsection if possible. # # @param InfFile The output INF file to store the Protocols section. # @param Module An input Module class object. # def StoreModuleProtocolsSection(InfFile, Module): Section = GetSection("Protocols", GetModuleGuidCNameItem, Module.Protocols) StoreTextFile(InfFile, Section) ## Store Ppis section. # # Write [Ppis] section to the InfFile based on Module class object. # Different CPU architectures are specified in the subsection if possible. # # @param InfFile The output INF file to store the Ppis section. # @param Module An input Module class object. # def StoreModulePpisSection(InfFile, Module): Section = GetSection("Ppis", GetModuleGuidCNameItem, Module.Ppis) StoreTextFile(InfFile, Section) ## Store Guids section. # # Write [Guids] section to the InfFile based on Module class object. # Different CPU architectures are specified in the subsection if possible. # # @param InfFile The output INF file to store the Guids section. # @param Module An input Module class object. # def StoreModuleGuidsSection(InfFile, Module): Guids = [] Guids += Module.Guids Guids += Module.Events Guids += Module.Hobs Guids += Module.Variables Guids += Module.SystemTables Guids += Module.DataHubs Guids += Module.HiiPackages Section = GetSection("Guids", GetModuleGuidCNameItem, Guids) StoreTextFile(InfFile, Section) ## Return a Module Pcd Item. # # Read the input Pcd class object and return one line of Pcd Item. # # @param Pcd An input Pcd class object. # # @retval PcdItem A Module Pcd Item. # def GetModulePcdItem(Pcd): PcdItem = "%s.%s" % (Pcd.TokenSpaceGuidCName, Pcd.CName) if Pcd.DefaultValue != "": PcdItem = "%s|%s" % (PcdItem, Pcd.DefaultValue) return PcdItem ## DEC Pcd Section Name dictionary indexed by PCD Item Type. mInfPcdSectionNameDict = { "FEATURE_FLAG" : "FeaturePcd", "FIXED_AT_BUILD" : "FixedPcd", "PATCHABLE_IN_MODULE" : "PatchPcd", "DYNAMIC" : "Pcd", "DYNAMIC_EX" : "PcdEx" } ## Store Pcds section. # # Write [(PcdType)] section to the InfFile based on Module class object. # Different CPU architectures are specified in the subsection if possible. # # @param InfFile The output INF file to store the Pcds section. # @param Module An input Module class object. # def StoreModulePcdsSection(InfFile, Module): PcdsDict = {} for Pcd in Module.PcdCodes: PcdSectionName = mInfPcdSectionNameDict.get(Pcd.ItemType) if PcdSectionName: PcdsDict.setdefault(PcdSectionName, []).append(Pcd) else: EdkLogger.info("Unknown Pcd Item Type: %s" % Pcd.ItemType) Section = "" for PcdSectionName in PcdsDict: Pcds = PcdsDict[PcdSectionName] Section += GetSection(PcdSectionName, GetModulePcdItem, Pcds) Section += "\n" StoreTextFile(InfFile, Section) ## Return a Module Depex Item. # # Read the input Depex class object and return one line of Depex Item. # # @param Depex An input Depex class object. # # @retval DepexItem A Module Depex Item. # def GetModuleDepexItem(Depex): return Depex.Depex ## Store Depex section. # # Write [Depex] section to the InfFile based on Module class object. # Different CPU architectures are specified in the subsection if possible. # # @param InfFile The output INF file to store the Depex section. # @param Module An input Module class object. # def StoreModuleDepexSection(InfFile, Module): Section = GetSection("Depex", GetModuleDepexItem, Module.Depex) StoreTextFile(InfFile, Section) ## Return a Module Build Option Item. # # Read the input BuildOption class object and return one line of Build Option Item. # # @param BuildOption An input BuildOption class object. # # @retval BuildOptionItem A Module Build Option Item. # def GetModuleBuildOptionItem(BuildOption): BuildTarget = BuildOption.BuildTarget if BuildTarget == "": BuildTarget = "*" TagName = BuildOption.TagName if TagName == "": TagName = "*" ToolCode = BuildOption.ToolCode if ToolCode == "": ToolCode = "*" Item = "_".join((BuildTarget, TagName, "*", ToolCode, "Flag")) ToolChainFamily = BuildOption.ToolChainFamily if ToolChainFamily != "": Item = "%s:%s" % (ToolChainFamily, Item) return "%-30s = %s" % (Item, BuildOption.Option) ## Store Build Options section. # # Write [BuildOptions] section to the InfFile based on Module class object. # Different CPU architectures are specified in the subsection if possible. # # @param InfFile The output INF file to store the Build Options section. # @param Module An input Module class object. # def StoreModuleBuildOptionsSection(InfFile, Module): Section = GetSection("BuildOption", GetModuleBuildOptionItem, Module.BuildOptions) StoreTextFile(InfFile, Section) ## Store User Extensions section. # # Write [UserExtensions] section to the InfFile based on Module class object. # # @param InfFile The output INF file to store the User Extensions section. # @param Module An input Module class object. # def StoreModuleUserExtensionsSection(InfFile, Module): Section = "".join(map(GetUserExtensions, Module.UserExtensions)) StoreTextFile(InfFile, Section) ## Store a Module class object to a new INF file. # # Read an input Module class object and save the contents to a new INF file. # # @param INFFileName The output INF file. # @param Module An input Package class object. # def StoreInf(InfFileName, Module): InfFile = open(InfFileName, "w+") EdkLogger.info("Save file to %s" % InfFileName) StoreHeader(InfFile, Module.Header) StoreModuleDefinesSection(InfFile, Module) StoreModuleSourcesSection(InfFile, Module) StoreModuleBinariesSection(InfFile, Module) StoreModulePackagesSection(InfFile, Module) StoreModuleLibraryClassesSection(InfFile, Module) StoreModuleProtocolsSection(InfFile, Module) StoreModulePpisSection(InfFile, Module) StoreModuleGuidsSection(InfFile, Module) StoreModulePcdsSection(InfFile, Module) StoreModuleDepexSection(InfFile, Module) StoreModuleBuildOptionsSection(InfFile, Module) StoreModuleUserExtensionsSection(InfFile, Module) InfFile.close() if __name__ == '__main__': pass