2009-07-17 11:10:31 +02:00
|
|
|
## @file
|
|
|
|
# Store a Package class object to a DEC file.
|
|
|
|
#
|
2010-05-18 07:04:32 +02:00
|
|
|
# Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>
|
|
|
|
# This program and the accompanying materials
|
2009-07-17 11:10:31 +02:00
|
|
|
# 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
|
|
|
|
|