mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-01 12:53:27 +01:00
02287fbb4b
Signed-off-by: SergeySlice <sergey.slice@gmail.com>
1004 lines
37 KiB
Python
1004 lines
37 KiB
Python
## @file
|
|
# This file is used to parse a Module file of .PKG file
|
|
#
|
|
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
|
|
#
|
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
#
|
|
|
|
'''
|
|
ModuleSurfaceAreaXml
|
|
'''
|
|
from xml.dom import minidom
|
|
|
|
from Library.StringUtils import ConvertNEToNOTEQ
|
|
from Library.StringUtils import ConvertNOTEQToNE
|
|
from Library.StringUtils import GetStringOfList
|
|
from Library.StringUtils import IsMatchArch
|
|
from Library.Xml.XmlRoutines import XmlElement
|
|
from Library.Xml.XmlRoutines import XmlAttribute
|
|
from Library.Xml.XmlRoutines import XmlNode
|
|
from Library.Xml.XmlRoutines import XmlList
|
|
from Library.Xml.XmlRoutines import CreateXmlElement
|
|
from Object.POM.CommonObject import GuidVersionObject
|
|
from Object.POM.ModuleObject import BootModeObject
|
|
from Object.POM.ModuleObject import DepexObject
|
|
from Object.POM.ModuleObject import ModuleObject
|
|
from Object.POM.ModuleObject import EventObject
|
|
from Object.POM.ModuleObject import HobObject
|
|
from Object.POM.ModuleObject import SourceFileObject
|
|
from Object.POM.ModuleObject import PackageDependencyObject
|
|
from Object.POM.ModuleObject import ExternObject
|
|
from Object.POM.ModuleObject import BinaryFileObject
|
|
from Object.POM.ModuleObject import AsBuiltObject
|
|
from Object.POM.ModuleObject import BinaryBuildFlagObject
|
|
from Xml.CommonXml import ClonedFromXml
|
|
from Xml.CommonXml import HeaderXml
|
|
from Xml.CommonXml import HelpTextXml
|
|
from Xml.CommonXml import CommonDefinesXml
|
|
from Xml.CommonXml import LibraryClassXml
|
|
from Xml.CommonXml import UserExtensionsXml
|
|
from Xml.CommonXml import MiscellaneousFileXml
|
|
from Xml.CommonXml import FilenameXml
|
|
from Xml.GuidProtocolPpiXml import GuidXml
|
|
from Xml.GuidProtocolPpiXml import ProtocolXml
|
|
from Xml.GuidProtocolPpiXml import PpiXml
|
|
from Xml.PcdXml import PcdEntryXml
|
|
from Xml.XmlParserMisc import GetHelpTextList
|
|
from Library import GlobalData
|
|
from Library.Misc import GetSplitValueList
|
|
|
|
## BinaryFileXml
|
|
#
|
|
# represent the following XML item
|
|
#
|
|
# <BinaryFile>
|
|
# <Filename
|
|
# FileType=" FileType " {1}
|
|
# SupArchList=" ArchListType " {0,1}
|
|
# FeatureFlag=" FeatureFlagExpression " {0,1} >
|
|
# xs:anyURI
|
|
# </Filename> {1,}
|
|
# <AsBuilt> ... </AsBuilt> {0,}
|
|
# </BinaryFile> {1,}
|
|
#
|
|
class BinaryFileXml(object):
|
|
def __init__(self):
|
|
self.FileNames = []
|
|
self.AsBuiltList = []
|
|
self.PatchPcdValues = ''
|
|
self.PcdExValues = ''
|
|
self.LibraryInstances = ''
|
|
self.BuildFlags = ''
|
|
|
|
def FromXml(self, Item, Key):
|
|
if self.FileNames:
|
|
pass
|
|
BinaryFile = BinaryFileObject()
|
|
FilenameList = []
|
|
SupArchList = ['COMMON']
|
|
for SubItem in XmlList(Item, '%s/Filename' % Key):
|
|
Axml = FilenameXml()
|
|
Bxml = Axml.FromXml(SubItem, 'Filename')
|
|
FilenameList.append(Bxml)
|
|
BinaryFile.SetFileNameList(FilenameList)
|
|
for FileName in FilenameList:
|
|
if FileName.GetSupArchList():
|
|
SupArchList = FileName.GetSupArchList()
|
|
BinaryFile.SetSupArchList(SupArchList)
|
|
if GlobalData.gIS_BINARY_INF:
|
|
AsBuiltList = []
|
|
for AsBuiltItem in XmlList(Item, '%s/AsBuilt' % Key):
|
|
AsBuilt = AsBuiltObject()
|
|
|
|
PatchPcdValueList = []
|
|
for SubItem in XmlList(AsBuiltItem, 'AsBuilt/PatchPcdValue'):
|
|
Axml = PcdEntryXml()
|
|
Bxml = Axml.FromXml(SubItem, 'PatchPcdValue')
|
|
PatchPcdValueList.append(Bxml)
|
|
AsBuilt.SetPatchPcdList(PatchPcdValueList)
|
|
PcdExValueList = []
|
|
for SubItem in XmlList(AsBuiltItem, 'AsBuilt/PcdExValue'):
|
|
Axml = PcdEntryXml()
|
|
Bxml = Axml.FromXml(SubItem, 'PcdExValue')
|
|
PcdExValueList.append(Bxml)
|
|
AsBuilt.SetPcdExList(PcdExValueList)
|
|
LibraryList = []
|
|
for SubItem in XmlList(Item, '%s/AsBuilt/LibraryInstances/GUID' % Key):
|
|
GuidVerObj = GuidVersionObject()
|
|
GUID = XmlElement(SubItem, 'GUID')
|
|
Version = XmlAttribute(XmlNode(SubItem, 'GUID'), 'Version')
|
|
GuidVerObj.SetGuid(GUID)
|
|
GuidVerObj.SetVersion(Version)
|
|
LibraryList.append(GuidVerObj)
|
|
if XmlList(Item, '%s/AsBuilt/LibraryInstances' % Key) and not LibraryList:
|
|
LibraryList = [None]
|
|
AsBuilt.SetLibraryInstancesList(LibraryList)
|
|
BuildFlagList = []
|
|
for SubItem in XmlList(Item, '%s/AsBuilt/BuildFlags' % Key):
|
|
BuildFlag = BuildFlagXml()
|
|
BuildFlagList.append(BuildFlag.FromXml2(SubItem, 'BuildFlags'))
|
|
AsBuilt.SetBuildFlagsList(BuildFlagList)
|
|
AsBuiltList.append(AsBuilt)
|
|
BinaryFile.SetAsBuiltList(AsBuiltList)
|
|
return BinaryFile
|
|
|
|
def ToXml(self, BinaryFile, Key):
|
|
if self.FileNames:
|
|
pass
|
|
NodeList = []
|
|
FilenameList = BinaryFile.GetFileNameList()
|
|
SupportArch = None
|
|
for Filename in FilenameList:
|
|
Tmp = FilenameXml()
|
|
NodeList.append(Tmp.ToXml(Filename, 'Filename'))
|
|
SupportArch = Filename.SupArchList
|
|
|
|
AsBuildList = BinaryFile.GetAsBuiltList()
|
|
PatchPcdValueList = AsBuildList.GetPatchPcdList()
|
|
PcdExList = AsBuildList.GetPcdExList()
|
|
LibGuidVerList = AsBuildList.GetLibraryInstancesList()
|
|
BuildFlagList = AsBuildList.GetBuildFlagsList()
|
|
|
|
AsBuiltNodeList = []
|
|
|
|
for Pcd in PatchPcdValueList:
|
|
if IsMatchArch(Pcd.SupArchList, SupportArch):
|
|
Tmp = PcdEntryXml()
|
|
AsBuiltNodeList.append(Tmp.ToXml4(Pcd, 'PatchPcdValue'))
|
|
|
|
for Pcd in PcdExList:
|
|
if IsMatchArch(Pcd.SupArchList, SupportArch):
|
|
Tmp = PcdEntryXml()
|
|
AsBuiltNodeList.append(Tmp.ToXml4(Pcd, 'PcdExValue'))
|
|
|
|
GuiVerElemList = []
|
|
for LibGuidVer in LibGuidVerList:
|
|
if LibGuidVer.GetLibGuid() and IsMatchArch(LibGuidVer.GetSupArchList(), SupportArch):
|
|
GuiVerElem = \
|
|
CreateXmlElement('GUID', LibGuidVer.GetLibGuid(), [], [['Version', LibGuidVer.GetLibVersion()]])
|
|
GuiVerElemList.append(GuiVerElem)
|
|
if len(GuiVerElemList) > 0:
|
|
LibGuidVerElem = CreateXmlElement('LibraryInstances', '', GuiVerElemList, [])
|
|
AsBuiltNodeList.append(LibGuidVerElem)
|
|
|
|
for BuildFlag in BuildFlagList:
|
|
if IsMatchArch(BuildFlag.GetSupArchList(), SupportArch):
|
|
for Item in BuildFlag.GetAsBuildList():
|
|
Tmp = BuildFlagXml()
|
|
Elem = CreateXmlElement('BuildFlags', ''.join(Item), [], [])
|
|
AsBuiltNodeList.append(Elem)
|
|
|
|
if len(AsBuiltNodeList) > 0:
|
|
Element = CreateXmlElement('AsBuilt', '', AsBuiltNodeList, [])
|
|
NodeList.append(Element)
|
|
|
|
Root = CreateXmlElement('%s' % Key, '', NodeList, [])
|
|
|
|
return Root
|
|
|
|
def __str__(self):
|
|
Str = "BinaryFiles:"
|
|
for Item in self.FileNames:
|
|
Str = Str + '\n\t' + str(Item)
|
|
for Item in self.PatchPcdValues:
|
|
Str = Str + '\n\t' + str(Item)
|
|
for Item in self.PcdExValues:
|
|
Str = Str + '\n\t' + str(Item)
|
|
for Item in self.LibraryInstances:
|
|
Str = Str + '\n\t' + str(Item)
|
|
for Item in self.BuildFlags:
|
|
Str = Str + '\n\t' + str(Item)
|
|
return Str
|
|
|
|
##
|
|
# PackageXml
|
|
#
|
|
class PackageXml(object):
|
|
def __init__(self):
|
|
self.Description = ''
|
|
self.Guid = ''
|
|
self.Version = ''
|
|
self.CommonDefines = CommonDefinesXml()
|
|
|
|
def FromXml(self, Item, Key):
|
|
self.Description = XmlElement(Item, '%s/Description' % Key)
|
|
self.Guid = XmlElement(Item, '%s/GUID' % Key)
|
|
self.Version = XmlAttribute(XmlNode(Item, '%s/GUID' % Key), 'Version')
|
|
self.CommonDefines.FromXml(XmlNode(Item, '%s' % Key), Key)
|
|
|
|
PackageDependency = PackageDependencyObject()
|
|
PackageDependency.SetPackage(self.Description)
|
|
PackageDependency.SetGuid(self.Guid)
|
|
PackageDependency.SetVersion(self.Version)
|
|
PackageDependency.SetFeatureFlag(ConvertNOTEQToNE(self.CommonDefines.FeatureFlag))
|
|
PackageDependency.SetSupArchList(self.CommonDefines.SupArchList)
|
|
|
|
return PackageDependency
|
|
|
|
def ToXml(self, PackageDependency, Key):
|
|
if self.Guid:
|
|
pass
|
|
AttributeList = [['SupArchList', GetStringOfList(PackageDependency.GetSupArchList())],
|
|
['FeatureFlag', ConvertNEToNOTEQ(PackageDependency.GetFeatureFlag())], ]
|
|
Element1 = CreateXmlElement('GUID', PackageDependency.GetGuid(), [],
|
|
[['Version', PackageDependency.GetVersion()]])
|
|
NodeList = [['Description', PackageDependency.GetPackage()], Element1, ]
|
|
Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)
|
|
|
|
return Root
|
|
|
|
def __str__(self):
|
|
Str = "Description = %s Guid = %s Version = %s %s" \
|
|
% (self.Description, self.Guid, self.Version, self.CommonDefines)
|
|
return Str
|
|
##
|
|
# ExternXml
|
|
#
|
|
class ExternXml(object):
|
|
def __init__(self):
|
|
self.CommonDefines = CommonDefinesXml()
|
|
self.EntryPoint = ''
|
|
self.UnloadImage = ''
|
|
self.Constructor = ''
|
|
self.Destructor = ''
|
|
self.SupModList = ''
|
|
self.SupArchList = ''
|
|
self.HelpText = []
|
|
|
|
def FromXml(self, Item, Key):
|
|
self.CommonDefines.FromXml(Item, Key)
|
|
self.EntryPoint = XmlElement(Item, '%s/EntryPoint' % Key)
|
|
self.UnloadImage = XmlElement(Item, '%s/UnloadImage' % Key)
|
|
self.Constructor = XmlElement(Item, '%s/Constructor' % Key)
|
|
self.Destructor = XmlElement(Item, '%s/Destructor' % Key)
|
|
|
|
Extern = ExternObject()
|
|
Extern.SetEntryPoint(self.EntryPoint)
|
|
Extern.SetUnloadImage(self.UnloadImage)
|
|
Extern.SetConstructor(self.Constructor)
|
|
Extern.SetDestructor(self.Destructor)
|
|
if self.CommonDefines.SupModList:
|
|
Extern.SetSupModList(self.CommonDefines.SupModList)
|
|
if self.CommonDefines.SupArchList:
|
|
Extern.SetSupArchList(self.CommonDefines.SupArchList)
|
|
return Extern
|
|
|
|
def ToXml(self, Extern, Key):
|
|
if self.HelpText:
|
|
pass
|
|
|
|
NodeList = []
|
|
if Extern.GetEntryPoint():
|
|
NodeList.append(['EntryPoint', Extern.GetEntryPoint()])
|
|
if Extern.GetUnloadImage():
|
|
NodeList.append(['UnloadImage', Extern.GetUnloadImage()])
|
|
if Extern.GetConstructor():
|
|
NodeList.append(['Constructor', Extern.GetConstructor()])
|
|
if Extern.GetDestructor():
|
|
NodeList.append(['Destructor', Extern.GetDestructor()])
|
|
Root = CreateXmlElement('%s' % Key, '', NodeList, [])
|
|
|
|
return Root
|
|
|
|
def __str__(self):
|
|
Str = "EntryPoint = %s UnloadImage = %s Constructor = %s Destructor = %s %s" \
|
|
% (self.EntryPoint, self.UnloadImage, self.Constructor, self.Destructor, self.CommonDefines)
|
|
for Item in self.HelpText:
|
|
Str = Str + '\n\t' + str(Item)
|
|
return Str
|
|
##
|
|
# DepexXml
|
|
#
|
|
class DepexXml(object):
|
|
def __init__(self):
|
|
self.CommonDefines = CommonDefinesXml()
|
|
self.Expression = None
|
|
self.HelpText = []
|
|
|
|
def FromXml(self, Item, Key):
|
|
if not Item:
|
|
return None
|
|
self.CommonDefines.FromXml(Item, Key)
|
|
self.Expression = XmlElement(Item, '%s/Expression' % Key)
|
|
for HelpTextItem in XmlList(Item, '%s/HelpText' % Key):
|
|
HelpTextObj = HelpTextXml()
|
|
HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)
|
|
self.HelpText.append(HelpTextObj)
|
|
|
|
Depex = DepexObject()
|
|
Depex.SetDepex(self.Expression)
|
|
Depex.SetModuleType(self.CommonDefines.SupModList)
|
|
Depex.SetSupArchList(self.CommonDefines.SupArchList)
|
|
Depex.SetFeatureFlag(self.CommonDefines.FeatureFlag)
|
|
Depex.SetHelpTextList(GetHelpTextList(self.HelpText))
|
|
|
|
return Depex
|
|
|
|
def ToXml(self, Depex, Key):
|
|
if self.HelpText:
|
|
pass
|
|
AttributeList = [['SupArchList', GetStringOfList(Depex.GetSupArchList())],
|
|
['SupModList', Depex.GetModuleType()]]
|
|
NodeList = [['Expression', Depex.GetDepex()]]
|
|
if Depex.GetHelpText():
|
|
Tmp = HelpTextXml()
|
|
NodeList.append(Tmp.ToXml(Depex.GetHelpText(), 'HelpText'))
|
|
|
|
Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)
|
|
return Root
|
|
|
|
def __str__(self):
|
|
Str = "Expression = %s" % (self.Expression)
|
|
for Item in self.HelpText:
|
|
Str = Str + '\n\t' + str(Item)
|
|
return Str
|
|
|
|
##
|
|
# BootModeXml
|
|
#
|
|
class BootModeXml(object):
|
|
def __init__(self):
|
|
self.SupportedBootModes = ''
|
|
self.CommonDefines = CommonDefinesXml()
|
|
self.HelpText = []
|
|
|
|
def FromXml(self, Item, Key):
|
|
self.SupportedBootModes = \
|
|
XmlElement(Item, '%s/SupportedBootModes' % Key)
|
|
self.CommonDefines.FromXml(Item, Key)
|
|
for HelpTextItem in XmlList(Item, '%s/HelpText' % Key):
|
|
HelpTextObj = HelpTextXml()
|
|
HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)
|
|
self.HelpText.append(HelpTextObj)
|
|
|
|
BootMode = BootModeObject()
|
|
BootMode.SetSupportedBootModes(self.SupportedBootModes)
|
|
BootMode.SetUsage(self.CommonDefines.Usage)
|
|
BootMode.SetHelpTextList(GetHelpTextList(self.HelpText))
|
|
|
|
return BootMode
|
|
|
|
def ToXml(self, BootMode, Key):
|
|
if self.HelpText:
|
|
pass
|
|
AttributeList = [['Usage', BootMode.GetUsage()], ]
|
|
NodeList = [['SupportedBootModes', BootMode.GetSupportedBootModes()]]
|
|
for Item in BootMode.GetHelpTextList():
|
|
Tmp = HelpTextXml()
|
|
NodeList.append(Tmp.ToXml(Item, 'HelpText'))
|
|
Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)
|
|
|
|
return Root
|
|
|
|
def __str__(self):
|
|
Str = "SupportedBootModes = %s %s" % (self.SupportedBootModes, self.CommonDefines)
|
|
for Item in self.HelpText:
|
|
Str = Str + '\n\t' + str(Item)
|
|
return Str
|
|
##
|
|
# EventXml
|
|
#
|
|
class EventXml(object):
|
|
def __init__(self):
|
|
self.EventType = ''
|
|
self.Name = ''
|
|
self.CommonDefines = CommonDefinesXml()
|
|
self.HelpText = []
|
|
|
|
def FromXml(self, Item, Key):
|
|
self.EventType = XmlAttribute(XmlNode(Item, '%s' % Key), 'EventType')
|
|
self.Name = XmlElement(Item, '%s' % Key)
|
|
self.CommonDefines.FromXml(Item, Key)
|
|
for HelpTextItem in XmlList(Item, '%s/HelpText' % Key):
|
|
HelpTextObj = HelpTextXml()
|
|
HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)
|
|
self.HelpText.append(HelpTextObj)
|
|
|
|
Event = EventObject()
|
|
Event.SetEventType(self.EventType)
|
|
Event.SetUsage(self.CommonDefines.Usage)
|
|
Event.SetHelpTextList(GetHelpTextList(self.HelpText))
|
|
|
|
return Event
|
|
|
|
def ToXml(self, Event, Key):
|
|
if self.HelpText:
|
|
pass
|
|
AttributeList = [['EventType', Event.GetEventType()],
|
|
['Usage', Event.GetUsage()],
|
|
]
|
|
NodeList = []
|
|
for Item in Event.GetHelpTextList():
|
|
Tmp = HelpTextXml()
|
|
NodeList.append(Tmp.ToXml(Item, 'HelpText'))
|
|
Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)
|
|
|
|
return Root
|
|
|
|
def __str__(self):
|
|
Str = "EventType = %s %s" % (self.EventType, self.CommonDefines)
|
|
for Item in self.HelpText:
|
|
Str = Str + '\n\t' + str(Item)
|
|
return Str
|
|
##
|
|
# HobXml
|
|
#
|
|
class HobXml(object):
|
|
def __init__(self):
|
|
self.HobType = ''
|
|
self.Name = ''
|
|
self.CommonDefines = CommonDefinesXml()
|
|
self.HelpText = []
|
|
|
|
def FromXml(self, Item, Key):
|
|
self.HobType = XmlAttribute(XmlNode(Item, '%s' % Key), 'HobType')
|
|
self.Name = XmlElement(Item, '%s' % Key)
|
|
self.CommonDefines.FromXml(Item, Key)
|
|
for HelpTextItem in XmlList(Item, '%s/HelpText' % Key):
|
|
HelpTextObj = HelpTextXml()
|
|
HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)
|
|
self.HelpText.append(HelpTextObj)
|
|
|
|
Hob = HobObject()
|
|
Hob.SetHobType(self.HobType)
|
|
Hob.SetSupArchList(self.CommonDefines.SupArchList)
|
|
Hob.SetUsage(self.CommonDefines.Usage)
|
|
Hob.SetHelpTextList(GetHelpTextList(self.HelpText))
|
|
|
|
return Hob
|
|
|
|
def ToXml(self, Hob, Key):
|
|
if self.Name:
|
|
pass
|
|
AttributeList = [['HobType', Hob.GetHobType()],
|
|
['Usage', Hob.GetUsage()],
|
|
['SupArchList', GetStringOfList(Hob.GetSupArchList())], ]
|
|
NodeList = []
|
|
for Item in Hob.GetHelpTextList():
|
|
Tmp = HelpTextXml()
|
|
NodeList.append(Tmp.ToXml(Item, 'HelpText'))
|
|
Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)
|
|
|
|
return Root
|
|
|
|
def __str__(self):
|
|
Str = "HobType = %s %s" % (self.HobType, self.CommonDefines)
|
|
for Item in self.HelpText:
|
|
Str = Str + '\n\t' + str(Item)
|
|
return Str
|
|
|
|
##
|
|
# SourceFileXml
|
|
#
|
|
class SourceFileXml(object):
|
|
def __init__(self):
|
|
self.SourceFile = ''
|
|
self.ToolChainFamily = ''
|
|
self.FileType = ''
|
|
self.CommonDefines = CommonDefinesXml()
|
|
|
|
def FromXml(self, Item, Key):
|
|
self.ToolChainFamily = XmlAttribute(Item, 'Family')
|
|
self.SourceFile = XmlElement(Item, 'Filename')
|
|
self.CommonDefines.FromXml(Item, Key)
|
|
|
|
self.CommonDefines.FeatureFlag = ConvertNOTEQToNE(self.CommonDefines.FeatureFlag)
|
|
|
|
SourceFile = SourceFileObject()
|
|
SourceFile.SetSourceFile(self.SourceFile)
|
|
SourceFile.SetFamily(self.ToolChainFamily)
|
|
SourceFile.SetSupArchList(self.CommonDefines.SupArchList)
|
|
SourceFile.SetFeatureFlag(self.CommonDefines.FeatureFlag)
|
|
|
|
return SourceFile
|
|
|
|
def ToXml(self, SourceFile, Key):
|
|
if self.SourceFile:
|
|
pass
|
|
FeatureFlag = ConvertNEToNOTEQ(SourceFile.GetFeatureFlag())
|
|
AttributeList = [['SupArchList', GetStringOfList(SourceFile.GetSupArchList())],
|
|
['Family', SourceFile.GetFamily()],
|
|
['FeatureFlag', FeatureFlag], ]
|
|
Root = CreateXmlElement('%s' % Key, SourceFile.GetSourceFile(), [], AttributeList)
|
|
return Root
|
|
|
|
##
|
|
# ModulePropertyXml
|
|
#
|
|
class ModulePropertyXml(object):
|
|
def __init__(self):
|
|
self.CommonDefines = CommonDefinesXml()
|
|
self.ModuleType = ''
|
|
self.Path = ''
|
|
self.PcdIsDriver = ''
|
|
self.UefiSpecificationVersion = ''
|
|
self.PiSpecificationVersion = ''
|
|
self.SpecificationList = []
|
|
self.SpecificationVersion = ''
|
|
self.BootModes = []
|
|
self.Events = []
|
|
self.HOBs = []
|
|
|
|
def FromXml(self, Item, Key, Header=None):
|
|
self.CommonDefines.FromXml(Item, Key)
|
|
self.ModuleType = XmlElement(Item, '%s/ModuleType' % Key)
|
|
self.Path = XmlElement(Item, '%s/Path' % Key)
|
|
self.PcdIsDriver = XmlElement(Item, '%s/PcdIsDriver' % Key)
|
|
self.UefiSpecificationVersion = XmlElement(Item, '%s/UefiSpecificationVersion' % Key)
|
|
self.PiSpecificationVersion = XmlElement(Item, '%s/PiSpecificationVersion' % Key)
|
|
for SubItem in XmlList(Item, '%s/Specification' % Key):
|
|
Specification = XmlElement(SubItem, '/Specification')
|
|
Version = XmlAttribute(XmlNode(SubItem, '/Specification'), 'Version')
|
|
self.SpecificationList.append((Specification, Version))
|
|
for SubItem in XmlList(Item, '%s/BootMode' % Key):
|
|
Axml = BootModeXml()
|
|
BootMode = Axml.FromXml(SubItem, 'BootMode')
|
|
self.BootModes.append(BootMode)
|
|
for SubItem in XmlList(Item, '%s/Event' % Key):
|
|
Axml = EventXml()
|
|
Event = Axml.FromXml(SubItem, 'Event')
|
|
self.Events.append(Event)
|
|
for SubItem in XmlList(Item, '%s/HOB' % Key):
|
|
Axml = HobXml()
|
|
Hob = Axml.FromXml(SubItem, 'HOB')
|
|
self.HOBs.append(Hob)
|
|
|
|
if Header is None:
|
|
Header = ModuleObject()
|
|
|
|
Header.SetModuleType(self.ModuleType)
|
|
Header.SetSupArchList(self.CommonDefines.SupArchList)
|
|
Header.SetModulePath(self.Path)
|
|
|
|
Header.SetPcdIsDriver(self.PcdIsDriver)
|
|
Header.SetUefiSpecificationVersion(self.UefiSpecificationVersion)
|
|
Header.SetPiSpecificationVersion(self.PiSpecificationVersion)
|
|
Header.SetSpecList(self.SpecificationList)
|
|
|
|
return Header, self.BootModes, self.Events, self.HOBs
|
|
|
|
|
|
def ToXml(self, Header, BootModes, Events, Hobs, Key):
|
|
if self.ModuleType:
|
|
pass
|
|
AttributeList = [['SupArchList', GetStringOfList(Header.GetSupArchList())], ]
|
|
|
|
NodeList = [['ModuleType', Header.GetModuleType()],
|
|
['Path', Header.GetModulePath()],
|
|
['PcdIsDriver', Header.GetPcdIsDriver()],
|
|
['UefiSpecificationVersion', Header.GetUefiSpecificationVersion()],
|
|
['PiSpecificationVersion', Header.GetPiSpecificationVersion()],
|
|
]
|
|
for Item in Header.GetSpecList():
|
|
Spec, Version = Item
|
|
SpecElem = CreateXmlElement('Specification', Spec, [], [['Version', Version]])
|
|
NodeList.append(SpecElem)
|
|
|
|
for Item in BootModes:
|
|
Tmp = BootModeXml()
|
|
NodeList.append(Tmp.ToXml(Item, 'BootMode'))
|
|
for Item in Events:
|
|
Tmp = EventXml()
|
|
NodeList.append(Tmp.ToXml(Item, 'Event'))
|
|
for Item in Hobs:
|
|
Tmp = HobXml()
|
|
NodeList.append(Tmp.ToXml(Item, 'HOB'))
|
|
Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)
|
|
|
|
return Root
|
|
|
|
def __str__(self):
|
|
Str = "ModuleType = %s Path = %s PcdIsDriver = %s UefiSpecificationVersion = %s PiSpecificationVersion = %s \
|
|
Specification = %s SpecificationVersion = %s %s" % \
|
|
(self.ModuleType, self.Path, self.PcdIsDriver, \
|
|
self.UefiSpecificationVersion, self.PiSpecificationVersion, \
|
|
self.SpecificationList, self.SpecificationVersion, self.CommonDefines)
|
|
for Item in self.BootModes:
|
|
Str = Str + '\n\t' + str(Item)
|
|
for Item in self.Events:
|
|
Str = Str + '\n\t' + str(Item)
|
|
for Item in self.HOBs:
|
|
Str = Str + '\n\t' + str(Item)
|
|
return Str
|
|
|
|
##
|
|
# ModuleXml
|
|
#
|
|
class ModuleSurfaceAreaXml(object):
|
|
def __init__(self, Package=''):
|
|
self.Module = None
|
|
#
|
|
# indicate the package that this module resides in
|
|
#
|
|
self.Package = Package
|
|
|
|
def FromXml2(self, Item, Module):
|
|
if self.Module:
|
|
pass
|
|
#
|
|
# PeiDepex
|
|
#
|
|
PeiDepexList = []
|
|
for SubItem in XmlList(Item, '/ModuleSurfaceArea/PeiDepex'):
|
|
Tmp = DepexXml()
|
|
Depex = Tmp.FromXml(XmlNode(SubItem, 'PeiDepex'), 'PeiDepex')
|
|
PeiDepexList.append(Depex)
|
|
Module.SetPeiDepex(PeiDepexList)
|
|
|
|
#
|
|
# DxeDepex
|
|
#
|
|
DxeDepexList = []
|
|
for SubItem in XmlList(Item, '/ModuleSurfaceArea/DxeDepex'):
|
|
Tmp = DepexXml()
|
|
Depex = Tmp.FromXml(XmlNode(SubItem, 'DxeDepex'), 'DxeDepex')
|
|
DxeDepexList.append(Depex)
|
|
Module.SetDxeDepex(DxeDepexList)
|
|
|
|
#
|
|
# SmmDepex
|
|
#
|
|
SmmDepexList = []
|
|
for SubItem in XmlList(Item, '/ModuleSurfaceArea/SmmDepex'):
|
|
Tmp = DepexXml()
|
|
Depex = Tmp.FromXml(XmlNode(SubItem, 'SmmDepex'), 'SmmDepex')
|
|
SmmDepexList.append(Depex)
|
|
Module.SetSmmDepex(SmmDepexList)
|
|
|
|
#
|
|
# MiscellaneousFile
|
|
Tmp = MiscellaneousFileXml()
|
|
MiscFileList = Tmp.FromXml(XmlNode(Item, '/ModuleSurfaceArea/MiscellaneousFiles'), 'MiscellaneousFiles')
|
|
if MiscFileList:
|
|
Module.SetMiscFileList([MiscFileList])
|
|
else:
|
|
Module.SetMiscFileList([])
|
|
|
|
#
|
|
# UserExtensions
|
|
#
|
|
for Item in XmlList(Item, '/ModuleSurfaceArea/UserExtensions'):
|
|
Tmp = UserExtensionsXml()
|
|
UserExtension = Tmp.FromXml(Item, 'UserExtensions')
|
|
Module.SetUserExtensionList(Module.GetUserExtensionList() + [UserExtension])
|
|
|
|
return Module
|
|
|
|
def FromXml(self, Item, Key, IsStandAlongModule=False):
|
|
IsBinaryModule = XmlAttribute(Item, 'BinaryModule')
|
|
#
|
|
# Header
|
|
#
|
|
Tmp = HeaderXml()
|
|
Module = Tmp.FromXml(XmlNode(Item, '/%s/Header' % Key), 'Header', True, IsStandAlongModule)
|
|
Module.SetBinaryModule(IsBinaryModule)
|
|
|
|
if IsBinaryModule:
|
|
GlobalData.gIS_BINARY_INF = True
|
|
|
|
#
|
|
# ModuleProperties
|
|
#
|
|
Tmp = ModulePropertyXml()
|
|
(Module, BootModes, Events, HOBs) = \
|
|
Tmp.FromXml(XmlNode(Item, '/ModuleSurfaceArea/ModuleProperties'), 'ModuleProperties', Module)
|
|
Module.SetBootModeList(BootModes)
|
|
Module.SetEventList(Events)
|
|
Module.SetHobList(HOBs)
|
|
#
|
|
# ClonedFrom
|
|
#
|
|
Tmp = ClonedFromXml()
|
|
ClonedFrom = Tmp.FromXml(XmlNode(Item, '/ModuleSurfaceArea/ClonedFrom'), 'ClonedFrom')
|
|
if ClonedFrom:
|
|
Module.SetClonedFrom(ClonedFrom)
|
|
|
|
#
|
|
# LibraryClass
|
|
#
|
|
for SubItem in XmlList(Item, '/ModuleSurfaceArea/LibraryClassDefinitions/LibraryClass'):
|
|
Tmp = LibraryClassXml()
|
|
LibraryClass = Tmp.FromXml(SubItem, 'LibraryClass')
|
|
Module.SetLibraryClassList(Module.GetLibraryClassList() + [LibraryClass])
|
|
|
|
if XmlList(Item, '/ModuleSurfaceArea/LibraryClassDefinitions') and \
|
|
not XmlList(Item, '/ModuleSurfaceArea/LibraryClassDefinitions/LibraryClass'):
|
|
Module.SetLibraryClassList([None])
|
|
|
|
#
|
|
# SourceFiles
|
|
#
|
|
for SubItem in XmlList(Item, '/ModuleSurfaceArea/SourceFiles/Filename'):
|
|
Tmp = SourceFileXml()
|
|
SourceFile = Tmp.FromXml(SubItem, 'Filename')
|
|
Module.SetSourceFileList(Module.GetSourceFileList() + [SourceFile])
|
|
|
|
if XmlList(Item, '/ModuleSurfaceArea/SourceFiles') and \
|
|
not XmlList(Item, '/ModuleSurfaceArea/SourceFiles/Filename') :
|
|
Module.SetSourceFileList([None])
|
|
|
|
#
|
|
# BinaryFile
|
|
#
|
|
for SubItem in XmlList(Item, '/ModuleSurfaceArea/BinaryFiles/BinaryFile'):
|
|
Tmp = BinaryFileXml()
|
|
BinaryFile = Tmp.FromXml(SubItem, 'BinaryFile')
|
|
Module.SetBinaryFileList(Module.GetBinaryFileList() + [BinaryFile])
|
|
|
|
if XmlList(Item, '/ModuleSurfaceArea/BinaryFiles') and \
|
|
not XmlList(Item, '/ModuleSurfaceArea/BinaryFiles/BinaryFile') :
|
|
Module.SetBinaryFileList([None])
|
|
#
|
|
# PackageDependencies
|
|
#
|
|
for SubItem in XmlList(Item, '/ModuleSurfaceArea/PackageDependencies/Package'):
|
|
Tmp = PackageXml()
|
|
PackageDependency = Tmp.FromXml(SubItem, 'Package')
|
|
Module.SetPackageDependencyList(Module.GetPackageDependencyList() + [PackageDependency])
|
|
|
|
if XmlList(Item, '/ModuleSurfaceArea/PackageDependencies') and \
|
|
not XmlList(Item, '/ModuleSurfaceArea/PackageDependencies/Package'):
|
|
Module.SetPackageDependencyList([None])
|
|
|
|
#
|
|
# Guid
|
|
#
|
|
for SubItem in XmlList(Item, '/ModuleSurfaceArea/Guids/GuidCName'):
|
|
Tmp = GuidXml('Module')
|
|
GuidProtocolPpi = Tmp.FromXml(SubItem, 'GuidCName')
|
|
Module.SetGuidList(Module.GetGuidList() + [GuidProtocolPpi])
|
|
|
|
if XmlList(Item, '/ModuleSurfaceArea/Guids') and not XmlList(Item, '/ModuleSurfaceArea/Guids/GuidCName'):
|
|
Module.SetGuidList([None])
|
|
|
|
#
|
|
# Protocol
|
|
#
|
|
for SubItem in XmlList(Item, '/ModuleSurfaceArea/Protocols/Protocol'):
|
|
Tmp = ProtocolXml('Module')
|
|
GuidProtocolPpi = Tmp.FromXml(SubItem, 'Protocol')
|
|
Module.SetProtocolList(Module.GetProtocolList() + [GuidProtocolPpi])
|
|
|
|
if XmlList(Item, '/ModuleSurfaceArea/Protocols') and not XmlList(Item, '/ModuleSurfaceArea/Protocols/Protocol'):
|
|
Module.SetProtocolList([None])
|
|
|
|
#
|
|
# Ppi
|
|
#
|
|
for SubItem in XmlList(Item, '/ModuleSurfaceArea/PPIs/Ppi'):
|
|
Tmp = PpiXml('Module')
|
|
GuidProtocolPpi = Tmp.FromXml(SubItem, 'Ppi')
|
|
Module.SetPpiList(Module.GetPpiList() + [GuidProtocolPpi])
|
|
|
|
if XmlList(Item, '/ModuleSurfaceArea/PPIs') and not XmlList(Item, '/ModuleSurfaceArea/PPIs/Ppi'):
|
|
Module.SetPpiList([None])
|
|
|
|
#
|
|
# Extern
|
|
#
|
|
for SubItem in XmlList(Item, '/ModuleSurfaceArea/Externs/Extern'):
|
|
Tmp = ExternXml()
|
|
Extern = Tmp.FromXml(SubItem, 'Extern')
|
|
Module.SetExternList(Module.GetExternList() + [Extern])
|
|
|
|
if XmlList(Item, '/ModuleSurfaceArea/Externs') and not XmlList(Item, '/ModuleSurfaceArea/Externs/Extern'):
|
|
Module.SetExternList([None])
|
|
|
|
if not Module.GetBinaryModule():
|
|
#
|
|
# PcdCoded
|
|
#
|
|
for SubItem in XmlList(Item, '/ModuleSurfaceArea/PcdCoded/PcdEntry'):
|
|
Tmp = PcdEntryXml()
|
|
PcdEntry = Tmp.FromXml3(SubItem, 'PcdEntry')
|
|
Module.SetPcdList(Module.GetPcdList() + [PcdEntry])
|
|
|
|
if XmlList(Item, '/ModuleSurfaceArea/PcdCoded') and \
|
|
not XmlList(Item, '/ModuleSurfaceArea/PcdCoded/PcdEntry'):
|
|
Module.SetPcdList([None])
|
|
|
|
Module = self.FromXml2(Item, Module)
|
|
#
|
|
# return the module object
|
|
#
|
|
self.Module = Module
|
|
return self.Module
|
|
|
|
def ToXml(self, Module):
|
|
if self.Package:
|
|
pass
|
|
#
|
|
# Create root node of module surface area
|
|
#
|
|
DomModule = minidom.Document().createElement('ModuleSurfaceArea')
|
|
if Module.GetBinaryModule():
|
|
DomModule.setAttribute('BinaryModule', 'true')
|
|
|
|
#
|
|
# Header
|
|
#
|
|
Tmp = HeaderXml()
|
|
DomModule.appendChild(Tmp.ToXml(Module, 'Header'))
|
|
#
|
|
# ModuleProperties
|
|
#
|
|
Tmp = ModulePropertyXml()
|
|
DomModule.appendChild(Tmp.ToXml(Module, Module.GetBootModeList(), Module.GetEventList(), Module.GetHobList(), \
|
|
'ModuleProperties'))
|
|
#
|
|
# ClonedFrom
|
|
#
|
|
Tmp = ClonedFromXml()
|
|
if Module.GetClonedFrom():
|
|
DomModule.appendChild(Tmp.ToXml(Module.GetClonedFrom(), 'ClonedFrom'))
|
|
#
|
|
# LibraryClass
|
|
#
|
|
LibraryClassNode = CreateXmlElement('LibraryClassDefinitions', '', [], [])
|
|
for LibraryClass in Module.GetLibraryClassList():
|
|
Tmp = LibraryClassXml()
|
|
LibraryClassNode.appendChild(Tmp.ToXml2(LibraryClass, 'LibraryClass'))
|
|
DomModule.appendChild(LibraryClassNode)
|
|
#
|
|
# SourceFile
|
|
#
|
|
SourceFileNode = CreateXmlElement('SourceFiles', '', [], [])
|
|
for SourceFile in Module.GetSourceFileList():
|
|
Tmp = SourceFileXml()
|
|
SourceFileNode.appendChild(Tmp.ToXml(SourceFile, 'Filename'))
|
|
DomModule.appendChild(SourceFileNode)
|
|
#
|
|
# BinaryFile
|
|
#
|
|
BinaryFileNode = CreateXmlElement('BinaryFiles', '', [], [])
|
|
for BinaryFile in Module.GetBinaryFileList():
|
|
Tmp = BinaryFileXml()
|
|
BinaryFileNode.appendChild(Tmp.ToXml(BinaryFile, 'BinaryFile'))
|
|
DomModule.appendChild(BinaryFileNode)
|
|
#
|
|
# PackageDependencies
|
|
#
|
|
PackageDependencyNode = CreateXmlElement('PackageDependencies', '', [], [])
|
|
for PackageDependency in Module.GetPackageDependencyList():
|
|
Tmp = PackageXml()
|
|
PackageDependencyNode.appendChild(Tmp.ToXml(PackageDependency, 'Package'))
|
|
DomModule.appendChild(PackageDependencyNode)
|
|
|
|
#
|
|
# Guid
|
|
#
|
|
GuidProtocolPpiNode = CreateXmlElement('Guids', '', [], [])
|
|
for GuidProtocolPpi in Module.GetGuidList():
|
|
Tmp = GuidXml('Module')
|
|
GuidProtocolPpiNode.appendChild(Tmp.ToXml(GuidProtocolPpi, 'GuidCName'))
|
|
DomModule.appendChild(GuidProtocolPpiNode)
|
|
|
|
#
|
|
# Protocol
|
|
#
|
|
GuidProtocolPpiNode = CreateXmlElement('Protocols', '', [], [])
|
|
for GuidProtocolPpi in Module.GetProtocolList():
|
|
Tmp = ProtocolXml('Module')
|
|
GuidProtocolPpiNode.appendChild(Tmp.ToXml(GuidProtocolPpi, 'Protocol'))
|
|
DomModule.appendChild(GuidProtocolPpiNode)
|
|
|
|
#
|
|
# Ppi
|
|
#
|
|
GuidProtocolPpiNode = CreateXmlElement('PPIs', '', [], [])
|
|
for GuidProtocolPpi in Module.GetPpiList():
|
|
Tmp = PpiXml('Module')
|
|
GuidProtocolPpiNode.appendChild(Tmp.ToXml(GuidProtocolPpi, 'Ppi'))
|
|
DomModule.appendChild(GuidProtocolPpiNode)
|
|
#
|
|
# Extern
|
|
#
|
|
ExternNode = CreateXmlElement('Externs', '', [], [])
|
|
for Extern in Module.GetExternList():
|
|
Tmp = ExternXml()
|
|
ExternNode.appendChild(Tmp.ToXml(Extern, 'Extern'))
|
|
DomModule.appendChild(ExternNode)
|
|
#
|
|
# PcdCoded
|
|
#
|
|
PcdEntryNode = CreateXmlElement('PcdCoded', '', [], [])
|
|
for PcdEntry in Module.GetPcdList():
|
|
Tmp = PcdEntryXml()
|
|
PcdEntryNode.appendChild(Tmp.ToXml3(PcdEntry, 'PcdEntry'))
|
|
DomModule.appendChild(PcdEntryNode)
|
|
|
|
#
|
|
# PeiDepex
|
|
#
|
|
if Module.GetPeiDepex():
|
|
for Item in Module.GetPeiDepex():
|
|
Tmp = DepexXml()
|
|
DomModule.appendChild(Tmp.ToXml(Item, 'PeiDepex'))
|
|
|
|
#
|
|
# DxeDepex
|
|
#
|
|
if Module.GetDxeDepex():
|
|
for Item in Module.GetDxeDepex():
|
|
Tmp = DepexXml()
|
|
DomModule.appendChild(Tmp.ToXml(Item, 'DxeDepex'))
|
|
|
|
#
|
|
# SmmDepex
|
|
#
|
|
if Module.GetSmmDepex():
|
|
for Item in Module.GetSmmDepex():
|
|
Tmp = DepexXml()
|
|
DomModule.appendChild(Tmp.ToXml(Item, 'SmmDepex'))
|
|
|
|
#
|
|
# MiscellaneousFile
|
|
#
|
|
if Module.GetMiscFileList():
|
|
Tmp = MiscellaneousFileXml()
|
|
DomModule.appendChild(Tmp.ToXml(Module.GetMiscFileList()[0], 'MiscellaneousFiles'))
|
|
#
|
|
# UserExtensions
|
|
#
|
|
if Module.GetUserExtensionList():
|
|
for UserExtension in Module.GetUserExtensionList():
|
|
Tmp = UserExtensionsXml()
|
|
DomModule.appendChild(Tmp.ToXml(UserExtension, 'UserExtensions'))
|
|
|
|
return DomModule
|
|
|
|
##
|
|
# BuildFlagXml used to generate BuildFlag for <AsBuilt>
|
|
#
|
|
class BuildFlagXml(object):
|
|
def __init__(self):
|
|
self.Target = ''
|
|
self.TagName = ''
|
|
self.Family = ''
|
|
self.AsBuiltFlags = ''
|
|
|
|
def FromXml(self, Item, Key):
|
|
self.Target = XmlElement(Item, '%s/Target' % Key)
|
|
self.TagName = XmlElement(Item, '%s/TagName' % Key)
|
|
self.Family = XmlElement(Item, '%s/Family' % Key)
|
|
|
|
BuildFlag = BinaryBuildFlagObject()
|
|
|
|
BuildFlag.SetTarget(self.Target)
|
|
BuildFlag.SetTagName(self.TagName)
|
|
BuildFlag.SetFamily(self.Family)
|
|
|
|
return BuildFlag
|
|
|
|
#
|
|
# For AsBuild INF usage
|
|
#
|
|
def FromXml2(self, Item, Key):
|
|
self.AsBuiltFlags = XmlElement(Item, '%s' % Key)
|
|
|
|
LineList = GetSplitValueList(self.AsBuiltFlags, '\n')
|
|
ReturnLine = ''
|
|
Count = 0
|
|
for Line in LineList:
|
|
if Count == 0:
|
|
ReturnLine = "# " + Line
|
|
else:
|
|
ReturnLine = ReturnLine + '\n' + '# ' + Line
|
|
Count += 1
|
|
|
|
BuildFlag = BinaryBuildFlagObject()
|
|
BuildFlag.SetAsBuiltOptionFlags(ReturnLine)
|
|
|
|
return BuildFlag
|
|
|
|
def ToXml(self, BuildFlag, Key):
|
|
if self.Target:
|
|
pass
|
|
AttributeList = []
|
|
NodeList = []
|
|
NodeList.append(['BuildFlags', BuildFlag])
|
|
|
|
Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)
|
|
return Root
|