git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10502 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			766 lines
		
	
	
		
			33 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			766 lines
		
	
	
		
			33 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| ## @file
 | |
| # Store a Platform class object to an INF file.
 | |
| #
 | |
| # Copyright (c) 2007 - 2009, Intel Corporation. All rights reserved.<BR>
 | |
| # This program and the accompanying materials
 | |
| # are licensed and made available under the terms and conditions of the BSD License
 | |
| # which accompanies this distribution.  The full text of the license may be found at
 | |
| # http://opensource.org/licenses/bsd-license.php
 | |
| #
 | |
| # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
| # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| #
 | |
| 
 | |
| ##
 | |
| # Import Modules
 | |
| #
 | |
| from LoadFpd import LoadFpd
 | |
| from CommonDataClass.PlatformClass import *
 | |
| from CommonDataClass.FdfClass import *
 | |
| from Common.MigrationUtilities import *
 | |
| from Common.ToolDefClassObject import *
 | |
| from Common.TargetTxtClassObject import *
 | |
| 
 | |
| ## Store Defines section
 | |
| #
 | |
| # Write [Defines] section to the DscFile based on Platform class object.
 | |
| # Different CPU architectures are specified in the subsection if possible.
 | |
| #
 | |
| # @param  DscFile                The output DSC file to store the Defines section
 | |
| # @param  Platform               An input Platform class object
 | |
| #
 | |
| def StorePlatformDefinesSection(DscFile, Platform):
 | |
|     PlatformHeader = Platform.Header
 | |
|     
 | |
|     DefinesTupleList = []
 | |
|     
 | |
|     if PlatformHeader.Name != "":
 | |
|         DefinesTupleList.append(("PLATFORM_NAME", PlatformHeader.Name))
 | |
| 
 | |
|     if PlatformHeader.Guid != "":
 | |
|         DefinesTupleList.append(("PLATFORM_GUID", PlatformHeader.Guid))
 | |
| 
 | |
|     if PlatformHeader.Version != "":
 | |
|         DefinesTupleList.append(("PLATFORM_VERSION", PlatformHeader.Version))
 | |
|     for key in PlatformHeader.Specification.keys():
 | |
|         SpecificationValue = PlatformHeader.Specification.get(key)
 | |
|         DefinesTupleList.append(("DSC_ SPECIFICATION", SpecificationValue))
 | |
|     
 | |
|     if PlatformHeader.OutputDirectory != "":
 | |
|         DefinesTupleList.append(("OUTPUT_DIRECTORY", PlatformHeader.OutputDirectory))
 | |
| 
 | |
|     if PlatformHeader.SupArchList != "":
 | |
|         String = "|".join(PlatformHeader.SupArchList)
 | |
|         DefinesTupleList.append(("SUPPORTED_ARCHITECTURES", String))
 | |
| 
 | |
|     if PlatformHeader.BuildTargets != "":
 | |
|         String = "|".join(PlatformHeader.BuildTargets)
 | |
|         DefinesTupleList.append(("BUILD_TARGETS", String))
 | |
| 
 | |
|     if PlatformHeader.SkuIdName != "":
 | |
|         #DefinesTupleList.append(("SKUID_IDENTIFIER", PlatformHeader.SkuIdName))
 | |
|         String = "|".join(PlatformHeader.SkuIdName)
 | |
|         if String != "":
 | |
|             DefinesTupleList.append(("SKUID_IDENTIFIER", String))
 | |
|         
 | |
| 	String = Platform.FlashDefinitionFile.FilePath
 | |
| 	if String != "":
 | |
| 	    DefinesTupleList.append(("FLASH_DEFINITION", String))
 | |
| 
 | |
|     List = []
 | |
|     List.append("################################################################################")
 | |
|     List.append("#")
 | |
|     List.append("# Defines Section - statements that will be processed to create a Makefile.")
 | |
|     List.append("#")
 | |
|     List.append("################################################################################")
 | |
|     Section = "\n".join(List)
 | |
|     Section += "\n"
 | |
|     StoreTextFile(DscFile, Section)
 | |
|     
 | |
|     StoreDefinesSection(DscFile, DefinesTupleList)
 | |
| 
 | |
| ## Store SkuIds section
 | |
| #
 | |
| # Write [SkuIds] section to the DscFile based on Platform class object.
 | |
| # Different CPU architectures are specified in the subsection if possible.
 | |
| #
 | |
| # @param  DscFile                The output DSC file to store the Library Classes section
 | |
| # @param  Platform               An input Platform class object
 | |
| #
 | |
| def StorePlatformSkuIdsSection(DscFile, Platform):
 | |
|     List = []
 | |
|     List.append("################################################################################")
 | |
|     List.append("#")
 | |
|     List.append("# SKU Identification section - list of all SKU IDs supported by this Platform.")
 | |
|     List.append("#")
 | |
|     List.append("################################################################################")
 | |
|     Section = "\n".join(List)
 | |
|     Section += "\n"
 | |
|     
 | |
|     Section += "[SkuIds]" + '\n'
 | |
|     
 | |
|     List = Platform.SkuInfos.SkuInfoList
 | |
|     for Item in List:
 | |
|         Section = Section + "%s" % Item[0] + '|' + "%s" % Item[1] + '\n'
 | |
|     Section = Section + '\n'
 | |
|     
 | |
|     StoreTextFile(DscFile, Section)
 | |
| 
 | |
| ## Store Build Options section
 | |
| #
 | |
| # Write [BuildOptions] section to the DscFile based on Platform class object.
 | |
| # Different CPU architectures are specified in the subsection if possible.
 | |
| #
 | |
| # @param  DscFile                The output DSC file to store the Build Options section
 | |
| # @param  Platform               An input Platform class object
 | |
| #
 | |
| def StorePlatformBuildOptionsSection(DscFile, Platform):
 | |
|     # which is from tools_def.txt
 | |
|     StandardBuildTargets = ["DEBUG", "RELEASE"]
 | |
|     SupportedArches = ["COMMON", "IA32", "X64", "IPF", "EBC", "ARM"]
 | |
|     Target = TargetTxtClassObject()
 | |
|     WorkSpace = os.getenv('WORKSPACE')
 | |
|     Target.LoadTargetTxtFile(WorkSpace + '\\Conf\\target.txt')
 | |
|     ToolDef = ToolDefClassObject()
 | |
|     ToolDef.LoadToolDefFile(WorkSpace + '\\' + Target.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF])
 | |
|     # Now we have got ToolDef object
 | |
|     #ToolDef.ToolsDefTxtDictionary
 | |
|     Dict = ToolDef.ToolsDefTxtDatabase
 | |
| 
 | |
|     Dict1 = ToolDef.ToolsDefTxtDictionary # we care the info in this Dict
 | |
|     #
 | |
|     # We only support *(DEBUG/RELEASE) and *(All Arch: IA32, X64, IPF and EBC) for now
 | |
|     #
 | |
|     SectionWINDDK = ''
 | |
|     SectionVS2003 = ''
 | |
|     SectionVS2005EXP = ''
 | |
|     SectionVS2005STD = ''
 | |
|     SectionVS2005PRO = ''
 | |
|     SectionVS2005TEAMSUITE = ''
 | |
|     SectionUNIXGCC = ''
 | |
|     SectionCYGWINGCC = ''
 | |
|     SectionELFGCC = ''
 | |
|     SectionICC = ''
 | |
|     SectionMYTOOLS = ''
 | |
|     for key in Dict1.keys():
 | |
|         if key.find("_CC_FLAGS") != -1:
 | |
|             if key.find('WINDDK3790x1830') != -1:
 | |
|                 SectionWINDDK = "  =  " + Dict1.get(key) + "\n"
 | |
|             elif key.find('VS2003') != -1:
 | |
|                 SectionVS2003 = "  =  " + Dict1.get(key)+ "\n"
 | |
|             elif key.find('VS2005EXP') != -1:
 | |
|                 SectionVS2005EXP = "  =  " + Dict1.get(key) + "\n"
 | |
|             elif key.find('VS2005STD') != -1:
 | |
|                 SectionVS2005STD = "  =  " + Dict1.get(key) + "\n"
 | |
|             elif key.find('VS2005PRO') != -1:
 | |
|                 SectionVS2005PRO = "  =  " + Dict1.get(key) + "\n"
 | |
|             elif key.find('VS2005TEAMSUITE') != -1:
 | |
|                 SectionVS2005TEAMSUITE = "  =  " + Dict1.get(key) + "\n"
 | |
|             elif key.find('UNIXGCC') != -1:
 | |
|                 SectionUNIXGCC = "  =  " + Dict1.get(key) + "\n"
 | |
|             elif key.find('CYGWINGCC') != -1:
 | |
|                 SectionCYGWINGCC = "  =  " + Dict1.get(key) + "\n"
 | |
|             elif key.find('ELFGCC') != -1:
 | |
|                 SectionELFGCC = "  =  " + Dict1.get(key) + "\n"
 | |
|             elif key.find('ICC') != -1:
 | |
|                 SectionICC = "  =  " + Dict1.get(key) + "\n"
 | |
|             elif key.find('MYTOOLS') != -1:
 | |
|                 SectionMYTOOLS = "  =  " + Dict1.get(key) + "\n"
 | |
|             else:
 | |
|                 print "Error!"
 | |
| 
 | |
|     #
 | |
|     # First need to check which arch
 | |
|     #
 | |
|     Archs = Platform.Header.SupArchList
 | |
|     BuildTargets = Platform.Header.BuildTargets
 | |
|     #if BuildTargets == StandardBuildTargets:
 | |
|         #print "Debug and Release both support" # skip debug/release string search
 | |
|     #else:
 | |
|         #print "need to search debug/release string"
 | |
| 
 | |
|     if len(Archs) == 4:
 | |
|         Arch = "*"
 | |
|         SectionName = "[BuildOptions.Common]\n"
 | |
|     else:
 | |
|         for Arch in Archs:
 | |
|             if Arch == 'IA32':
 | |
|                 SectionName = "[BuildOptions.IA32]\n"
 | |
|             elif Arch == 'X64':
 | |
|                 SectionName = "[BuildOptions.X64]\n"
 | |
|             elif Arch == 'IPF':
 | |
|                 SectionName = "[BuildOptions.IPF]\n"
 | |
|             elif Arch == 'EBC':
 | |
|                 SectionName = "[BuildOptions.EBC]\n"
 | |
|             else:
 | |
|                 print 'Error!'
 | |
|     Section = ""
 | |
|     if SectionWINDDK != "":
 | |
|         SectionWINDDK = "*_WINDDK3790x1830_" + Arch + "_CC_FLAGS" + SectionWINDDK
 | |
|         Section += SectionWINDDK
 | |
|     if SectionVS2003 != "":
 | |
|         SectionVS2003 = "*_VS2003_" + Arch + "_CC_FLAGS" + SectionVS2003
 | |
|         Section += SectionVS2003
 | |
|     if SectionVS2005EXP != "":
 | |
|         SectionVS2005EXP = "*_VS2005EXP_" + Arch + "_CC_FLAGS" + SectionVS2005EXP
 | |
|         Section += SectionVS2005EXP
 | |
|     if SectionVS2005STD != "":
 | |
|         SectionVS2005STD = "*_VS2005STD_" + Arch + "_CC_FLAGS" + SectionVS2005STD
 | |
|         Section += SectionVS2005STD
 | |
|     if SectionVS2005PRO != "":
 | |
|         SectionVS2005PRO = "*_VS2005PRO_" + Arch + "_CC_FLAGS" + SectionVS2005PRO
 | |
|         Section += SectionVS2005PRO
 | |
|     if SectionVS2005TEAMSUITE != "":
 | |
|         SectionVS2005TEAMSUITE = "*_VS2005TEAMSUITE_" + Arch + "_CC_FLAGS" + SectionVS2005TEAMSUITE
 | |
|         Section += SectionVS2005TEAMSUITE
 | |
|     if SectionUNIXGCC != "":
 | |
|         SectionUNIXGCC = "*_UNIXGCC_" + Arch + "_CC_FLAGS" + SectionUNIXGCC
 | |
|         Section += SectionUNIXGCC
 | |
|     if SectionCYGWINGCC != "":
 | |
|         SectionCYGWINGCC = "*_CYGWINGCC_" + Arch + "_CC_FLAGS" + SectionCYGWINGCC
 | |
|         Section += SectionCYGWINGCC
 | |
|     if SectionELFGCC != "":
 | |
|         SectionELFGCC = "*_ELFGCC_" + Arch + "_CC_FLAGS" + SectionELFGCC
 | |
|         Section += SectionELFGCC
 | |
|     if SectionICC != "":
 | |
|         SectionICC = "*_ICC_" + Arch + "_CC_FLAGS" + SectionICC
 | |
|         Section += SectionICC
 | |
|     if SectionMYTOOLS != "":
 | |
|         SectionMYTOOLS = "*_MYTOOLS_" + Arch + "_CC_FLAGS" + SectionMYTOOLS
 | |
|         Section += SectionMYTOOLS
 | |
| 
 | |
|     List = []
 | |
|     List.append("################################################################################")
 | |
|     List.append("#")
 | |
|     List.append("# Build Options section - list of all Build Options supported by this Platform.")
 | |
|     List.append("#")
 | |
|     List.append("################################################################################")
 | |
|     SectionHeader = "\n".join(List)
 | |
|     SectionHeader += "\n"
 | |
|     
 | |
|     Section = SectionHeader + SectionName + Section
 | |
|     Section += "\n"
 | |
|     StoreTextFile(DscFile, Section)
 | |
| 
 | |
| ## Store Libraries section
 | |
| #
 | |
| # Write [Libraries] section to the DscFile based on Platform class object.
 | |
| # Different CPU architectures are specified in the subsection if possible.
 | |
| #
 | |
| # @param  DscFile                The output DSC file to store the Library Classes section
 | |
| # @param  Platform               An input Platform class object
 | |
| #
 | |
| def StorePlatformLibrariesSection(DscFile,Platform):
 | |
|     List = []
 | |
|     List.append("################################################################################")
 | |
|     List.append("#")
 | |
|     List.append("# Libraries section - list of all Libraries needed by this Platform.")
 | |
|     List.append("#")
 | |
|     List.append("################################################################################")
 | |
|     SectionHeader = "\n".join(List)
 | |
|     SectionHeader += "\n"
 | |
|     
 | |
|     Section = SectionHeader + '[Libraries]\n\n'
 | |
|     StoreTextFile(DscFile, Section)
 | |
| 
 | |
| ## Return a Platform 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 GetPlatformLibraryClassItem(LibraryClass):
 | |
|     LibraryClassList = []
 | |
|     LibraryClassList.append(LibraryClass.Name)
 | |
|     LibraryClassList.append(LibraryClass.FilePath)
 | |
| 
 | |
|     return "|$(WORKSPACE)/".join(LibraryClassList).rstrip("|")
 | |
| 
 | |
| ## Add item to a LibraryClass section
 | |
| #
 | |
| # Add an Item with specific Module Type to section dictionary.
 | |
| # The possible duplication is ensured to be removed.
 | |
| #
 | |
| # @param  Section            Section dictionary indexed by CPU architecture
 | |
| # @param  SupModuleList      LibraryClass SupModuleList: BASE, SEC, PEI_CORE, PEIM, etc
 | |
| # @param  Item               The Item to be added to section dictionary
 | |
| #
 | |
| def AddToLibraryClassSection(Section, SupModuleList, Item):
 | |
|     for ModuleType in SupModuleList:
 | |
|         SectionModule = Section.get(ModuleType, [])
 | |
|         if Item not in SectionModule:
 | |
|             SectionModule.append(Item)
 | |
|             Section[ModuleType] = SectionModule
 | |
| 
 | |
| ## Get Library Classes section contents
 | |
| #
 | |
| # Return the content of section named SectionName.
 | |
| # the contents is based on Methods and ObjectLists.
 | |
| #
 | |
| # @param  SectionName        The name of the section
 | |
| # @param  Method             A function returning a string item of an object
 | |
| # @param  ObjectList         The list of object
 | |
| #
 | |
| # @retval Section            The string content of a section
 | |
| #
 | |
| def GetLibraryClassesSection(SectionName, Method, ObjectList):
 | |
|     SupportedArches = ["COMMON", "IA32", "X64", "IPF", "EBC"]
 | |
|     ModuleTypes = ["BASE","SEC","PEI_CORE","PEIM","DXE_CORE","DXE_DRIVER","DXE_SMM_DRIVER","DXE_SAL_DRIVER","DXE_RUNTIME_DRIVER","UEFI_DRIVER","UEFI_APPLICATION"]
 | |
|     SectionCommonDict = {}
 | |
|     SectionIA32Dict = {}
 | |
|     SectionX64Dict = {}
 | |
|     SectionIPFDict = {}
 | |
|     SectionEBCDict = {}
 | |
|     #ObjectList = list(set(ObjectList)) # delete the same element in the list
 | |
|     for Object in ObjectList:
 | |
|         if Object == None:
 | |
|             continue
 | |
|         Item = Method(Object)
 | |
|         if Item == "":
 | |
|             continue
 | |
|         Item = "  %s" % Item
 | |
|         Arches = Object.SupArchList
 | |
|         if len(Arches) == 4:
 | |
|             ModuleType = Object.ModuleType
 | |
|             # [LibraryClasses.Common.ModuleType]
 | |
|             if ModuleType == "BASE":
 | |
|                 SupModuleList = ["BASE"]
 | |
|                 AddToLibraryClassSection(SectionCommonDict, SupModuleList, Item)
 | |
|             else:
 | |
|                 #
 | |
|                 SupModuleList = Object.SupModuleList
 | |
|                 #AddToSection(SectionDict, "|".join(SupModuleList), Item)
 | |
|                 AddToLibraryClassSection(SectionCommonDict, SupModuleList, Item)
 | |
|         else:
 | |
|             # Arch
 | |
|             for Arch in SupportedArches:
 | |
|                 if Arch.upper() in Arches:
 | |
|                     if Arch == "IA32":
 | |
|                         # [LibraryClasses.IA32.ModuleType]
 | |
|                         ModuleType = Object.ModuleType
 | |
|                         if ModuleType == "BASE":
 | |
|                             SupModuleList = ["BASE"]
 | |
|                             AddToLibraryClassSection(SectionIA32Dict, SupModuleList, Item)
 | |
|                         else:
 | |
|                             SupModuleList = Object.SupModuleList
 | |
|                             AddToLibraryClassSection(SectionIA32Dict, SupModuleList, Item)
 | |
|                     elif Arch == "X64":
 | |
|                         # [LibraryClasses.X64.ModuleType]
 | |
|                         ModuleType = Object.ModuleType
 | |
|                         if ModuleType == "BASE":
 | |
|                             SupModuleList = ["BASE"]
 | |
|                             AddToLibraryClassSection(SectionX64Dict, SupModuleList, Item)
 | |
|                         else:
 | |
|                             SupModuleList = Object.SupModuleList
 | |
|                             AddToLibraryClassSection(SectionX64Dict, SupModuleList, Item)
 | |
|                     elif Arch == "IPF":
 | |
|                         # [LibraryClasses.IPF.ModuleType]
 | |
|                         ModuleType = Object.ModuleType
 | |
|                         if ModuleType == "BASE":
 | |
|                             SupModuleList = ["BASE"]
 | |
|                             AddToLibraryClassSection(SectionIPFDict, SupModuleList, Item)
 | |
|                         else:
 | |
|                             SupModuleList = Object.SupModuleList
 | |
|                             AddToLibraryClassSection(SectionIPFDict, SupModuleList, Item)
 | |
|                     elif Arch == "EBC":
 | |
|                         # [LibraryClasses.EBC.ModuleType]
 | |
|                         ModuleType = Object.ModuleType
 | |
|                         if ModuleType == "BASE":
 | |
|                             SupModuleList = ["BASE"]
 | |
|                             AddToLibraryClassSection(SectionEBCDict, SupModuleList, Item)
 | |
|                         else:
 | |
|                             SupModuleList = Object.SupModuleList
 | |
|                             AddToLibraryClassSection(SectionEBCDict, SupModuleList, Item)
 | |
| 
 | |
|     Section = ""
 | |
|     for ModuleType in ModuleTypes:
 | |
|         SectionCommonModule = "\n".join(SectionCommonDict.get(ModuleType, []))
 | |
|         if SectionCommonModule != "":
 | |
|             Section += "[%s.Common.%s]\n%s\n" % (SectionName, ModuleType, SectionCommonModule)
 | |
|             Section += "\n"
 | |
|     for ModuleType in ModuleTypes:
 | |
|         ListIA32 = SectionIA32Dict.get(ModuleType, [])
 | |
|         if ListIA32 != []:
 | |
|             SectionIA32Module = "\n".join(SectionIA32Dict.get(ModuleType, []))
 | |
|             if SectionIA32Module != "":
 | |
|                 Section += "[%s.IA32.%s]\n%s\n" % (SectionName, ModuleType, SectionIA32Module)
 | |
|                 Section += "\n"
 | |
|         ListX64 = SectionX64Dict.get(ModuleType, [])
 | |
|         if ListX64 != []:
 | |
|             SectionX64Module = "\n".join(SectionX64Dict.get(ModuleType, []))
 | |
|             if SectionX64Module != "":
 | |
|                 Section += "[%s.X64.%s]\n%s\n" % (SectionName, ModuleType, SectionX64Module)
 | |
|                 Section += "\n"
 | |
|         ListIPF = SectionIPFDict.get(ModuleType, [])
 | |
|         if ListIPF != []:
 | |
|             SectionIPFModule = "\n".join(SectionIPFDict.get(ModuleType, []))
 | |
|             if SectionIPFModule != "":
 | |
|                 Section += "[%s.IPF.%s]\n%s\n" % (SectionName, ModuleType, SectionIPFModule)
 | |
|                 Section += "\n"
 | |
|         ListEBC = SectionEBCDict.get(ModuleType, [])
 | |
|         if ListEBC != []:
 | |
|             SectionEBCModule = "\n".join(SectionEBCDict.get(ModuleType, []))
 | |
|             if SectionEBCModule != "":
 | |
|                 Section += "[%s.EBC.%s]\n%s\n" % (SectionName, ModuleType, SectionEBCModule)
 | |
|                 Section += "\n"
 | |
| 
 | |
|     if Section != "":
 | |
|         Section += "\n"
 | |
|     return Section
 | |
| 
 | |
| ## Store Library Classes section
 | |
| #
 | |
| # Write [LibraryClasses] section to the DscFile based on Platform class object.
 | |
| # Different CPU architectures are specified in the subsection if possible.
 | |
| #
 | |
| # @param  DscFile                The output DSC file to store the Library Classes section
 | |
| # @param  Platform               An input Platform class object
 | |
| #
 | |
| def StorePlatformLibraryClassesSection(DscFile, Platform):
 | |
|     Section = GetLibraryClassesSection("LibraryClasses", GetPlatformLibraryClassItem, Platform.LibraryClasses.LibraryList)
 | |
|     List = []
 | |
|     List.append("################################################################################")
 | |
|     List.append("#")
 | |
|     List.append("# Library Class section - list of all Library Classes needed by this Platform.")
 | |
|     List.append("#")
 | |
|     List.append("################################################################################")
 | |
|     SectionHeader = "\n".join(List)
 | |
|     SectionHeader += "\n"
 | |
|     Section = SectionHeader + Section
 | |
|     StoreTextFile(DscFile, Section)
 | |
| 
 | |
| ## Store Pcd section
 | |
| #
 | |
| # Write [Pcd] section to the DscFile based on Platform class object.
 | |
| # Different CPU architectures are specified in the subsection if possible.
 | |
| #
 | |
| # @param  DscFile                The output DSC file to store the Build Options section
 | |
| # @param  Platform               An input Platform class object
 | |
| #
 | |
| def StorePlatformPcdSection(DscFile, Platform):
 | |
|     # {PcdsFixedAtBuild:String1, PcdsFixedAtBuild:String2, PcdsPatchableInModule:String3}
 | |
|     SectionDict = {}
 | |
|     #
 | |
|     # [PcdsFixedAtBuild], [PcdsPatchableInModule] and [PcdsFeatureFlag] are from platform.modules
 | |
|     # [PcdsDynamic] is from platform.DynamicPcdBuildDefinitions
 | |
|     #
 | |
|     Modules = Platform.Modules.ModuleList # it's a list of modules
 | |
|     for Module in Modules:
 | |
|         PcdBuildDefinitions = Module.PcdBuildDefinitions # it's a list of PcdData
 | |
|         for PcdData in PcdBuildDefinitions:
 | |
|             if PcdData.ItemType == "FEATURE_FLAG":
 | |
|                 List = []
 | |
|                 List.append(PcdData.TokenSpaceGuidCName + "." + PcdData.C_NAME)
 | |
|                 List.append(PcdData.Value)
 | |
|                 String = "|".join(List)
 | |
|                 ItemType = PcdData.ItemType
 | |
|                 SectionPcdsFeatureFlag = SectionDict.get(ItemType, [])
 | |
|                 if String not in SectionPcdsFeatureFlag:
 | |
|                     SectionPcdsFeatureFlag.append(String)
 | |
|                     SectionDict[ItemType] = SectionPcdsFeatureFlag
 | |
|             else:
 | |
|                 List = []
 | |
|                 List.append(PcdData.TokenSpaceGuidCName + "." + PcdData.C_NAME)
 | |
|                 List.append(PcdData.Value)
 | |
|                 List.append(PcdData.Token)
 | |
|                 List.append(PcdData.DatumType)
 | |
|                 List.append(PcdData.MaxDatumSize)
 | |
|                 String = "|".join(List)
 | |
|                 ItemType = PcdData.ItemType
 | |
|                 if PcdData.ItemType == "FIXED_AT_BUILD":
 | |
|                     SectionPcdsFixedAtBuild = SectionDict.get(ItemType, [])
 | |
|                     if String not in SectionPcdsFixedAtBuild:
 | |
|                         SectionPcdsFixedAtBuild.append(String)
 | |
|                         SectionDict[ItemType] = SectionPcdsFixedAtBuild
 | |
|                 #elif PcdData.ItemType == "FEATURE_FLAG":
 | |
|                     #SectionPcdsFeatureFlag = SectionDict.get(ItemType, [])
 | |
|                     #if String not in SectionPcdsFeatureFlag:
 | |
|                         #SectionPcdsFeatureFlag.append(String)
 | |
|                         #SectionDict[ItemType] = SectionPcdsFeatureFlag
 | |
|                 elif PcdData.ItemType == "PATCHABLE_IN_MODULE":
 | |
|                     SectionPcdsPatchableInModule = SectionDict.get(ItemType, [])
 | |
|                     if String not in SectionPcdsPatchableInModule:
 | |
|                         SectionPcdsPatchableInModule.append(String)
 | |
|                         SectionDict[ItemType] = SectionPcdsPatchableInModule
 | |
|                 elif PcdData.ItemType == "DYNAMIC":
 | |
|                     SectionPcdsDynamic = SectionDict.get(ItemType, [])
 | |
|                     if String not in SectionPcdsDynamic:
 | |
|                         SectionPcdsDynamic.append(String)
 | |
|                         SectionDict[ItemType] = SectionPcdsDynamic
 | |
| 
 | |
|     DynamicPcdBuildDefinitions = Platform.DynamicPcdBuildDefinitions # It's a list
 | |
|     for PcdBuildData in DynamicPcdBuildDefinitions:
 | |
|         List = []
 | |
|         List.append(PcdData.TokenSpaceGuidCName + "." + PcdData.C_NAME)
 | |
|         List.append(PcdData.Token)
 | |
|         List.append(PcdData.DatumType)
 | |
|         List.append(PcdData.MaxDatumSize)
 | |
|         String = "|".join(List)
 | |
|         if PcdBuildData.ItemType == "DYNAMIC":
 | |
|             ItemType = PcdBuildData.ItemType
 | |
|             SectionPcdsDynamic = SectionDict.get(ItemType, [])
 | |
|             if String not in SectionPcdsDynamic:
 | |
|                 SectionPcdsDynamic.append(String)
 | |
|                 SectionDict[ItemType] = SectionPcdsDynamic
 | |
|     ItemType = "FIXED_AT_BUILD"
 | |
|     Section = "[PcdsFixedAtBuild]\n  " + "\n  ".join(SectionDict.get(ItemType, []))
 | |
|     ItemType = "FEATURE_FLAG"
 | |
|     Section += "\n\n[PcdsFeatureFlag]\n  " + "\n  ".join(SectionDict.get(ItemType, []))
 | |
|     ItemType = "PATCHABLE_IN_MODULE"
 | |
|     Section += "\n\n[PcdsPatchableInModule]\n  " + "\n  ".join(SectionDict.get(ItemType, []))
 | |
|     Section += "\n\n"
 | |
|     List = []
 | |
|     List.append("################################################################################")
 | |
|     List.append("#")
 | |
|     List.append("# Pcd Dynamic Section - list of all EDK II PCD Entries defined by this Platform.")
 | |
|     List.append("#")
 | |
|     List.append("################################################################################")
 | |
|     String = "\n".join(List)
 | |
|     Section += String
 | |
|     ItemType = "DYNAMIC"
 | |
|     Section += "\n\n[PcdsDynamic]\n  " + "\n  ".join(SectionDict.get(ItemType, []))
 | |
|     Section += "\n\n"
 | |
|     
 | |
|     List = []
 | |
|     List.append("################################################################################")
 | |
|     List.append("#")
 | |
|     List.append("# Pcd Section - list of all EDK II PCD Entries defined by this Platform.")
 | |
|     List.append("#")
 | |
|     List.append("################################################################################")
 | |
|     SectionHeader = "\n".join(List)
 | |
|     SectionHeader += "\n"
 | |
|     Section = SectionHeader + Section
 | |
|     StoreTextFile(DscFile, Section)
 | |
| 
 | |
| ## Add item to a section
 | |
| #
 | |
| # Add an Item with specific CPU architecture to section dictionary.
 | |
| # The possible duplication is ensured to be removed.
 | |
| #
 | |
| # @param  Section            Section dictionary indexed by CPU architecture
 | |
| # @param  Arch               CPU architecture: Ia32, X64, Ipf, Ebc or Common
 | |
| # @param  Item               The Item to be added to section dictionary
 | |
| #
 | |
| def AddToSection(Section, Arch, Item):
 | |
|     SectionArch = Section.get(Arch, [])
 | |
|     if Item not in SectionArch:
 | |
|         SectionArch.append(Item)
 | |
|         Section[Arch] = SectionArch
 | |
| 
 | |
| ## Get section contents
 | |
| #
 | |
| # Return the content of section named SectionName.
 | |
| # the contents is based on Methods and ObjectLists.
 | |
| #
 | |
| # @param  SectionName        The name of the section
 | |
| # @param  Method             A function returning a string item of an object
 | |
| # @param  ObjectList         The list of object
 | |
| #
 | |
| # @retval Section            The string content of a section
 | |
| #
 | |
| def GetSection(SectionName, Method, ObjectList):
 | |
|     SupportedArches = ["COMMON", "IA32", "X64", "IPF", "EBC"]
 | |
|     SectionDict = {}
 | |
|     for Object in ObjectList:
 | |
|         if Object.FilePath == "":
 | |
|             continue
 | |
|         Item = Method(Object)
 | |
|         if Item == "":
 | |
|             continue
 | |
|         Item = "  %s" % Item
 | |
|         Arches = Object.SupArchList
 | |
|         if len(Arches) == 4:
 | |
|             AddToSection(SectionDict, "common", Item)
 | |
|         else:
 | |
|             for Arch in SupportedArches:
 | |
|                 if Arch.upper() in Arches:
 | |
|                     AddToSection(SectionDict, Arch, Item)
 | |
| 
 | |
|     Section = ""
 | |
|     for Arch in SupportedArches:
 | |
|         SectionArch = "\n".join(SectionDict.get(Arch, []))
 | |
|         if SectionArch != "":
 | |
|             Section += "[%s.%s]\n%s\n" % (SectionName, Arch, SectionArch)
 | |
|             Section += "\n"
 | |
|     if Section != "":
 | |
|         Section += "\n"
 | |
|     return Section
 | |
| 
 | |
| ## Return a Platform Component Item
 | |
| #
 | |
| # Read the input Platform Component object and return one line of Platform Component Item.
 | |
| #
 | |
| # @param  Component         An input Platform Component class object
 | |
| #
 | |
| # @retval ComponentItem     A Platform Component Item
 | |
| #
 | |
| def GetPlatformComponentItem(Component):
 | |
|     List = []
 | |
|     Section = {}
 | |
| 
 | |
|     List.append("$(WORKSPACE)/" + Component.FilePath)
 | |
| 
 | |
|     LibraryClasses = Component.LibraryClasses
 | |
|     if LibraryClasses != []:
 | |
|         List = []
 | |
|         List.append("$(WORKSPACE)/" + Component.FilePath + " {")
 | |
|         List.append("<LibraryClasses>")
 | |
|         for LibraryClass in LibraryClasses:
 | |
|             if LibraryClass == ["", ""]:
 | |
|                 continue
 | |
|             List.append("  " + LibraryClass[0] + "|$(WORKSPACE)/" + LibraryClass[1])
 | |
|             
 | |
|     PcdBuildDefinitions = Component.PcdBuildDefinitions
 | |
|     for PcdData in PcdBuildDefinitions:
 | |
|         if PcdData.ItemType == "FEATURE_FLAG":
 | |
|             List1 = []
 | |
|             List1.append(PcdData.TokenSpaceGuidCName + "." + PcdData.C_NAME)
 | |
|             List1.append(PcdData.Value)
 | |
|             String = "|".join(List1)
 | |
|             ItemType = PcdData.ItemType
 | |
|             SectionPcd = Section.get(ItemType, [])
 | |
|             if String not in SectionPcd:
 | |
|                 SectionPcd.append(String)
 | |
|             Section[ItemType] = SectionPcd
 | |
|         else:
 | |
|             List1 = []
 | |
|             List1.append(PcdData.TokenSpaceGuidCName + "." + PcdData.C_NAME)
 | |
|             List1.append(PcdData.Value)
 | |
|             List1.append(PcdData.Token)
 | |
|             List1.append(PcdData.DatumType)
 | |
|             List1.append(PcdData.MaxDatumSize)
 | |
|             String = "|".join(List1)
 | |
|             ItemType = PcdData.ItemType
 | |
|             if ItemType == "FIXED_AT_BUILD":
 | |
|                 SectionPcd = Section.get(ItemType, [])
 | |
|                 if String not in SectionPcd:
 | |
|                     SectionPcd.append(String)
 | |
|                 Section[ItemType] = SectionPcd
 | |
|             #elif ItemType == "FEATURE_FLAG":
 | |
|                 #SectionPcd = Section.get(ItemType, [])
 | |
|                 #if String not in SectionPcd:
 | |
|                     #SectionPcd.append(String)
 | |
|                 #Section[ItemType] = SectionPcd
 | |
|             elif ItemType == "PATCHABLE_IN_MODULE":
 | |
|                 SectionPcd = Section.get(ItemType, [])
 | |
|                 if String not in SectionPcd:
 | |
|                     SectionPcd.append(String)
 | |
|                 Section[ItemType] = SectionPcd
 | |
|             elif ItemType == "DYNAMIC":
 | |
|                 SectionPcd = Section.get(ItemType, [])
 | |
|                 if String not in SectionPcd:
 | |
|                     SectionPcd.append(String)
 | |
|                 Section[ItemType] = SectionPcd
 | |
| 
 | |
|     ItemType = "FIXED_AT_BUILD"
 | |
|     if Section.get(ItemType, []) != []:
 | |
|         List.append("<PcdsFixedAtBuild>")
 | |
|         List.append("  " + "\n    ".join(Section.get(ItemType,[])))
 | |
|     ItemType = "FEATURE_FLAG"
 | |
|     if Section.get(ItemType, []) != []:
 | |
|         List.append("<PcdsFeatureFlag>")
 | |
|         List.append("  " + "\n    ".join(Section.get(ItemType,[])))
 | |
|     ItemType = "PATCHABLE_IN_MODULE"
 | |
|     if Section.get(ItemType, []) != []:
 | |
|         List.append("<PcdsPatchableInModule>")
 | |
|         List.append("  " + "\n    ".join(Section.get(ItemType,[])))
 | |
|     ItemType = "DYNAMIC"
 | |
|     if Section.get(ItemType, []) != []:
 | |
|         List.append("<PcdsDynamic>")
 | |
|         List.append("  " + "\n    ".join(Section.get(ItemType,[])))
 | |
| 
 | |
|     ListOption = []
 | |
|     SectionOption = ""
 | |
|     ListBuildOptions = Component.BuildOptions # a list
 | |
|     if ListBuildOptions != []:
 | |
|         SectionOption += "\n  <BuildOptions>\n"
 | |
|         for BuildOptions in ListBuildOptions:
 | |
|             Options = BuildOptions.Options
 | |
|             for Option in Options:
 | |
|                 for Item in Option.BuildTargetList:
 | |
|                     ListOption.append(Item)
 | |
|                 List.append(Option.ToolChainFamily)
 | |
|                 for Item in Option.SupArchList:
 | |
|                     ListOption.append(Item)
 | |
|                 ListOption.append(Option.ToolCode)
 | |
|                 ListOption.append("FLAGS")
 | |
|                 #print ListOption
 | |
|                 SectionOption += "  " + "_".join(List) + "    =  " + Option.Option + "\n"
 | |
|                 ListOption = []
 | |
|     if SectionOption != "":
 | |
|         List.append(SectionOption)
 | |
|     if List != ["$(WORKSPACE)/" + Component.FilePath]:
 | |
|         List.append("}\n")
 | |
| 
 | |
|     return "\n  ".join(List)
 | |
| 
 | |
| ## Store Components section.
 | |
| #
 | |
| # Write [Components] section to the DscFile based on Platform class object.
 | |
| # Different CPU architectures are specified in the subsection if possible.
 | |
| #
 | |
| # @param  DscFile                The output DSC file to store the Components section
 | |
| # @param  Platform               An input Platform class object
 | |
| #
 | |
| def StorePlatformComponentsSection(DscFile, Platform):
 | |
|     Section = GetSection("Components", GetPlatformComponentItem, Platform.Modules.ModuleList)
 | |
|     List = []
 | |
|     List.append("################################################################################")
 | |
|     List.append("#")
 | |
|     List.append("# Components Section - list of all EDK II Modules needed by this Platform.")
 | |
|     List.append("#")
 | |
|     List.append("################################################################################")
 | |
|     SectionHeader = "\n".join(List)
 | |
|     SectionHeader += "\n"
 | |
|     Section = SectionHeader + Section
 | |
|     StoreTextFile(DscFile, Section)
 | |
| 
 | |
| ## Store User Extensions section.
 | |
| #
 | |
| # Write [UserExtensions] section to the InfFile based on Module class object.
 | |
| # Different CPU architectures are specified in the subsection if possible.
 | |
| #
 | |
| # @param  DscFile                The output DSC file to store the User Extensions section
 | |
| # @param  Platform               An input Platform class object
 | |
| #
 | |
| def StorePlatformUserExtensionsSection(DscFile, Platform):
 | |
|     Section = "".join(map(GetUserExtensions, Platform.UserExtensions))
 | |
|     List = []
 | |
|     List.append("################################################################################")
 | |
|     List.append("#")
 | |
|     List.append("# User Extensions Section - list of all User Extensions specified by user.")
 | |
|     List.append("#")
 | |
|     List.append("################################################################################")
 | |
|     SectionHeader = "\n".join(List)
 | |
|     SectionHeader += "\n"
 | |
|     Section = SectionHeader + Section
 | |
|     StoreTextFile(DscFile, Section)
 | |
|     
 | |
| ## Store a Platform class object to a new DSC file.
 | |
| #
 | |
| # Read an input Platform class object and save the contents to a new DSC file.
 | |
| #
 | |
| # @param  DSCFileName             The output DSC file
 | |
| # @param  Platform                An input Platform class object
 | |
| #
 | |
| def StoreDsc(DscFileName, Platform):
 | |
|     DscFile = open(DscFileName, "w+")
 | |
|     EdkLogger.info("Save file to %s" % DscFileName)
 | |
| 
 | |
|     StoreHeader(DscFile, Platform.Header)
 | |
|     StorePlatformDefinesSection(DscFile, Platform)
 | |
|     StorePlatformBuildOptionsSection(DscFile,Platform)
 | |
|     StorePlatformSkuIdsSection(DscFile,Platform)
 | |
|     StorePlatformLibrariesSection(DscFile,Platform) # new in dsc, Edk I components, list of INF files
 | |
|     StorePlatformLibraryClassesSection(DscFile, Platform) # LibraryClasses are from Modules
 | |
|     StorePlatformPcdSection(DscFile, Platform)
 | |
|     #StorePlatformPcdDynamicSection(DscFile, Platform)
 | |
|     StorePlatformComponentsSection(DscFile,Platform)
 | |
|     StorePlatformUserExtensionsSection(DscFile,Platform)
 | |
|     DscFile.close()
 | |
|     
 | |
| if __name__ == '__main__':
 | |
|     pass
 |