## @file # Store a Package class object to a DEC 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 # import os from Common.MigrationUtilities import * from LoadSpd import LoadSpd from CommonDataClass.PackageClass import * ## Store Defines section. # # Write [Defines] section to the DecFile based on Package class object. # Different CPU architectures are specified in the subsection if possible. # # @param DecFile The output DEC file to store the Defines section. # @param Package An input Package class object. # def StorePackageDefinesSection(DecFile, Package): DefinesTupleList = [] DefinesTupleList.append(("DEC_VERSION", Package.Header.DecSpecification)) DefinesTupleList.append(("PACKAGE_NAME", Package.Header.Name)) DefinesTupleList.append(("PACKAGE_GUID", Package.Header.Guid)) StoreDefinesSection(DecFile, DefinesTupleList) ## Return a Package Include Class Item. # # Read the input Include class object and return one Include Class Item. # # @param Include An input Include class object. # # @retval IncludeClassItem A Package Include Class Item. # def GetPackageIncludeClassItem(Include): return Include.FilePath ## Store Includes section. # # Write [Includes] section to the DecFile based on Package class object. # Different CPU architectures are specified in the subsection if possible. # # @param DecFile The output DEC file to store the Includes section. # @param Package An input Package class object. # def StorePackageIncludesSection(DecFile, Package): Includes = Package.Includes Section = GetSection("Includes", GetPackageIncludeClassItem, Includes) StoreTextFile(DecFile, Section) ## Return a Package Library Class Item. # # Read the input LibraryClass class object and return one Library Class Item. # # @param LibraryClass An input LibraryClass class object. # # @retval LibraryClassItem A Package Library Class Item. # def GetPackageLibraryClassItem(LibraryClass): return "|".join((LibraryClass.LibraryClass, LibraryClass.IncludeHeader)) ## Store Library Classes section. # # Write [LibraryClasses] section to the DecFile based on Package class object. # Different CPU architectures are specified in the subsection if possible. # # @param DecFile The output DEC file to store the Library Classes # section. # @param Package An input Package class object. # def StorePackageLibraryClassesSection(DecFile, Package): LibraryClasses = Package.LibraryClassDeclarations Section = GetSection("LibraryClasses", GetPackageLibraryClassItem, LibraryClasses) StoreTextFile(DecFile, Section) ## Return a Package Guid Declaration Item. # # Read the input Guid class object and return one line of Guid Declaration Item. # # @param Guid An input Guid class object. # # @retval GuidDeclarationItem A Package Guid Declaration Item. # def GetPackageGuidDeclarationItem(Guid): GuidCName = Guid.CName GuidValue = Guid.Guid.replace("-", "") GuidValueList = [GuidValue[0:8]] GuidValueList += [GuidValue[i : i + 4] for i in range(8, 16, 4)] GuidValueList += [GuidValue[i : i + 2] for i in range(16, 32, 2)] GuidCFormat = "{0x%s" + ", 0x%s" * 2 + ", {0x%s" + ", 0x%s" * 7 + "}}" GuidCValue = GuidCFormat % tuple(GuidValueList) return "%-30s = %s" % (GuidCName, GuidCValue) ## Store Protocols section. # # Write [Protocols] section to the DecFile based on Package class object. # Different CPU architectures are specified in the subsection if possible. # # @param DecFile The output DEC file to store the Protocols section. # @param Package An input Package class object. # def StorePackageProtocolsSection(DecFile, Package): Protocols = Package.ProtocolDeclarations Section = GetSection("Protocols", GetPackageGuidDeclarationItem, Protocols) StoreTextFile(DecFile, Section) ## Store Ppis section. # # Write [Ppis] section to the DecFile based on Package class object. # Different CPU architectures are specified in the subsection if possible. # # @param DecFile The output DEC file to store the Ppis section. # @param Package An input Package class object. # def StorePackagePpisSection(DecFile, Package): Ppis = Package.PpiDeclarations Section = GetSection("Ppis", GetPackageGuidDeclarationItem, Ppis) StoreTextFile(DecFile, Section) ## Store Guids section. # # Write [Guids] section to the DecFile based on Package class object. # Different CPU architectures are specified in the subsection if possible. # # @param DecFile The output DEC file to store the Guids section. # @param Package An input Package class object. # def StorePackageGuidsSection(DecFile, Package): Guids = Package.GuidDeclarations Section = GetSection("Guids", GetPackageGuidDeclarationItem, Guids) StoreTextFile(DecFile, Section) ## Return a Package 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 Package Pcd Item. # def GetPackagePcdItem(Pcd): PcdPair = "%s.%s" % (Pcd.TokenSpaceGuidCName, Pcd.CName) DatumType = Pcd.DatumType DefaultValue = Pcd.DefaultValue Token = Pcd.Token PcdList = [PcdPair, DefaultValue, DatumType, Token] return "|".join(PcdList) ## DEC Pcd Section Name dictionary indexed by PCD Item Type. mDecPcdSectionNameDict = { "FEATURE_FLAG" : "PcdsFeatureFlag", "FIXED_AT_BUILD" : "PcdsFixedAtBuild", "PATCHABLE_IN_MODULE" : "PcdsPatchableInModule", "DYNAMIC" : "PcdsDynamic", "DYNAMIC_EX" : "PcdsDynamicEx" } ## Store Pcds section. # # Write [Pcds*] section to the DecFile based on Package class object. # Different CPU architectures are specified in the subsection if possible. # # @param DecFile The output DEC file to store the Pcds section. # @param Package An input Package class object. # def StorePackagePcdsSection(DecFile, Package): PcdsDict = {} for Pcd in Package.PcdDeclarations: for PcdItemType in Pcd.ValidUsage: PcdSectionName = mDecPcdSectionNameDict.get(PcdItemType) if PcdSectionName: PcdsDict.setdefault(PcdSectionName, []).append(Pcd) else: EdkLogger.info("Unknown Pcd Item Type: %s" % PcdItemType) Section = "" for PcdSectionName in PcdsDict: Pcds = PcdsDict[PcdSectionName] Section += GetSection(PcdSectionName, GetPackagePcdItem, Pcds) StoreTextFile(DecFile, Section) ## Store User Extensions section. # # Write [UserExtensions] section to the DecFile based on Package class object. # # @param DecFile The output DEC file to store the User Extensions section. # @param Package An input Package class object. # def StorePackageUserExtensionsSection(DecFile, Package): Section = "".join(map(GetUserExtensions, Package.UserExtensions)) StoreTextFile(DecFile, Section) ## Store a Package class object to a new DEC file. # # Read an input Package class object and ave the contents to a new DEC file. # # @param DecFileName The output DEC file. # @param Package An input Package class object. # def StoreDec(DecFileName, Package): DecFile = open(DecFileName, "w+") EdkLogger.info("Save file to %s" % DecFileName) StoreHeader(DecFile, Package.Header) StorePackageDefinesSection(DecFile, Package) StorePackageIncludesSection(DecFile, Package) StorePackageLibraryClassesSection(DecFile, Package) StorePackageProtocolsSection(DecFile, Package) StorePackagePpisSection(DecFile, Package) StorePackageGuidsSection(DecFile, Package) StorePackagePcdsSection(DecFile, Package) StorePackageUserExtensionsSection(DecFile, Package) DecFile.close() # This acts like the main() function for the script, unless it is 'import'ed # into another script. if __name__ == '__main__': pass