]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/Xml/ModuleSurfaceAreaXml.py
BaseTools: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Xml / ModuleSurfaceAreaXml.py
CommitLineData
4234283c
LG
1## @file\r
2# This file is used to parse a Module file of .PKG file\r
3#\r
64285f15 4# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
4234283c 5#\r
2e351cbe 6# SPDX-License-Identifier: BSD-2-Clause-Patent\r
4234283c
LG
7#\r
8\r
9'''\r
10ModuleSurfaceAreaXml\r
11'''\r
12from xml.dom import minidom\r
13\r
64285f15
YZ
14from Library.StringUtils import ConvertNEToNOTEQ\r
15from Library.StringUtils import ConvertNOTEQToNE\r
16from Library.StringUtils import GetStringOfList\r
17from Library.StringUtils import IsMatchArch\r
4234283c
LG
18from Library.Xml.XmlRoutines import XmlElement\r
19from Library.Xml.XmlRoutines import XmlAttribute\r
20from Library.Xml.XmlRoutines import XmlNode\r
21from Library.Xml.XmlRoutines import XmlList\r
22from Library.Xml.XmlRoutines import CreateXmlElement\r
23from Object.POM.CommonObject import GuidVersionObject\r
24from Object.POM.ModuleObject import BootModeObject\r
25from Object.POM.ModuleObject import DepexObject\r
26from Object.POM.ModuleObject import ModuleObject\r
27from Object.POM.ModuleObject import EventObject\r
28from Object.POM.ModuleObject import HobObject\r
29from Object.POM.ModuleObject import SourceFileObject\r
30from Object.POM.ModuleObject import PackageDependencyObject\r
31from Object.POM.ModuleObject import ExternObject\r
32from Object.POM.ModuleObject import BinaryFileObject\r
33from Object.POM.ModuleObject import AsBuiltObject\r
34from Object.POM.ModuleObject import BinaryBuildFlagObject\r
35from Xml.CommonXml import ClonedFromXml\r
36from Xml.CommonXml import HeaderXml\r
37from Xml.CommonXml import HelpTextXml\r
38from Xml.CommonXml import CommonDefinesXml\r
39from Xml.CommonXml import LibraryClassXml\r
40from Xml.CommonXml import UserExtensionsXml\r
41from Xml.CommonXml import MiscellaneousFileXml\r
42from Xml.CommonXml import FilenameXml\r
43from Xml.GuidProtocolPpiXml import GuidXml\r
44from Xml.GuidProtocolPpiXml import ProtocolXml\r
45from Xml.GuidProtocolPpiXml import PpiXml\r
46from Xml.PcdXml import PcdEntryXml\r
47from Xml.XmlParserMisc import GetHelpTextList\r
48from Library import GlobalData\r
49from Library.Misc import GetSplitValueList\r
50\r
51## BinaryFileXml\r
52#\r
53# represent the following XML item\r
54#\r
55# <BinaryFile>\r
56# <Filename\r
57# FileType=" FileType " {1}\r
58# SupArchList=" ArchListType " {0,1}\r
59# FeatureFlag=" FeatureFlagExpression " {0,1} >\r
60# xs:anyURI\r
61# </Filename> {1,}\r
62# <AsBuilt> ... </AsBuilt> {0,}\r
63# </BinaryFile> {1,}\r
421ccda3 64#\r
4234283c
LG
65class BinaryFileXml(object):\r
66 def __init__(self):\r
67 self.FileNames = []\r
68 self.AsBuiltList = []\r
69 self.PatchPcdValues = ''\r
70 self.PcdExValues = ''\r
71 self.LibraryInstances = ''\r
72 self.BuildFlags = ''\r
73\r
74 def FromXml(self, Item, Key):\r
75 if self.FileNames:\r
76 pass\r
77 BinaryFile = BinaryFileObject()\r
78 FilenameList = []\r
421ccda3 79 SupArchList = ['COMMON']\r
4234283c
LG
80 for SubItem in XmlList(Item, '%s/Filename' % Key):\r
81 Axml = FilenameXml()\r
82 Bxml = Axml.FromXml(SubItem, 'Filename')\r
83 FilenameList.append(Bxml)\r
84 BinaryFile.SetFileNameList(FilenameList)\r
421ccda3
HC
85 for FileName in FilenameList:\r
86 if FileName.GetSupArchList():\r
87 SupArchList = FileName.GetSupArchList()\r
88 BinaryFile.SetSupArchList(SupArchList)\r
4234283c
LG
89 if GlobalData.gIS_BINARY_INF:\r
90 AsBuiltList = []\r
91 for AsBuiltItem in XmlList(Item, '%s/AsBuilt' % Key):\r
92 AsBuilt = AsBuiltObject()\r
93\r
94 PatchPcdValueList = []\r
95 for SubItem in XmlList(AsBuiltItem, 'AsBuilt/PatchPcdValue'):\r
96 Axml = PcdEntryXml()\r
97 Bxml = Axml.FromXml(SubItem, 'PatchPcdValue')\r
98 PatchPcdValueList.append(Bxml)\r
99 AsBuilt.SetPatchPcdList(PatchPcdValueList)\r
100 PcdExValueList = []\r
101 for SubItem in XmlList(AsBuiltItem, 'AsBuilt/PcdExValue'):\r
102 Axml = PcdEntryXml()\r
103 Bxml = Axml.FromXml(SubItem, 'PcdExValue')\r
104 PcdExValueList.append(Bxml)\r
105 AsBuilt.SetPcdExList(PcdExValueList)\r
106 LibraryList = []\r
107 for SubItem in XmlList(Item, '%s/AsBuilt/LibraryInstances/GUID' % Key):\r
108 GuidVerObj = GuidVersionObject()\r
109 GUID = XmlElement(SubItem, 'GUID')\r
110 Version = XmlAttribute(XmlNode(SubItem, 'GUID'), 'Version')\r
111 GuidVerObj.SetGuid(GUID)\r
112 GuidVerObj.SetVersion(Version)\r
113 LibraryList.append(GuidVerObj)\r
114 if XmlList(Item, '%s/AsBuilt/LibraryInstances' % Key) and not LibraryList:\r
115 LibraryList = [None]\r
116 AsBuilt.SetLibraryInstancesList(LibraryList)\r
117 BuildFlagList = []\r
118 for SubItem in XmlList(Item, '%s/AsBuilt/BuildFlags' % Key):\r
119 BuildFlag = BuildFlagXml()\r
120 BuildFlagList.append(BuildFlag.FromXml2(SubItem, 'BuildFlags'))\r
121 AsBuilt.SetBuildFlagsList(BuildFlagList)\r
122 AsBuiltList.append(AsBuilt)\r
123 BinaryFile.SetAsBuiltList(AsBuiltList)\r
124 return BinaryFile\r
125\r
126 def ToXml(self, BinaryFile, Key):\r
127 if self.FileNames:\r
128 pass\r
129 NodeList = []\r
130 FilenameList = BinaryFile.GetFileNameList()\r
e4ac870f 131 SupportArch = None\r
4234283c
LG
132 for Filename in FilenameList:\r
133 Tmp = FilenameXml()\r
134 NodeList.append(Tmp.ToXml(Filename, 'Filename'))\r
e4ac870f 135 SupportArch = Filename.SupArchList\r
4234283c 136\r
421ccda3
HC
137 AsBuildList = BinaryFile.GetAsBuiltList()\r
138 PatchPcdValueList = AsBuildList.GetPatchPcdList()\r
139 PcdExList = AsBuildList.GetPcdExList()\r
140 LibGuidVerList = AsBuildList.GetLibraryInstancesList()\r
141 BuildFlagList = AsBuildList.GetBuildFlagsList()\r
142\r
143 AsBuiltNodeList = []\r
144\r
145 for Pcd in PatchPcdValueList:\r
146 if IsMatchArch(Pcd.SupArchList, SupportArch):\r
147 Tmp = PcdEntryXml()\r
148 AsBuiltNodeList.append(Tmp.ToXml4(Pcd, 'PatchPcdValue'))\r
149\r
150 for Pcd in PcdExList:\r
151 if IsMatchArch(Pcd.SupArchList, SupportArch):\r
152 Tmp = PcdEntryXml()\r
153 AsBuiltNodeList.append(Tmp.ToXml4(Pcd, 'PcdExValue'))\r
154\r
155 GuiVerElemList = []\r
156 for LibGuidVer in LibGuidVerList:\r
1f0a062f 157 if LibGuidVer.GetLibGuid() and IsMatchArch(LibGuidVer.GetSupArchList(), SupportArch):\r
4234283c
LG
158 GuiVerElem = \\r
159 CreateXmlElement('GUID', LibGuidVer.GetLibGuid(), [], [['Version', LibGuidVer.GetLibVersion()]])\r
160 GuiVerElemList.append(GuiVerElem)\r
421ccda3
HC
161 if len(GuiVerElemList) > 0:\r
162 LibGuidVerElem = CreateXmlElement('LibraryInstances', '', GuiVerElemList, [])\r
163 AsBuiltNodeList.append(LibGuidVerElem)\r
4234283c 164\r
421ccda3
HC
165 for BuildFlag in BuildFlagList:\r
166 if IsMatchArch(BuildFlag.GetSupArchList(), SupportArch):\r
167 for Item in BuildFlag.GetAsBuildList():\r
168 Tmp = BuildFlagXml()\r
169 Elem = CreateXmlElement('BuildFlags', ''.join(Item), [], [])\r
170 AsBuiltNodeList.append(Elem)\r
4234283c 171\r
421ccda3
HC
172 if len(AsBuiltNodeList) > 0:\r
173 Element = CreateXmlElement('AsBuilt', '', AsBuiltNodeList, [])\r
174 NodeList.append(Element)\r
4234283c
LG
175\r
176 Root = CreateXmlElement('%s' % Key, '', NodeList, [])\r
177\r
178 return Root\r
179\r
180 def __str__(self):\r
181 Str = "BinaryFiles:"\r
182 for Item in self.FileNames:\r
183 Str = Str + '\n\t' + str(Item)\r
184 for Item in self.PatchPcdValues:\r
185 Str = Str + '\n\t' + str(Item)\r
186 for Item in self.PcdExValues:\r
187 Str = Str + '\n\t' + str(Item)\r
188 for Item in self.LibraryInstances:\r
189 Str = Str + '\n\t' + str(Item)\r
190 for Item in self.BuildFlags:\r
191 Str = Str + '\n\t' + str(Item)\r
192 return Str\r
193\r
194##\r
195# PackageXml\r
196#\r
197class PackageXml(object):\r
198 def __init__(self):\r
199 self.Description = ''\r
200 self.Guid = ''\r
201 self.Version = ''\r
202 self.CommonDefines = CommonDefinesXml()\r
203\r
204 def FromXml(self, Item, Key):\r
205 self.Description = XmlElement(Item, '%s/Description' % Key)\r
206 self.Guid = XmlElement(Item, '%s/GUID' % Key)\r
207 self.Version = XmlAttribute(XmlNode(Item, '%s/GUID' % Key), 'Version')\r
208 self.CommonDefines.FromXml(XmlNode(Item, '%s' % Key), Key)\r
209\r
210 PackageDependency = PackageDependencyObject()\r
211 PackageDependency.SetPackage(self.Description)\r
212 PackageDependency.SetGuid(self.Guid)\r
213 PackageDependency.SetVersion(self.Version)\r
214 PackageDependency.SetFeatureFlag(ConvertNOTEQToNE(self.CommonDefines.FeatureFlag))\r
215 PackageDependency.SetSupArchList(self.CommonDefines.SupArchList)\r
216\r
217 return PackageDependency\r
218\r
219 def ToXml(self, PackageDependency, Key):\r
220 if self.Guid:\r
221 pass\r
222 AttributeList = [['SupArchList', GetStringOfList(PackageDependency.GetSupArchList())],\r
223 ['FeatureFlag', ConvertNEToNOTEQ(PackageDependency.GetFeatureFlag())], ]\r
224 Element1 = CreateXmlElement('GUID', PackageDependency.GetGuid(), [],\r
225 [['Version', PackageDependency.GetVersion()]])\r
226 NodeList = [['Description', PackageDependency.GetPackage()], Element1, ]\r
227 Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
228\r
229 return Root\r
230\r
231 def __str__(self):\r
232 Str = "Description = %s Guid = %s Version = %s %s" \\r
233 % (self.Description, self.Guid, self.Version, self.CommonDefines)\r
234 return Str\r
235##\r
236# ExternXml\r
237#\r
238class ExternXml(object):\r
239 def __init__(self):\r
240 self.CommonDefines = CommonDefinesXml()\r
241 self.EntryPoint = ''\r
242 self.UnloadImage = ''\r
243 self.Constructor = ''\r
244 self.Destructor = ''\r
245 self.SupModList = ''\r
246 self.SupArchList = ''\r
247 self.HelpText = []\r
248\r
249 def FromXml(self, Item, Key):\r
250 self.CommonDefines.FromXml(Item, Key)\r
251 self.EntryPoint = XmlElement(Item, '%s/EntryPoint' % Key)\r
252 self.UnloadImage = XmlElement(Item, '%s/UnloadImage' % Key)\r
253 self.Constructor = XmlElement(Item, '%s/Constructor' % Key)\r
254 self.Destructor = XmlElement(Item, '%s/Destructor' % Key)\r
255\r
256 Extern = ExternObject()\r
257 Extern.SetEntryPoint(self.EntryPoint)\r
258 Extern.SetUnloadImage(self.UnloadImage)\r
259 Extern.SetConstructor(self.Constructor)\r
260 Extern.SetDestructor(self.Destructor)\r
261 if self.CommonDefines.SupModList:\r
262 Extern.SetSupModList(self.CommonDefines.SupModList)\r
263 if self.CommonDefines.SupArchList:\r
264 Extern.SetSupArchList(self.CommonDefines.SupArchList)\r
265 return Extern\r
266\r
267 def ToXml(self, Extern, Key):\r
268 if self.HelpText:\r
269 pass\r
270\r
271 NodeList = []\r
272 if Extern.GetEntryPoint():\r
273 NodeList.append(['EntryPoint', Extern.GetEntryPoint()])\r
274 if Extern.GetUnloadImage():\r
275 NodeList.append(['UnloadImage', Extern.GetUnloadImage()])\r
276 if Extern.GetConstructor():\r
277 NodeList.append(['Constructor', Extern.GetConstructor()])\r
278 if Extern.GetDestructor():\r
279 NodeList.append(['Destructor', Extern.GetDestructor()])\r
280 Root = CreateXmlElement('%s' % Key, '', NodeList, [])\r
281\r
282 return Root\r
283\r
284 def __str__(self):\r
285 Str = "EntryPoint = %s UnloadImage = %s Constructor = %s Destructor = %s %s" \\r
286 % (self.EntryPoint, self.UnloadImage, self.Constructor, self.Destructor, self.CommonDefines)\r
287 for Item in self.HelpText:\r
288 Str = Str + '\n\t' + str(Item)\r
289 return Str\r
421ccda3 290##\r
4234283c
LG
291# DepexXml\r
292#\r
293class DepexXml(object):\r
294 def __init__(self):\r
295 self.CommonDefines = CommonDefinesXml()\r
296 self.Expression = None\r
297 self.HelpText = []\r
298\r
299 def FromXml(self, Item, Key):\r
300 if not Item:\r
301 return None\r
302 self.CommonDefines.FromXml(Item, Key)\r
303 self.Expression = XmlElement(Item, '%s/Expression' % Key)\r
304 for HelpTextItem in XmlList(Item, '%s/HelpText' % Key):\r
305 HelpTextObj = HelpTextXml()\r
306 HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)\r
307 self.HelpText.append(HelpTextObj)\r
308\r
309 Depex = DepexObject()\r
310 Depex.SetDepex(self.Expression)\r
311 Depex.SetModuleType(self.CommonDefines.SupModList)\r
312 Depex.SetSupArchList(self.CommonDefines.SupArchList)\r
313 Depex.SetFeatureFlag(self.CommonDefines.FeatureFlag)\r
314 Depex.SetHelpTextList(GetHelpTextList(self.HelpText))\r
315\r
316 return Depex\r
317\r
318 def ToXml(self, Depex, Key):\r
319 if self.HelpText:\r
320 pass\r
321 AttributeList = [['SupArchList', GetStringOfList(Depex.GetSupArchList())],\r
322 ['SupModList', Depex.GetModuleType()]]\r
323 NodeList = [['Expression', Depex.GetDepex()]]\r
324 if Depex.GetHelpText():\r
325 Tmp = HelpTextXml()\r
326 NodeList.append(Tmp.ToXml(Depex.GetHelpText(), 'HelpText'))\r
327\r
328 Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
329 return Root\r
330\r
331 def __str__(self):\r
332 Str = "Expression = %s" % (self.Expression)\r
333 for Item in self.HelpText:\r
334 Str = Str + '\n\t' + str(Item)\r
335 return Str\r
336\r
337##\r
338# BootModeXml\r
339#\r
340class BootModeXml(object):\r
341 def __init__(self):\r
342 self.SupportedBootModes = ''\r
343 self.CommonDefines = CommonDefinesXml()\r
344 self.HelpText = []\r
345\r
346 def FromXml(self, Item, Key):\r
347 self.SupportedBootModes = \\r
348 XmlElement(Item, '%s/SupportedBootModes' % Key)\r
349 self.CommonDefines.FromXml(Item, Key)\r
350 for HelpTextItem in XmlList(Item, '%s/HelpText' % Key):\r
351 HelpTextObj = HelpTextXml()\r
352 HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)\r
353 self.HelpText.append(HelpTextObj)\r
354\r
355 BootMode = BootModeObject()\r
356 BootMode.SetSupportedBootModes(self.SupportedBootModes)\r
357 BootMode.SetUsage(self.CommonDefines.Usage)\r
358 BootMode.SetHelpTextList(GetHelpTextList(self.HelpText))\r
359\r
360 return BootMode\r
361\r
362 def ToXml(self, BootMode, Key):\r
363 if self.HelpText:\r
364 pass\r
365 AttributeList = [['Usage', BootMode.GetUsage()], ]\r
366 NodeList = [['SupportedBootModes', BootMode.GetSupportedBootModes()]]\r
367 for Item in BootMode.GetHelpTextList():\r
368 Tmp = HelpTextXml()\r
369 NodeList.append(Tmp.ToXml(Item, 'HelpText'))\r
370 Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
371\r
372 return Root\r
373\r
374 def __str__(self):\r
375 Str = "SupportedBootModes = %s %s" % (self.SupportedBootModes, self.CommonDefines)\r
376 for Item in self.HelpText:\r
377 Str = Str + '\n\t' + str(Item)\r
378 return Str\r
379##\r
380# EventXml\r
381#\r
382class EventXml(object):\r
383 def __init__(self):\r
384 self.EventType = ''\r
385 self.Name = ''\r
386 self.CommonDefines = CommonDefinesXml()\r
387 self.HelpText = []\r
388\r
389 def FromXml(self, Item, Key):\r
390 self.EventType = XmlAttribute(XmlNode(Item, '%s' % Key), 'EventType')\r
391 self.Name = XmlElement(Item, '%s' % Key)\r
392 self.CommonDefines.FromXml(Item, Key)\r
393 for HelpTextItem in XmlList(Item, '%s/HelpText' % Key):\r
394 HelpTextObj = HelpTextXml()\r
395 HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)\r
396 self.HelpText.append(HelpTextObj)\r
397\r
398 Event = EventObject()\r
399 Event.SetEventType(self.EventType)\r
400 Event.SetUsage(self.CommonDefines.Usage)\r
401 Event.SetHelpTextList(GetHelpTextList(self.HelpText))\r
402\r
403 return Event\r
404\r
405 def ToXml(self, Event, Key):\r
406 if self.HelpText:\r
407 pass\r
408 AttributeList = [['EventType', Event.GetEventType()],\r
409 ['Usage', Event.GetUsage()],\r
410 ]\r
411 NodeList = []\r
412 for Item in Event.GetHelpTextList():\r
413 Tmp = HelpTextXml()\r
414 NodeList.append(Tmp.ToXml(Item, 'HelpText'))\r
415 Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
416\r
417 return Root\r
418\r
419 def __str__(self):\r
420 Str = "EventType = %s %s" % (self.EventType, self.CommonDefines)\r
421 for Item in self.HelpText:\r
422 Str = Str + '\n\t' + str(Item)\r
423 return Str\r
424##\r
425# HobXml\r
426#\r
427class HobXml(object):\r
428 def __init__(self):\r
429 self.HobType = ''\r
430 self.Name = ''\r
431 self.CommonDefines = CommonDefinesXml()\r
432 self.HelpText = []\r
433\r
434 def FromXml(self, Item, Key):\r
435 self.HobType = XmlAttribute(XmlNode(Item, '%s' % Key), 'HobType')\r
436 self.Name = XmlElement(Item, '%s' % Key)\r
437 self.CommonDefines.FromXml(Item, Key)\r
438 for HelpTextItem in XmlList(Item, '%s/HelpText' % Key):\r
439 HelpTextObj = HelpTextXml()\r
440 HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)\r
441 self.HelpText.append(HelpTextObj)\r
442\r
443 Hob = HobObject()\r
444 Hob.SetHobType(self.HobType)\r
445 Hob.SetSupArchList(self.CommonDefines.SupArchList)\r
446 Hob.SetUsage(self.CommonDefines.Usage)\r
447 Hob.SetHelpTextList(GetHelpTextList(self.HelpText))\r
448\r
449 return Hob\r
450\r
451 def ToXml(self, Hob, Key):\r
452 if self.Name:\r
453 pass\r
454 AttributeList = [['HobType', Hob.GetHobType()],\r
455 ['Usage', Hob.GetUsage()],\r
456 ['SupArchList', GetStringOfList(Hob.GetSupArchList())], ]\r
457 NodeList = []\r
458 for Item in Hob.GetHelpTextList():\r
459 Tmp = HelpTextXml()\r
460 NodeList.append(Tmp.ToXml(Item, 'HelpText'))\r
461 Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
462\r
463 return Root\r
464\r
465 def __str__(self):\r
466 Str = "HobType = %s %s" % (self.HobType, self.CommonDefines)\r
467 for Item in self.HelpText:\r
468 Str = Str + '\n\t' + str(Item)\r
469 return Str\r
470\r
471##\r
472# SourceFileXml\r
473#\r
474class SourceFileXml(object):\r
475 def __init__(self):\r
476 self.SourceFile = ''\r
477 self.ToolChainFamily = ''\r
478 self.FileType = ''\r
479 self.CommonDefines = CommonDefinesXml()\r
480\r
481 def FromXml(self, Item, Key):\r
482 self.ToolChainFamily = XmlAttribute(Item, 'Family')\r
483 self.SourceFile = XmlElement(Item, 'Filename')\r
484 self.CommonDefines.FromXml(Item, Key)\r
485\r
486 self.CommonDefines.FeatureFlag = ConvertNOTEQToNE(self.CommonDefines.FeatureFlag)\r
487\r
488 SourceFile = SourceFileObject()\r
489 SourceFile.SetSourceFile(self.SourceFile)\r
490 SourceFile.SetFamily(self.ToolChainFamily)\r
491 SourceFile.SetSupArchList(self.CommonDefines.SupArchList)\r
492 SourceFile.SetFeatureFlag(self.CommonDefines.FeatureFlag)\r
493\r
494 return SourceFile\r
495\r
496 def ToXml(self, SourceFile, Key):\r
497 if self.SourceFile:\r
498 pass\r
499 FeatureFlag = ConvertNEToNOTEQ(SourceFile.GetFeatureFlag())\r
500 AttributeList = [['SupArchList', GetStringOfList(SourceFile.GetSupArchList())],\r
501 ['Family', SourceFile.GetFamily()],\r
502 ['FeatureFlag', FeatureFlag], ]\r
503 Root = CreateXmlElement('%s' % Key, SourceFile.GetSourceFile(), [], AttributeList)\r
504 return Root\r
505\r
506##\r
507# ModulePropertyXml\r
508#\r
509class ModulePropertyXml(object):\r
510 def __init__(self):\r
511 self.CommonDefines = CommonDefinesXml()\r
512 self.ModuleType = ''\r
513 self.Path = ''\r
514 self.PcdIsDriver = ''\r
515 self.UefiSpecificationVersion = ''\r
516 self.PiSpecificationVersion = ''\r
517 self.SpecificationList = []\r
518 self.SpecificationVersion = ''\r
519 self.BootModes = []\r
520 self.Events = []\r
521 self.HOBs = []\r
522\r
523 def FromXml(self, Item, Key, Header=None):\r
524 self.CommonDefines.FromXml(Item, Key)\r
525 self.ModuleType = XmlElement(Item, '%s/ModuleType' % Key)\r
526 self.Path = XmlElement(Item, '%s/Path' % Key)\r
527 self.PcdIsDriver = XmlElement(Item, '%s/PcdIsDriver' % Key)\r
528 self.UefiSpecificationVersion = XmlElement(Item, '%s/UefiSpecificationVersion' % Key)\r
529 self.PiSpecificationVersion = XmlElement(Item, '%s/PiSpecificationVersion' % Key)\r
530 for SubItem in XmlList(Item, '%s/Specification' % Key):\r
531 Specification = XmlElement(SubItem, '/Specification')\r
532 Version = XmlAttribute(XmlNode(SubItem, '/Specification'), 'Version')\r
533 self.SpecificationList.append((Specification, Version))\r
534 for SubItem in XmlList(Item, '%s/BootMode' % Key):\r
535 Axml = BootModeXml()\r
536 BootMode = Axml.FromXml(SubItem, 'BootMode')\r
537 self.BootModes.append(BootMode)\r
538 for SubItem in XmlList(Item, '%s/Event' % Key):\r
539 Axml = EventXml()\r
540 Event = Axml.FromXml(SubItem, 'Event')\r
541 self.Events.append(Event)\r
542 for SubItem in XmlList(Item, '%s/HOB' % Key):\r
543 Axml = HobXml()\r
544 Hob = Axml.FromXml(SubItem, 'HOB')\r
545 self.HOBs.append(Hob)\r
546\r
4231a819 547 if Header is None:\r
4234283c
LG
548 Header = ModuleObject()\r
549\r
550 Header.SetModuleType(self.ModuleType)\r
551 Header.SetSupArchList(self.CommonDefines.SupArchList)\r
552 Header.SetModulePath(self.Path)\r
553\r
554 Header.SetPcdIsDriver(self.PcdIsDriver)\r
555 Header.SetUefiSpecificationVersion(self.UefiSpecificationVersion)\r
556 Header.SetPiSpecificationVersion(self.PiSpecificationVersion)\r
557 Header.SetSpecList(self.SpecificationList)\r
558\r
559 return Header, self.BootModes, self.Events, self.HOBs\r
560\r
561\r
562 def ToXml(self, Header, BootModes, Events, Hobs, Key):\r
563 if self.ModuleType:\r
564 pass\r
565 AttributeList = [['SupArchList', GetStringOfList(Header.GetSupArchList())], ]\r
566\r
567 NodeList = [['ModuleType', Header.GetModuleType()],\r
568 ['Path', Header.GetModulePath()],\r
569 ['PcdIsDriver', Header.GetPcdIsDriver()],\r
570 ['UefiSpecificationVersion', Header.GetUefiSpecificationVersion()],\r
571 ['PiSpecificationVersion', Header.GetPiSpecificationVersion()],\r
572 ]\r
573 for Item in Header.GetSpecList():\r
574 Spec, Version = Item\r
575 SpecElem = CreateXmlElement('Specification', Spec, [], [['Version', Version]])\r
576 NodeList.append(SpecElem)\r
577\r
578 for Item in BootModes:\r
579 Tmp = BootModeXml()\r
580 NodeList.append(Tmp.ToXml(Item, 'BootMode'))\r
581 for Item in Events:\r
582 Tmp = EventXml()\r
583 NodeList.append(Tmp.ToXml(Item, 'Event'))\r
584 for Item in Hobs:\r
585 Tmp = HobXml()\r
586 NodeList.append(Tmp.ToXml(Item, 'HOB'))\r
587 Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
588\r
589 return Root\r
590\r
591 def __str__(self):\r
592 Str = "ModuleType = %s Path = %s PcdIsDriver = %s UefiSpecificationVersion = %s PiSpecificationVersion = %s \\r
593 Specification = %s SpecificationVersion = %s %s" % \\r
594 (self.ModuleType, self.Path, self.PcdIsDriver, \\r
595 self.UefiSpecificationVersion, self.PiSpecificationVersion, \\r
596 self.SpecificationList, self.SpecificationVersion, self.CommonDefines)\r
597 for Item in self.BootModes:\r
598 Str = Str + '\n\t' + str(Item)\r
599 for Item in self.Events:\r
600 Str = Str + '\n\t' + str(Item)\r
601 for Item in self.HOBs:\r
602 Str = Str + '\n\t' + str(Item)\r
603 return Str\r
604\r
605##\r
606# ModuleXml\r
607#\r
608class ModuleSurfaceAreaXml(object):\r
609 def __init__(self, Package=''):\r
610 self.Module = None\r
611 #\r
612 # indicate the package that this module resides in\r
613 #\r
614 self.Package = Package\r
615\r
616 def FromXml2(self, Item, Module):\r
617 if self.Module:\r
618 pass\r
619 #\r
620 # PeiDepex\r
621 #\r
622 PeiDepexList = []\r
623 for SubItem in XmlList(Item, '/ModuleSurfaceArea/PeiDepex'):\r
624 Tmp = DepexXml()\r
625 Depex = Tmp.FromXml(XmlNode(SubItem, 'PeiDepex'), 'PeiDepex')\r
626 PeiDepexList.append(Depex)\r
627 Module.SetPeiDepex(PeiDepexList)\r
628\r
629 #\r
630 # DxeDepex\r
631 #\r
632 DxeDepexList = []\r
633 for SubItem in XmlList(Item, '/ModuleSurfaceArea/DxeDepex'):\r
634 Tmp = DepexXml()\r
635 Depex = Tmp.FromXml(XmlNode(SubItem, 'DxeDepex'), 'DxeDepex')\r
636 DxeDepexList.append(Depex)\r
637 Module.SetDxeDepex(DxeDepexList)\r
638\r
639 #\r
640 # SmmDepex\r
641 #\r
642 SmmDepexList = []\r
643 for SubItem in XmlList(Item, '/ModuleSurfaceArea/SmmDepex'):\r
644 Tmp = DepexXml()\r
645 Depex = Tmp.FromXml(XmlNode(SubItem, 'SmmDepex'), 'SmmDepex')\r
646 SmmDepexList.append(Depex)\r
647 Module.SetSmmDepex(SmmDepexList)\r
648\r
649 #\r
650 # MiscellaneousFile\r
651 Tmp = MiscellaneousFileXml()\r
652 MiscFileList = Tmp.FromXml(XmlNode(Item, '/ModuleSurfaceArea/MiscellaneousFiles'), 'MiscellaneousFiles')\r
653 if MiscFileList:\r
654 Module.SetMiscFileList([MiscFileList])\r
655 else:\r
656 Module.SetMiscFileList([])\r
657\r
421ccda3 658 #\r
4234283c
LG
659 # UserExtensions\r
660 #\r
661 for Item in XmlList(Item, '/ModuleSurfaceArea/UserExtensions'):\r
662 Tmp = UserExtensionsXml()\r
663 UserExtension = Tmp.FromXml(Item, 'UserExtensions')\r
664 Module.SetUserExtensionList(Module.GetUserExtensionList() + [UserExtension])\r
665\r
666 return Module\r
667\r
668 def FromXml(self, Item, Key, IsStandAlongModule=False):\r
669 IsBinaryModule = XmlAttribute(Item, 'BinaryModule')\r
670 #\r
671 # Header\r
672 #\r
673 Tmp = HeaderXml()\r
674 Module = Tmp.FromXml(XmlNode(Item, '/%s/Header' % Key), 'Header', True, IsStandAlongModule)\r
675 Module.SetBinaryModule(IsBinaryModule)\r
676\r
677 if IsBinaryModule:\r
678 GlobalData.gIS_BINARY_INF = True\r
679\r
680 #\r
681 # ModuleProperties\r
682 #\r
683 Tmp = ModulePropertyXml()\r
684 (Module, BootModes, Events, HOBs) = \\r
685 Tmp.FromXml(XmlNode(Item, '/ModuleSurfaceArea/ModuleProperties'), 'ModuleProperties', Module)\r
686 Module.SetBootModeList(BootModes)\r
687 Module.SetEventList(Events)\r
688 Module.SetHobList(HOBs)\r
689 #\r
690 # ClonedFrom\r
691 #\r
692 Tmp = ClonedFromXml()\r
693 ClonedFrom = Tmp.FromXml(XmlNode(Item, '/ModuleSurfaceArea/ClonedFrom'), 'ClonedFrom')\r
694 if ClonedFrom:\r
695 Module.SetClonedFrom(ClonedFrom)\r
696\r
697 #\r
698 # LibraryClass\r
699 #\r
700 for SubItem in XmlList(Item, '/ModuleSurfaceArea/LibraryClassDefinitions/LibraryClass'):\r
701 Tmp = LibraryClassXml()\r
702 LibraryClass = Tmp.FromXml(SubItem, 'LibraryClass')\r
703 Module.SetLibraryClassList(Module.GetLibraryClassList() + [LibraryClass])\r
704\r
705 if XmlList(Item, '/ModuleSurfaceArea/LibraryClassDefinitions') and \\r
706 not XmlList(Item, '/ModuleSurfaceArea/LibraryClassDefinitions/LibraryClass'):\r
707 Module.SetLibraryClassList([None])\r
708\r
709 #\r
710 # SourceFiles\r
711 #\r
712 for SubItem in XmlList(Item, '/ModuleSurfaceArea/SourceFiles/Filename'):\r
713 Tmp = SourceFileXml()\r
714 SourceFile = Tmp.FromXml(SubItem, 'Filename')\r
715 Module.SetSourceFileList(Module.GetSourceFileList() + [SourceFile])\r
716\r
717 if XmlList(Item, '/ModuleSurfaceArea/SourceFiles') and \\r
718 not XmlList(Item, '/ModuleSurfaceArea/SourceFiles/Filename') :\r
719 Module.SetSourceFileList([None])\r
720\r
721 #\r
722 # BinaryFile\r
723 #\r
724 for SubItem in XmlList(Item, '/ModuleSurfaceArea/BinaryFiles/BinaryFile'):\r
725 Tmp = BinaryFileXml()\r
726 BinaryFile = Tmp.FromXml(SubItem, 'BinaryFile')\r
727 Module.SetBinaryFileList(Module.GetBinaryFileList() + [BinaryFile])\r
728\r
729 if XmlList(Item, '/ModuleSurfaceArea/BinaryFiles') and \\r
730 not XmlList(Item, '/ModuleSurfaceArea/BinaryFiles/BinaryFile') :\r
731 Module.SetBinaryFileList([None])\r
732 #\r
733 # PackageDependencies\r
734 #\r
735 for SubItem in XmlList(Item, '/ModuleSurfaceArea/PackageDependencies/Package'):\r
736 Tmp = PackageXml()\r
737 PackageDependency = Tmp.FromXml(SubItem, 'Package')\r
738 Module.SetPackageDependencyList(Module.GetPackageDependencyList() + [PackageDependency])\r
739\r
740 if XmlList(Item, '/ModuleSurfaceArea/PackageDependencies') and \\r
741 not XmlList(Item, '/ModuleSurfaceArea/PackageDependencies/Package'):\r
742 Module.SetPackageDependencyList([None])\r
743\r
421ccda3 744 #\r
4234283c
LG
745 # Guid\r
746 #\r
747 for SubItem in XmlList(Item, '/ModuleSurfaceArea/Guids/GuidCName'):\r
748 Tmp = GuidXml('Module')\r
749 GuidProtocolPpi = Tmp.FromXml(SubItem, 'GuidCName')\r
750 Module.SetGuidList(Module.GetGuidList() + [GuidProtocolPpi])\r
751\r
752 if XmlList(Item, '/ModuleSurfaceArea/Guids') and not XmlList(Item, '/ModuleSurfaceArea/Guids/GuidCName'):\r
753 Module.SetGuidList([None])\r
754\r
755 #\r
756 # Protocol\r
757 #\r
758 for SubItem in XmlList(Item, '/ModuleSurfaceArea/Protocols/Protocol'):\r
759 Tmp = ProtocolXml('Module')\r
760 GuidProtocolPpi = Tmp.FromXml(SubItem, 'Protocol')\r
761 Module.SetProtocolList(Module.GetProtocolList() + [GuidProtocolPpi])\r
762\r
763 if XmlList(Item, '/ModuleSurfaceArea/Protocols') and not XmlList(Item, '/ModuleSurfaceArea/Protocols/Protocol'):\r
764 Module.SetProtocolList([None])\r
765\r
766 #\r
767 # Ppi\r
768 #\r
769 for SubItem in XmlList(Item, '/ModuleSurfaceArea/PPIs/Ppi'):\r
770 Tmp = PpiXml('Module')\r
771 GuidProtocolPpi = Tmp.FromXml(SubItem, 'Ppi')\r
772 Module.SetPpiList(Module.GetPpiList() + [GuidProtocolPpi])\r
773\r
774 if XmlList(Item, '/ModuleSurfaceArea/PPIs') and not XmlList(Item, '/ModuleSurfaceArea/PPIs/Ppi'):\r
775 Module.SetPpiList([None])\r
776\r
777 #\r
778 # Extern\r
779 #\r
780 for SubItem in XmlList(Item, '/ModuleSurfaceArea/Externs/Extern'):\r
781 Tmp = ExternXml()\r
782 Extern = Tmp.FromXml(SubItem, 'Extern')\r
783 Module.SetExternList(Module.GetExternList() + [Extern])\r
784\r
785 if XmlList(Item, '/ModuleSurfaceArea/Externs') and not XmlList(Item, '/ModuleSurfaceArea/Externs/Extern'):\r
786 Module.SetExternList([None])\r
787\r
788 if not Module.GetBinaryModule():\r
789 #\r
790 # PcdCoded\r
791 #\r
792 for SubItem in XmlList(Item, '/ModuleSurfaceArea/PcdCoded/PcdEntry'):\r
793 Tmp = PcdEntryXml()\r
794 PcdEntry = Tmp.FromXml3(SubItem, 'PcdEntry')\r
795 Module.SetPcdList(Module.GetPcdList() + [PcdEntry])\r
796\r
797 if XmlList(Item, '/ModuleSurfaceArea/PcdCoded') and \\r
798 not XmlList(Item, '/ModuleSurfaceArea/PcdCoded/PcdEntry'):\r
799 Module.SetPcdList([None])\r
800\r
801 Module = self.FromXml2(Item, Module)\r
802 #\r
803 # return the module object\r
804 #\r
805 self.Module = Module\r
806 return self.Module\r
807\r
808 def ToXml(self, Module):\r
809 if self.Package:\r
810 pass\r
811 #\r
812 # Create root node of module surface area\r
813 #\r
814 DomModule = minidom.Document().createElement('ModuleSurfaceArea')\r
815 if Module.GetBinaryModule():\r
816 DomModule.setAttribute('BinaryModule', 'true')\r
817\r
818 #\r
819 # Header\r
820 #\r
821 Tmp = HeaderXml()\r
822 DomModule.appendChild(Tmp.ToXml(Module, 'Header'))\r
823 #\r
824 # ModuleProperties\r
825 #\r
826 Tmp = ModulePropertyXml()\r
827 DomModule.appendChild(Tmp.ToXml(Module, Module.GetBootModeList(), Module.GetEventList(), Module.GetHobList(), \\r
828 'ModuleProperties'))\r
829 #\r
830 # ClonedFrom\r
831 #\r
832 Tmp = ClonedFromXml()\r
833 if Module.GetClonedFrom():\r
834 DomModule.appendChild(Tmp.ToXml(Module.GetClonedFrom(), 'ClonedFrom'))\r
835 #\r
836 # LibraryClass\r
837 #\r
838 LibraryClassNode = CreateXmlElement('LibraryClassDefinitions', '', [], [])\r
839 for LibraryClass in Module.GetLibraryClassList():\r
840 Tmp = LibraryClassXml()\r
841 LibraryClassNode.appendChild(Tmp.ToXml2(LibraryClass, 'LibraryClass'))\r
842 DomModule.appendChild(LibraryClassNode)\r
843 #\r
844 # SourceFile\r
845 #\r
846 SourceFileNode = CreateXmlElement('SourceFiles', '', [], [])\r
847 for SourceFile in Module.GetSourceFileList():\r
848 Tmp = SourceFileXml()\r
849 SourceFileNode.appendChild(Tmp.ToXml(SourceFile, 'Filename'))\r
850 DomModule.appendChild(SourceFileNode)\r
851 #\r
852 # BinaryFile\r
853 #\r
854 BinaryFileNode = CreateXmlElement('BinaryFiles', '', [], [])\r
855 for BinaryFile in Module.GetBinaryFileList():\r
856 Tmp = BinaryFileXml()\r
857 BinaryFileNode.appendChild(Tmp.ToXml(BinaryFile, 'BinaryFile'))\r
858 DomModule.appendChild(BinaryFileNode)\r
859 #\r
860 # PackageDependencies\r
861 #\r
862 PackageDependencyNode = CreateXmlElement('PackageDependencies', '', [], [])\r
863 for PackageDependency in Module.GetPackageDependencyList():\r
864 Tmp = PackageXml()\r
865 PackageDependencyNode.appendChild(Tmp.ToXml(PackageDependency, 'Package'))\r
866 DomModule.appendChild(PackageDependencyNode)\r
867\r
868 #\r
869 # Guid\r
870 #\r
871 GuidProtocolPpiNode = CreateXmlElement('Guids', '', [], [])\r
872 for GuidProtocolPpi in Module.GetGuidList():\r
873 Tmp = GuidXml('Module')\r
874 GuidProtocolPpiNode.appendChild(Tmp.ToXml(GuidProtocolPpi, 'GuidCName'))\r
875 DomModule.appendChild(GuidProtocolPpiNode)\r
876\r
877 #\r
878 # Protocol\r
879 #\r
880 GuidProtocolPpiNode = CreateXmlElement('Protocols', '', [], [])\r
881 for GuidProtocolPpi in Module.GetProtocolList():\r
882 Tmp = ProtocolXml('Module')\r
883 GuidProtocolPpiNode.appendChild(Tmp.ToXml(GuidProtocolPpi, 'Protocol'))\r
884 DomModule.appendChild(GuidProtocolPpiNode)\r
885\r
886 #\r
887 # Ppi\r
888 #\r
889 GuidProtocolPpiNode = CreateXmlElement('PPIs', '', [], [])\r
890 for GuidProtocolPpi in Module.GetPpiList():\r
891 Tmp = PpiXml('Module')\r
892 GuidProtocolPpiNode.appendChild(Tmp.ToXml(GuidProtocolPpi, 'Ppi'))\r
893 DomModule.appendChild(GuidProtocolPpiNode)\r
894 #\r
895 # Extern\r
896 #\r
897 ExternNode = CreateXmlElement('Externs', '', [], [])\r
898 for Extern in Module.GetExternList():\r
899 Tmp = ExternXml()\r
900 ExternNode.appendChild(Tmp.ToXml(Extern, 'Extern'))\r
901 DomModule.appendChild(ExternNode)\r
902 #\r
903 # PcdCoded\r
904 #\r
905 PcdEntryNode = CreateXmlElement('PcdCoded', '', [], [])\r
906 for PcdEntry in Module.GetPcdList():\r
907 Tmp = PcdEntryXml()\r
908 PcdEntryNode.appendChild(Tmp.ToXml3(PcdEntry, 'PcdEntry'))\r
909 DomModule.appendChild(PcdEntryNode)\r
910\r
911 #\r
912 # PeiDepex\r
913 #\r
914 if Module.GetPeiDepex():\r
915 for Item in Module.GetPeiDepex():\r
916 Tmp = DepexXml()\r
917 DomModule.appendChild(Tmp.ToXml(Item, 'PeiDepex'))\r
918\r
919 #\r
920 # DxeDepex\r
921 #\r
922 if Module.GetDxeDepex():\r
923 for Item in Module.GetDxeDepex():\r
924 Tmp = DepexXml()\r
925 DomModule.appendChild(Tmp.ToXml(Item, 'DxeDepex'))\r
926\r
927 #\r
928 # SmmDepex\r
929 #\r
930 if Module.GetSmmDepex():\r
931 for Item in Module.GetSmmDepex():\r
932 Tmp = DepexXml()\r
933 DomModule.appendChild(Tmp.ToXml(Item, 'SmmDepex'))\r
934\r
935 #\r
936 # MiscellaneousFile\r
937 #\r
938 if Module.GetMiscFileList():\r
939 Tmp = MiscellaneousFileXml()\r
940 DomModule.appendChild(Tmp.ToXml(Module.GetMiscFileList()[0], 'MiscellaneousFiles'))\r
941 #\r
942 # UserExtensions\r
943 #\r
944 if Module.GetUserExtensionList():\r
945 for UserExtension in Module.GetUserExtensionList():\r
946 Tmp = UserExtensionsXml()\r
947 DomModule.appendChild(Tmp.ToXml(UserExtension, 'UserExtensions'))\r
948\r
949 return DomModule\r
950\r
951##\r
952# BuildFlagXml used to generate BuildFlag for <AsBuilt>\r
953#\r
954class BuildFlagXml(object):\r
955 def __init__(self):\r
956 self.Target = ''\r
957 self.TagName = ''\r
958 self.Family = ''\r
959 self.AsBuiltFlags = ''\r
960\r
961 def FromXml(self, Item, Key):\r
962 self.Target = XmlElement(Item, '%s/Target' % Key)\r
963 self.TagName = XmlElement(Item, '%s/TagName' % Key)\r
964 self.Family = XmlElement(Item, '%s/Family' % Key)\r
965\r
966 BuildFlag = BinaryBuildFlagObject()\r
967\r
968 BuildFlag.SetTarget(self.Target)\r
969 BuildFlag.SetTagName(self.TagName)\r
970 BuildFlag.SetFamily(self.Family)\r
971\r
972 return BuildFlag\r
973\r
974 #\r
975 # For AsBuild INF usage\r
976 #\r
977 def FromXml2(self, Item, Key):\r
978 self.AsBuiltFlags = XmlElement(Item, '%s' % Key)\r
979\r
980 LineList = GetSplitValueList(self.AsBuiltFlags, '\n')\r
981 ReturnLine = ''\r
982 Count = 0\r
983 for Line in LineList:\r
984 if Count == 0:\r
985 ReturnLine = "# " + Line\r
986 else:\r
987 ReturnLine = ReturnLine + '\n' + '# ' + Line\r
988 Count += 1\r
989\r
990 BuildFlag = BinaryBuildFlagObject()\r
991 BuildFlag.SetAsBuiltOptionFlags(ReturnLine)\r
992\r
993 return BuildFlag\r
994\r
995 def ToXml(self, BuildFlag, Key):\r
996 if self.Target:\r
997 pass\r
998 AttributeList = []\r
999 NodeList = []\r
1000 NodeList.append(['BuildFlags', BuildFlag])\r
1001\r
1002 Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
1003 return Root\r