git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10123 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			443 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			443 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| ## @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
 |