Sync BaseTools Branch (version r2271) to EDKII main trunk.
BaseTool Branch: https://edk2-buildtools.svn.sourceforge.net/svnroot/edk2-buildtools/branches/Releases/BaseTools_r2100 Signed-off-by: lgao4 Reviewed-by: hchen30 git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12214 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
611
BaseTools/Source/Python/UPT/Object/Parser/DecObject.py
Normal file
611
BaseTools/Source/Python/UPT/Object/Parser/DecObject.py
Normal file
@ -0,0 +1,611 @@
|
||||
## @file
|
||||
# This file is used to define class objects for DEC file. It will consumed by
|
||||
#DecParser
|
||||
#
|
||||
# Copyright (c) 2011, 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.
|
||||
|
||||
'''
|
||||
DecObject
|
||||
'''
|
||||
|
||||
## Import modules
|
||||
#
|
||||
import os.path
|
||||
|
||||
from Library.Misc import Sdict
|
||||
from Library.DataType import TAB_GUIDS
|
||||
from Library.DataType import TAB_PPIS
|
||||
from Library.DataType import TAB_PROTOCOLS
|
||||
from Library.DataType import TAB_DEC_DEFINES
|
||||
from Library.DataType import TAB_INCLUDES
|
||||
from Library.DataType import TAB_LIBRARY_CLASSES
|
||||
from Library.DataType import TAB_USER_EXTENSIONS
|
||||
from Library.DataType import TAB_PCDS
|
||||
from Library.DataType import TAB_ARCH_COMMON
|
||||
|
||||
## _DecComments
|
||||
#
|
||||
# Base class for all data objects which have head and tail comments
|
||||
#
|
||||
class _DecComments:
|
||||
|
||||
##constructor
|
||||
#
|
||||
def __init__(self):
|
||||
self._HeadComment = []
|
||||
self._TailComment = []
|
||||
|
||||
## GetComments
|
||||
#
|
||||
def GetComments(self):
|
||||
return self._HeadComment, self._TailComment
|
||||
|
||||
## GetHeadComment
|
||||
#
|
||||
def GetHeadComment(self):
|
||||
return self._HeadComment
|
||||
|
||||
## SetHeadComment
|
||||
#
|
||||
# @param Comment: comment content
|
||||
#
|
||||
def SetHeadComment(self, Comment):
|
||||
self._HeadComment = Comment
|
||||
|
||||
## GetTailComment
|
||||
#
|
||||
def GetTailComment(self):
|
||||
return self._TailComment
|
||||
|
||||
## SetTailComment
|
||||
#
|
||||
# @param Comment: comment content
|
||||
#
|
||||
def SetTailComment(self, Comment):
|
||||
self._TailComment = Comment
|
||||
|
||||
## _DecBaseObject
|
||||
#
|
||||
# Base class that hold common info
|
||||
#
|
||||
class _DecBaseObject(_DecComments):
|
||||
def __init__(self, PkgFullName):
|
||||
_DecComments.__init__(self)
|
||||
#
|
||||
# Key is combined with (Arch, SectionType)
|
||||
# Default is common
|
||||
#
|
||||
self.ValueDict = Sdict()
|
||||
self._PkgFullName = PkgFullName
|
||||
self._PackagePath, self._FileName = os.path.split(PkgFullName)
|
||||
self._SecName = ''
|
||||
|
||||
## GetSectionName
|
||||
#
|
||||
def GetSectionName(self):
|
||||
return self._SecName
|
||||
|
||||
## GetPackagePath
|
||||
#
|
||||
def GetPackagePath(self):
|
||||
return self._PackagePath
|
||||
|
||||
## GetPackageFile
|
||||
#
|
||||
def GetPackageFile(self):
|
||||
return self._FileName
|
||||
|
||||
## GetPackageFullName
|
||||
#
|
||||
def GetPackageFullName(self):
|
||||
return self._PkgFullName
|
||||
|
||||
## AddItem
|
||||
# Add sub-item to current object, sub-class should override it if needed
|
||||
#
|
||||
# @param Item: Sub-item to be added
|
||||
# @param Scope: A list store section name and arch info
|
||||
#
|
||||
def AddItem(self, Item, Scope):
|
||||
if not Scope:
|
||||
return
|
||||
if not Item:
|
||||
return
|
||||
ArchModule = []
|
||||
for Ele in Scope:
|
||||
if Ele[1] in self.ValueDict:
|
||||
self.ValueDict[Ele[1]].append(Item)
|
||||
else:
|
||||
self.ValueDict[Ele[1]] = [Item]
|
||||
ArchModule.append(Ele[1])
|
||||
Item.ArchAndModuleType = ArchModule
|
||||
|
||||
## _GetItemByArch
|
||||
# Helper class used by sub-class
|
||||
# @param Arch: arch
|
||||
#
|
||||
def _GetItemByArch(self, Arch):
|
||||
Arch = Arch.upper()
|
||||
if Arch not in self.ValueDict:
|
||||
return []
|
||||
return self.ValueDict[Arch]
|
||||
|
||||
## _GetAllItems
|
||||
# Get all items, union all arches, items in returned list are unique
|
||||
#
|
||||
def _GetAllItems(self):
|
||||
Retlst = []
|
||||
for Arch in self.ValueDict:
|
||||
for Item in self.ValueDict[Arch]:
|
||||
if Item not in Retlst:
|
||||
Retlst.append(Item)
|
||||
return Retlst
|
||||
|
||||
## _DecItemBaseObject
|
||||
#
|
||||
# Module type and arch the item belongs to
|
||||
#
|
||||
class _DecItemBaseObject(_DecComments):
|
||||
def __init__(self):
|
||||
_DecComments.__init__(self)
|
||||
#
|
||||
# Item's arch, if PCD, also include PCD type
|
||||
#
|
||||
self.ArchAndModuleType = []
|
||||
|
||||
## GetArchList
|
||||
#
|
||||
def GetArchList(self):
|
||||
ArchSet = set()
|
||||
for Arch in self.ArchAndModuleType:
|
||||
ArchSet.add(Arch)
|
||||
return list(ArchSet)
|
||||
|
||||
## DecDefineObject
|
||||
#
|
||||
# Class to hold define section infomation
|
||||
#
|
||||
class DecDefineObject(_DecBaseObject):
|
||||
def __init__(self, PkgFullName):
|
||||
_DecBaseObject.__init__(self, PkgFullName)
|
||||
self._SecName = TAB_DEC_DEFINES.upper()
|
||||
self._DecSpec = ''
|
||||
self._PkgName = ''
|
||||
self._PkgGuid = ''
|
||||
self._PkgVersion = ''
|
||||
self._PkgUniFile = ''
|
||||
|
||||
## GetPackageSpecification
|
||||
#
|
||||
def GetPackageSpecification(self):
|
||||
return self._DecSpec
|
||||
|
||||
def SetPackageSpecification(self, DecSpec):
|
||||
self._DecSpec = DecSpec
|
||||
|
||||
## GetPackageName
|
||||
#
|
||||
def GetPackageName(self):
|
||||
return self._PkgName
|
||||
|
||||
def SetPackageName(self, PkgName):
|
||||
self._PkgName = PkgName
|
||||
|
||||
## GetPackageGuid
|
||||
#
|
||||
def GetPackageGuid(self):
|
||||
return self._PkgGuid
|
||||
|
||||
def SetPackageGuid(self, PkgGuid):
|
||||
self._PkgGuid = PkgGuid
|
||||
|
||||
## GetPackageVersion
|
||||
#
|
||||
def GetPackageVersion(self):
|
||||
return self._PkgVersion
|
||||
|
||||
def SetPackageVersion(self, PkgVersion):
|
||||
self._PkgVersion = PkgVersion
|
||||
|
||||
## GetPackageUniFile
|
||||
#
|
||||
def GetPackageUniFile(self):
|
||||
return self._PkgUniFile
|
||||
|
||||
def SetPackageUniFile(self, PkgUniFile):
|
||||
self._PkgUniFile = PkgUniFile
|
||||
|
||||
## GetDefines
|
||||
#
|
||||
def GetDefines(self):
|
||||
return self._GetItemByArch(TAB_ARCH_COMMON)
|
||||
|
||||
## GetAllDefines
|
||||
#
|
||||
def GetAllDefines(self):
|
||||
return self._GetAllItems()
|
||||
|
||||
## DecDefineItemObject
|
||||
#
|
||||
# Each item of define section
|
||||
#
|
||||
class DecDefineItemObject(_DecItemBaseObject):
|
||||
def __init__(self):
|
||||
_DecItemBaseObject.__init__(self)
|
||||
self.Key = ''
|
||||
self.Value = ''
|
||||
|
||||
## __hash__
|
||||
#
|
||||
def __hash__(self):
|
||||
return hash(self.Key + self.Value)
|
||||
|
||||
## __eq__
|
||||
#
|
||||
def __eq__(self, Other):
|
||||
return id(self) == id(Other)
|
||||
|
||||
## __str__
|
||||
#
|
||||
def __str__(self):
|
||||
return str(self.ArchAndModuleType) + '\n' + self.Key + \
|
||||
' = ' + self.Value
|
||||
|
||||
## DecIncludeObject
|
||||
#
|
||||
# Class to hold include section info
|
||||
#
|
||||
class DecIncludeObject(_DecBaseObject):
|
||||
def __init__(self, PkgFullName):
|
||||
_DecBaseObject.__init__(self, PkgFullName)
|
||||
self._SecName = TAB_INCLUDES.upper()
|
||||
|
||||
## GetIncludes
|
||||
#
|
||||
def GetIncludes(self, Arch=TAB_ARCH_COMMON):
|
||||
return self._GetItemByArch(Arch)
|
||||
|
||||
## GetAllIncludes
|
||||
#
|
||||
def GetAllIncludes(self):
|
||||
return self._GetAllItems()
|
||||
|
||||
## DecIncludeItemObject
|
||||
#
|
||||
# Item of include section
|
||||
#
|
||||
class DecIncludeItemObject(_DecItemBaseObject):
|
||||
def __init__(self, File, Root):
|
||||
self.File = File
|
||||
self.Root = Root
|
||||
_DecItemBaseObject.__init__(self)
|
||||
|
||||
## __hash__
|
||||
#
|
||||
def __hash__(self):
|
||||
return hash(self.File)
|
||||
|
||||
## __eq__
|
||||
#
|
||||
def __eq__(self, Other):
|
||||
return id(self) == id(Other)
|
||||
|
||||
## __str__
|
||||
#
|
||||
def __str__(self):
|
||||
return self.File
|
||||
|
||||
## DecLibraryclassObject
|
||||
#
|
||||
# Class to hold library class section info
|
||||
#
|
||||
class DecLibraryclassObject(_DecBaseObject):
|
||||
def __init__(self, PkgFullName):
|
||||
_DecBaseObject.__init__(self, PkgFullName)
|
||||
self._PackagePath, self._FileName = os.path.split(PkgFullName)
|
||||
self._SecName = TAB_LIBRARY_CLASSES.upper()
|
||||
|
||||
## GetLibraryclasses
|
||||
#
|
||||
def GetLibraryclasses(self, Arch=TAB_ARCH_COMMON):
|
||||
return self._GetItemByArch(Arch)
|
||||
|
||||
## GetAllLibraryclasses
|
||||
#
|
||||
def GetAllLibraryclasses(self):
|
||||
return self._GetAllItems()
|
||||
|
||||
## DecLibraryclassItemObject
|
||||
# Item of library class section
|
||||
#
|
||||
class DecLibraryclassItemObject(_DecItemBaseObject):
|
||||
def __init__(self, Libraryclass, File, Root):
|
||||
_DecItemBaseObject.__init__(self)
|
||||
self.File = File
|
||||
self.Root = Root
|
||||
self.Libraryclass = Libraryclass
|
||||
|
||||
## __hash__
|
||||
#
|
||||
def __hash__(self):
|
||||
return hash(self.Libraryclass + self.File)
|
||||
|
||||
## __eq__
|
||||
#
|
||||
def __eq__(self, Other):
|
||||
return id(self) == id(Other)
|
||||
|
||||
## __str__
|
||||
#
|
||||
def __str__(self):
|
||||
return self.Libraryclass + '|' + self.File
|
||||
|
||||
## DecPcdObject
|
||||
# Class to hold PCD section
|
||||
#
|
||||
class DecPcdObject(_DecBaseObject):
|
||||
def __init__(self, PkgFullName):
|
||||
_DecBaseObject.__init__(self, PkgFullName)
|
||||
self._SecName = TAB_PCDS.upper()
|
||||
|
||||
## AddItem
|
||||
#
|
||||
# Diff from base class
|
||||
#
|
||||
# @param Item: Item
|
||||
# @param Scope: Scope
|
||||
#
|
||||
def AddItem(self, Item, Scope):
|
||||
if not Scope:
|
||||
return
|
||||
if not Item:
|
||||
return
|
||||
ArchModule = []
|
||||
for Type, Arch in Scope:
|
||||
if (Type, Arch) in self.ValueDict:
|
||||
self.ValueDict[Type, Arch].append(Item)
|
||||
else:
|
||||
self.ValueDict[Type, Arch] = [Item]
|
||||
ArchModule.append([Type, Arch])
|
||||
Item.ArchAndModuleType = ArchModule
|
||||
|
||||
## GetPcds
|
||||
#
|
||||
# @param PcdType: PcdType
|
||||
# @param Arch: Arch
|
||||
#
|
||||
def GetPcds(self, PcdType, Arch=TAB_ARCH_COMMON):
|
||||
PcdType = PcdType.upper()
|
||||
Arch = Arch.upper()
|
||||
if (PcdType, Arch) not in self.ValueDict:
|
||||
return []
|
||||
return self.ValueDict[PcdType, Arch]
|
||||
|
||||
## GetPcdsByType
|
||||
#
|
||||
# @param PcdType: PcdType
|
||||
#
|
||||
def GetPcdsByType(self, PcdType):
|
||||
PcdType = PcdType.upper()
|
||||
Retlst = []
|
||||
for TypeInDict, Arch in self.ValueDict:
|
||||
if TypeInDict != PcdType:
|
||||
continue
|
||||
for Item in self.ValueDict[PcdType, Arch]:
|
||||
if Item not in Retlst:
|
||||
Retlst.append(Item)
|
||||
return Retlst
|
||||
|
||||
## DecPcdItemObject
|
||||
#
|
||||
# Item of PCD section
|
||||
#
|
||||
# @param _DecItemBaseObject: _DecItemBaseObject object
|
||||
#
|
||||
class DecPcdItemObject(_DecItemBaseObject):
|
||||
def __init__(self, Guid, Name, Value, DatumType,
|
||||
Token, MaxDatumSize=''):
|
||||
_DecItemBaseObject.__init__(self)
|
||||
self.TokenCName = Name
|
||||
self.TokenSpaceGuidCName = Guid
|
||||
self.DatumType = DatumType
|
||||
self.DefaultValue = Value
|
||||
self.TokenValue = Token
|
||||
self.MaxDatumSize = MaxDatumSize
|
||||
|
||||
## __hash__
|
||||
#
|
||||
def __hash__(self):
|
||||
return hash(self.TokenSpaceGuidCName + self.TokenCName)
|
||||
|
||||
## __eq__
|
||||
#
|
||||
def __eq__(self, Other):
|
||||
return id(self) == id(Other)
|
||||
|
||||
## GetArchListOfType
|
||||
#
|
||||
# @param PcdType: PcdType
|
||||
#
|
||||
def GetArchListOfType(self, PcdType):
|
||||
ItemSet = set()
|
||||
PcdType = PcdType.upper()
|
||||
for Type, Arch in self.ArchAndModuleType:
|
||||
if Type != PcdType:
|
||||
continue
|
||||
ItemSet.add(Arch)
|
||||
return list(ItemSet)
|
||||
|
||||
## DecGuidObjectBase
|
||||
#
|
||||
# Base class for PPI, Protocol, and GUID.
|
||||
# Hold same data but has different method for clarification in sub-class
|
||||
#
|
||||
# @param _DecBaseObject: Dec Base Object
|
||||
#
|
||||
class DecGuidObjectBase(_DecBaseObject):
|
||||
def __init__(self, PkgFullName):
|
||||
_DecBaseObject.__init__(self, PkgFullName)
|
||||
|
||||
## GetGuidStyleItems
|
||||
#
|
||||
# @param Arch: Arch
|
||||
#
|
||||
def GetGuidStyleItems(self, Arch=TAB_ARCH_COMMON):
|
||||
return self._GetItemByArch(Arch)
|
||||
|
||||
## GetGuidStyleAllItems
|
||||
#
|
||||
def GetGuidStyleAllItems(self):
|
||||
return self._GetAllItems()
|
||||
|
||||
## DecGuidItemObject
|
||||
#
|
||||
# Item of GUID, PPI and Protocol section
|
||||
#
|
||||
# @param _DecItemBaseObject: Dec Item Base Object
|
||||
#
|
||||
class DecGuidItemObject(_DecItemBaseObject):
|
||||
def __init__(self, CName, GuidCValue, GuidString):
|
||||
_DecItemBaseObject.__init__(self)
|
||||
self.GuidCName = CName
|
||||
self.GuidCValue = GuidCValue
|
||||
self.GuidString = GuidString
|
||||
|
||||
## __hash__
|
||||
#
|
||||
def __hash__(self):
|
||||
return hash(self.GuidCName)
|
||||
|
||||
## __eq__
|
||||
#
|
||||
def __eq__(self, Other):
|
||||
return id(self) == id(Other)
|
||||
|
||||
## __str__
|
||||
#
|
||||
def __str__(self):
|
||||
return self.GuidCName + ' = ' + self.GuidCValue
|
||||
|
||||
## DecGuidObject
|
||||
#
|
||||
# Class for GUID section
|
||||
#
|
||||
# @param DecGuidObjectBase: Dec Guid Object Base
|
||||
#
|
||||
class DecGuidObject(DecGuidObjectBase):
|
||||
def __init__(self, PkgFullName):
|
||||
DecGuidObjectBase.__init__(self, PkgFullName)
|
||||
self._SecName = TAB_GUIDS.upper()
|
||||
|
||||
## GetGuids
|
||||
#
|
||||
# @param Arch: Arch
|
||||
#
|
||||
def GetGuids(self, Arch=TAB_ARCH_COMMON):
|
||||
return self._GetItemByArch(Arch)
|
||||
|
||||
## GetAllGuids
|
||||
#
|
||||
def GetAllGuids(self):
|
||||
return self._GetAllItems()
|
||||
|
||||
## DecPpiObject
|
||||
#
|
||||
# Class for PPI seciont
|
||||
#
|
||||
# @param DecGuidObjectBase: Dec Guid Object Base
|
||||
#
|
||||
class DecPpiObject(DecGuidObjectBase):
|
||||
def __init__(self, PkgFullName):
|
||||
DecGuidObjectBase.__init__(self, PkgFullName)
|
||||
self._SecName = TAB_PPIS.upper()
|
||||
|
||||
## GetPpis
|
||||
#
|
||||
# @param Arch: Arch
|
||||
#
|
||||
def GetPpis(self, Arch=TAB_ARCH_COMMON):
|
||||
return self._GetItemByArch(Arch)
|
||||
|
||||
## GetAllPpis
|
||||
#
|
||||
def GetAllPpis(self):
|
||||
return self._GetAllItems()
|
||||
|
||||
## DecProtocolObject
|
||||
#
|
||||
# Class for protocol section
|
||||
#
|
||||
# @param DecGuidObjectBase: Dec Guid Object Base
|
||||
#
|
||||
class DecProtocolObject(DecGuidObjectBase):
|
||||
def __init__(self, PkgFullName):
|
||||
DecGuidObjectBase.__init__(self, PkgFullName)
|
||||
self._SecName = TAB_PROTOCOLS.upper()
|
||||
|
||||
## GetProtocols
|
||||
#
|
||||
# @param Arch: Arch
|
||||
#
|
||||
def GetProtocols(self, Arch=TAB_ARCH_COMMON):
|
||||
return self._GetItemByArch(Arch)
|
||||
|
||||
## GetAllProtocols
|
||||
#
|
||||
def GetAllProtocols(self):
|
||||
return self._GetAllItems()
|
||||
|
||||
## DecUserExtensionObject
|
||||
#
|
||||
# Class for user extension section
|
||||
#
|
||||
# @param _DecBaseObject: Dec Guid Object Base
|
||||
#
|
||||
class DecUserExtensionObject(_DecBaseObject):
|
||||
def __init__(self, PkgFullName):
|
||||
_DecBaseObject.__init__(self, PkgFullName)
|
||||
self._SecName = TAB_USER_EXTENSIONS.upper()
|
||||
self.ItemList = []
|
||||
|
||||
## GetProtocols
|
||||
#
|
||||
# @param Item: Item
|
||||
# @param Scope: Scope
|
||||
#
|
||||
def AddItem(self, Item, Scope):
|
||||
if not Scope:
|
||||
pass
|
||||
if not Item:
|
||||
return
|
||||
self.ItemList.append(Item)
|
||||
|
||||
## GetAllUserExtensions
|
||||
#
|
||||
def GetAllUserExtensions(self):
|
||||
return self.ItemList
|
||||
|
||||
|
||||
## DecUserExtensionItemObject
|
||||
# Item for user extension section
|
||||
#
|
||||
# @param _DecItemBaseObject: Dec Item Base Object
|
||||
#
|
||||
class DecUserExtensionItemObject(_DecItemBaseObject):
|
||||
def __init__(self):
|
||||
_DecItemBaseObject.__init__(self)
|
||||
self.UserString = ''
|
||||
self.UserId = ''
|
||||
self.IdString = ''
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user