]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/Xml/XmlParser.py
BaseTools: Remove equality operator with None
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Xml / XmlParser.py
CommitLineData
4234283c
LG
1## @file\r
2# This file is used to parse a xml file of .PKG file\r
3#\r
421ccda3 4# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
4234283c
LG
5#\r
6# This program and the accompanying materials are licensed and made available \r
7# under the terms and conditions of the BSD License which accompanies this \r
8# distribution. The full text of the license may be found at \r
9# http://opensource.org/licenses/bsd-license.php\r
10#\r
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13#\r
14\r
15'''\r
16XmlParser\r
17'''\r
18\r
19##\r
20# Import Modules\r
21#\r
22import re\r
23\r
24from Library.Xml.XmlRoutines import XmlNode\r
25from Library.Xml.XmlRoutines import CreateXmlElement\r
26from Library.Xml.XmlRoutines import XmlList\r
27from Library.Xml.XmlRoutines import XmlParseFile\r
28from Core.DistributionPackageClass import DistributionPackageClass\r
29from Object.POM.ModuleObject import DepexObject\r
30from Library.ParserValidate import IsValidInfMoudleType\r
31from Library.ParserValidate import IsValidInstallPath\r
32from Library.Misc import IsEqualList\r
33from Library.Misc import Sdict\r
34\r
35from Logger.StringTable import ERR_XML_INVALID_VARIABLENAME\r
36from Logger.StringTable import ERR_XML_INVALID_LIB_SUPMODLIST\r
37from Logger.StringTable import ERR_XML_INVALID_EXTERN_SUPARCHLIST\r
38from Logger.StringTable import ERR_XML_INVALID_EXTERN_SUPMODLIST\r
39from Logger.StringTable import ERR_XML_INVALID_EXTERN_SUPMODLIST_NOT_LIB\r
40from Logger.StringTable import ERR_FILE_NAME_INVALIDE\r
4234283c
LG
41from Logger.ToolError import PARSER_ERROR\r
42from Logger.ToolError import FORMAT_INVALID\r
43\r
44from Xml.CommonXml import DistributionPackageHeaderXml\r
45from Xml.CommonXml import MiscellaneousFileXml\r
46from Xml.CommonXml import UserExtensionsXml\r
47from Xml.XmlParserMisc import ConvertVariableName\r
48from Xml.XmlParserMisc import IsRequiredItemListNull\r
49from Xml.ModuleSurfaceAreaXml import ModuleSurfaceAreaXml\r
50from Xml.PackageSurfaceAreaXml import PackageSurfaceAreaXml\r
51\r
52import Logger.Log as Logger\r
53\r
54##\r
55# DistributionPackageXml\r
56#\r
57class DistributionPackageXml(object):\r
58 def __init__(self):\r
59 self.DistP = DistributionPackageClass()\r
60 self.Pkg = ''\r
61\r
62 ## ValidateDistributionPackage\r
63 #\r
64 # Check if any required item is missing in DistributionPackage\r
65 #\r
66 def ValidateDistributionPackage(self):\r
67 XmlTreeLevel = ['DistributionPackage']\r
68 if self.DistP:\r
69 #\r
70 # Check DistributionPackage -> DistributionHeader\r
71 #\r
72 XmlTreeLevel = ['DistributionPackage', '']\r
73 CheckDict = {'DistributionHeader':self.DistP.Header }\r
74 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
75\r
76 if self.DistP.Header:\r
77 DpHeader = self.DistP.Header\r
78 XmlTreeLevel = ['DistributionPackage', 'DistributionHeader']\r
79 CheckDict = Sdict()\r
421ccda3
HC
80 if DpHeader.GetAbstract():\r
81 DPAbstract = DpHeader.GetAbstract()[0][1]\r
82 else:\r
83 DPAbstract = ''\r
84 if DpHeader.GetCopyright():\r
85 DPCopyright = DpHeader.GetCopyright()[0][1]\r
86 else:\r
87 DPCopyright = ''\r
88 if DpHeader.GetLicense():\r
89 DPLicense = DpHeader.GetLicense()[0][1]\r
90 else:\r
91 DPLicense = ''\r
92 \r
4234283c
LG
93 CheckDict['Name'] = DpHeader.GetName()\r
94 CheckDict['GUID'] = DpHeader.GetGuid()\r
95 CheckDict['Version'] = DpHeader.GetVersion()\r
421ccda3
HC
96 CheckDict['Copyright'] = DPCopyright\r
97 CheckDict['License'] = DPLicense\r
98 CheckDict['Abstract'] = DPAbstract\r
4234283c
LG
99 CheckDict['Vendor'] = DpHeader.GetVendor()\r
100 CheckDict['Date'] = DpHeader.GetDate()\r
101 CheckDict['XmlSpecification'] = DpHeader.GetXmlSpecification()\r
102\r
103 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
104 else:\r
105 XmlTreeLevel = ['DistributionPackage', 'DistributionHeader']\r
106 CheckDict = CheckDict = {'DistributionHeader':'', }\r
107 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
108\r
109 #\r
110 # Check Each Package\r
111 #\r
112 for Key in self.DistP.PackageSurfaceArea:\r
113 ValidatePackageSurfaceArea(self.DistP.PackageSurfaceArea[Key])\r
114\r
115 #\r
116 # Check Each Module\r
117 #\r
118 for Key in self.DistP.ModuleSurfaceArea:\r
119 ValidateMS(self.DistP.ModuleSurfaceArea[Key], ['DistributionPackage', 'ModuleSurfaceArea'])\r
120\r
121 #\r
122 # Check Each Tool \r
123 #\r
124 if self.DistP.Tools:\r
125 XmlTreeLevel = ['DistributionPackage', 'Tools', 'Header']\r
126 CheckDict = {'Name':self.DistP.Tools.GetName(), }\r
127 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
128\r
129 if not self.DistP.Tools.GetFileList():\r
130 XmlTreeLevel = ['DistributionPackage', 'Tools']\r
131 CheckDict = {'FileName':None, }\r
132 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
133 for Item in self.DistP.Tools.GetFileList():\r
134 XmlTreeLevel = ['DistributionPackage', 'Tools']\r
135 CheckDict = {'FileName':Item.GetURI(), }\r
136 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
137\r
138 #\r
139 # Check Each Misc File\r
140 #\r
141 if self.DistP.MiscellaneousFiles:\r
142 XmlTreeLevel = ['DistributionPackage', 'MiscellaneousFiles', 'Header']\r
143 CheckDict = {'Name':self.DistP.MiscellaneousFiles.GetName(), }\r
144 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
145\r
146 if not self.DistP.MiscellaneousFiles.GetFileList():\r
147 XmlTreeLevel = ['DistributionPackage', 'MiscellaneousFiles']\r
148 CheckDict = {'FileName':None, }\r
149 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
150 for Item in self.DistP.MiscellaneousFiles.GetFileList():\r
151 XmlTreeLevel = ['DistributionPackage', 'MiscellaneousFiles']\r
152 CheckDict = {'FileName':Item.GetURI(), }\r
153 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
154\r
155 #\r
156 # Check Each Distribution Level User Extension\r
157 #\r
158 for Item in self.DistP.UserExtensions:\r
159 XmlTreeLevel = ['DistributionPackage', 'UserExtensions']\r
160 CheckDict = {'UserId':Item.GetUserID(), }\r
161 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
162\r
163\r
164 def FromXml(self, Filename=None):\r
4231a819 165 if Filename is not None:\r
4234283c
LG
166 self.DistP = DistributionPackageClass()\r
167 #\r
168 # Load to XML\r
169 #\r
170 self.Pkg = XmlParseFile(Filename)\r
171\r
172 #\r
173 # Parse Header information\r
174 #\r
175 Tmp = DistributionPackageHeaderXml()\r
176 DistributionPackageHeader = \\r
177 Tmp.FromXml(XmlNode(self.Pkg, '/DistributionPackage/DistributionHeader'), 'DistributionHeader')\r
178 self.DistP.Header = DistributionPackageHeader\r
179 #\r
180 # Parse each PackageSurfaceArea\r
181 #\r
182 for Item in XmlList(self.Pkg, '/DistributionPackage/PackageSurfaceArea'):\r
183 Psa = PackageSurfaceAreaXml()\r
184 Package = Psa.FromXml(Item, 'PackageSurfaceArea')\r
185 self.DistP.PackageSurfaceArea[(Package.GetGuid(), \\r
186 Package.GetVersion(), \\r
187 Package.GetPackagePath())] = \\r
188 Package\r
189 #\r
190 # Parse each ModuleSurfaceArea\r
191 #\r
192 for Item in XmlList(self.Pkg, '/DistributionPackage/ModuleSurfaceArea'):\r
193 Msa = ModuleSurfaceAreaXml()\r
194 Module = Msa.FromXml(Item, 'ModuleSurfaceArea', True)\r
d0acc87a
LG
195 ModuleKey = (Module.GetGuid(), Module.GetVersion(), Module.GetName(), Module.GetModulePath())\r
196 self.DistP.ModuleSurfaceArea[ModuleKey] = Module\r
197\r
4234283c
LG
198 # \r
199 # Parse Tools\r
200 #\r
201 Tmp = MiscellaneousFileXml()\r
202 self.DistP.Tools = Tmp.FromXml2(XmlNode(self.Pkg, '/DistributionPackage/Tools'), 'Tools')\r
203\r
204 #\r
205 # Parse MiscFiles\r
206 #\r
207 Tmp = MiscellaneousFileXml()\r
208 self.DistP.MiscellaneousFiles = \\r
209 Tmp.FromXml2(XmlNode(self.Pkg, \\r
210 '/DistributionPackage/MiscellaneousFiles'), \\r
211 'MiscellaneousFiles')\r
212\r
213 #\r
214 # Parse UserExtensions\r
215 #\r
216 for Item in XmlList(self.Pkg, '/DistributionPackage/UserExtensions'):\r
217 Tmp = UserExtensionsXml()\r
218 self.DistP.UserExtensions.append(Tmp.FromXml2(Item, 'UserExtensions'))\r
219\r
220 #\r
221 # Check Required Items for XML\r
222 #\r
223 self.ValidateDistributionPackage()\r
224\r
225 return self.DistP\r
226\r
227 def ToXml(self, DistP):\r
228 if self.DistP:\r
229 pass\r
4231a819 230 if DistP is not None:\r
4234283c
LG
231 #\r
232 # Parse DistributionPackageHeader\r
233 #\r
234 Attrs = [['xmlns', 'http://www.uefi.org/2011/1.1'],\r
235 ['xmlns:xsi', 'http:/www.w3.org/2001/XMLSchema-instance'],\r
236 ]\r
237 Root = CreateXmlElement('DistributionPackage', '', [], Attrs)\r
238\r
239 Tmp = DistributionPackageHeaderXml()\r
240 Root.appendChild(Tmp.ToXml(DistP.Header, 'DistributionHeader'))\r
241 #\r
242 # Parse each PackageSurfaceArea\r
243 #\r
244 for Package in DistP.PackageSurfaceArea.values():\r
245 Psa = PackageSurfaceAreaXml()\r
246 DomPackage = Psa.ToXml(Package)\r
247 Root.appendChild(DomPackage)\r
248 #\r
249 # Parse each ModuleSurfaceArea\r
250 #\r
251 for Module in DistP.ModuleSurfaceArea.values():\r
252 Msa = ModuleSurfaceAreaXml()\r
253 DomModule = Msa.ToXml(Module)\r
254 Root.appendChild(DomModule)\r
255 # \r
256 # Parse Tools\r
257 #\r
258 Tmp = MiscellaneousFileXml()\r
259 ToolNode = Tmp.ToXml2(DistP.Tools, 'Tools')\r
260 if ToolNode is not None:\r
261 Root.appendChild(ToolNode)\r
262 #\r
263 # Parse MiscFiles\r
264 #\r
265 Tmp = MiscellaneousFileXml()\r
266 MiscFileNode = Tmp.ToXml2(DistP.MiscellaneousFiles,\r
267 'MiscellaneousFiles')\r
268 if MiscFileNode is not None:\r
269 Root.appendChild(MiscFileNode)\r
270\r
271 XmlContent = Root.toprettyxml(indent=' ')\r
272\r
273\r
274 #\r
275 # Remove empty element\r
276 #\r
277 XmlContent = re.sub(r'[\s\r\n]*<[^<>=]*/>', '', XmlContent)\r
278\r
279 #\r
280 # Remove empty help text element\r
281 #\r
282 XmlContent = re.sub(r'[\s\r\n]*<HelpText Lang="en-US"/>', '',\r
283 XmlContent)\r
284\r
285 #\r
286 # Remove SupArchList="COMMON" or "common"\r
287 #\r
288 XmlContent = \\r
289 re.sub(r'[\s\r\n]*SupArchList[\s\r\n]*=[\s\r\n]*"[\s\r\n]*COMMON'\r
290 '[\s\r\n]*"', '', XmlContent)\r
291 XmlContent = \\r
292 re.sub(r'[\s\r\n]*SupArchList[\s\r\n]*=[\s\r\n]*"[\s\r\n]*common'\r
293 '[\s\r\n]*"', '', XmlContent)\r
294 #\r
295 # Remove <SupArchList> COMMON </SupArchList>\r
296 #\r
297 XmlContent = \\r
298 re.sub(r'[\s\r\n]*<SupArchList>[\s\r\n]*COMMON[\s\r\n]*'\r
299 '</SupArchList>[\s\r\n]*', '', XmlContent)\r
300\r
301 #\r
302 # Remove <SupArchList> common </SupArchList>\r
303 #\r
304 XmlContent = \\r
305 re.sub(r'[\s\r\n]*<SupArchList>[\s\r\n]*'\r
306 'common[\s\r\n]*</SupArchList>[\s\r\n]*', '', XmlContent)\r
307\r
308 #\r
309 # Remove SupModList="COMMON" or "common"\r
310 # \r
311 XmlContent = \\r
312 re.sub(r'[\s\r\n]*SupModList[\s\r\n]*=[\s\r\n]*"[\s\r\n]*COMMON'\r
313 '[\s\r\n]*"', '', XmlContent)\r
314 XmlContent = \\r
315 re.sub(r'[\s\r\n]*SupModList[\s\r\n]*=[\s\r\n]*"[\s\r\n]*common'\r
316 '[\s\r\n]*"', '', XmlContent)\r
317\r
318 return XmlContent\r
319\r
320 return ''\r
321\r
322## ValidateMS\r
323#\r
324# Check if any required item is missing in ModuleSurfaceArea\r
325#\r
326# @param Module: The ModuleSurfaceArea to be checked\r
327# @param XmlTreeLevel: The top level of Module \r
328#\r
329def ValidateMS(Module, TopXmlTreeLevel):\r
330 ValidateMS1(Module, TopXmlTreeLevel)\r
331 ValidateMS2(Module, TopXmlTreeLevel)\r
332 ValidateMS3(Module, TopXmlTreeLevel)\r
333\r
334## ValidateMS1\r
335#\r
336# Check if any required item is missing in ModuleSurfaceArea\r
337#\r
338# @param Module: The ModuleSurfaceArea to be checked\r
339# @param XmlTreeLevel: The top level of Module \r
340#\r
341def ValidateMS1(Module, TopXmlTreeLevel):\r
342 #\r
343 # Check Guids -> GuidCName\r
344 #\r
345 XmlTreeLevel = TopXmlTreeLevel + ['Guids']\r
346 for Item in Module.GetGuidList():\r
4231a819 347 if Item is None:\r
4234283c
LG
348 CheckDict = {'GuidCName':''}\r
349 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
350\r
351 XmlTreeLevel = TopXmlTreeLevel + ['Guids', 'GuidCName']\r
352 for Item in Module.GetGuidList():\r
353 CheckDict = {'CName':Item.GetCName(),\r
354 'GuidType':Item.GetGuidTypeList(),\r
355 'Usage':Item.GetUsage()}\r
356 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
357\r
358 if Item.GetVariableName():\r
359 Result = ConvertVariableName(Item.GetVariableName())\r
360 if Result is None:\r
361 Msg = "->".join(Node for Node in XmlTreeLevel)\r
362 ErrorMsg = ERR_XML_INVALID_VARIABLENAME % (Item.GetVariableName(), Item.GetCName(), Msg)\r
363 Logger.Error('\nUPT', PARSER_ERROR, ErrorMsg, RaiseError=True)\r
364 else:\r
365 Item.SetVariableName(Result)\r
366\r
367 #\r
368 # Check Protocols -> Protocol\r
369 #\r
370 XmlTreeLevel = TopXmlTreeLevel + ['Protocols']\r
371 for Item in Module.GetProtocolList():\r
4231a819 372 if Item is None:\r
4234283c
LG
373 CheckDict = {'Protocol':''}\r
374 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
375\r
376 XmlTreeLevel = TopXmlTreeLevel + ['Protocols', 'Protocol']\r
377 for Item in Module.GetProtocolList():\r
378 CheckDict = {'CName':Item.GetCName(),\r
379 'Usage':Item.GetUsage()}\r
380 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
381\r
382 #\r
383 # Check PPIs -> Ppi\r
384 #\r
385 XmlTreeLevel = TopXmlTreeLevel + ['PPIs']\r
386 for Item in Module.GetPpiList():\r
4231a819 387 if Item is None:\r
4234283c
LG
388 CheckDict = {'Ppi':''}\r
389 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
390\r
391 XmlTreeLevel = TopXmlTreeLevel + ['PPIs', 'Ppi']\r
392 for Item in Module.GetPpiList():\r
393 CheckDict = {'CName':Item.GetCName(),\r
394 'Usage':Item.GetUsage()}\r
395 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
396\r
397 #\r
398 # Check PcdCoded -> Entry\r
399 #\r
400 XmlTreeLevel = TopXmlTreeLevel + ['PcdCoded']\r
401 for Item in Module.GetPcdList():\r
4231a819 402 if Item is None:\r
4234283c
LG
403 CheckDict = {'PcdEntry':''}\r
404 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
405\r
406 XmlTreeLevel = TopXmlTreeLevel + ['PcdCoded', 'PcdEntry']\r
407 for Item in Module.GetPcdList():\r
408 CheckDict = {'TokenSpaceGuidCname':Item.GetTokenSpaceGuidCName(),\r
409 'CName':Item.GetCName(),\r
410 'PcdUsage':Item.GetValidUsage(),\r
411 'PcdItemType':Item.GetItemType()}\r
412 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
413\r
414 #\r
415 # Check Externs -> Extern\r
416 #\r
417 XmlTreeLevel = TopXmlTreeLevel + ['Externs']\r
418 for Item in Module.GetExternList():\r
4231a819 419 if Item is None:\r
4234283c
LG
420 CheckDict = {'Extern':''}\r
421 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
422\r
423 #\r
424 # If SupArchList is used to identify different EntryPoint, UnloadImage, Constructor/Destructor elements and \r
425 # that SupArchList does not match ModuleSurfaceArea.ModuleProperties:SupArchList, the tool must exit gracefully,\r
426 # informing the user that the EDK II Build system does not support different EntryPoint, UnloadImage, \r
427 # Constructor or Destructor elements based on Architecture type. Two SupArchList attributes are considered \r
428 # identical if it lists the same CPU architectures in any order.\r
429 #\r
430 for Item in Module.GetExternList():\r
431 if len(Item.SupArchList) > 0:\r
432 if not IsEqualList(Item.SupArchList, Module.SupArchList):\r
433 Logger.Error('\nUPT',\r
434 PARSER_ERROR,\r
435 ERR_XML_INVALID_EXTERN_SUPARCHLIST % (str(Item.SupArchList), str(Module.SupArchList)),\r
436 RaiseError=True)\r
437\r
438 #\r
439 # Check DistributionPackage -> ModuleSurfaceArea -> UserExtensions\r
440 #\r
441 XmlTreeLevel = TopXmlTreeLevel + ['UserExtensions']\r
442 for Item in Module.GetUserExtensionList():\r
443 CheckDict = {'UserId':Item.GetUserID(), 'Identifier':Item.GetIdentifier()}\r
444 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
445\r
446 #\r
447 # Check DistributionPackage -> PackageSurfaceArea -> MiscellaneousFiles -> Filename\r
448 #\r
449 XmlTreeLevel = TopXmlTreeLevel + ['MiscellaneousFiles']\r
450 for Item in Module.GetMiscFileList():\r
451 if not Item.GetFileList():\r
452 CheckDict = {'Filename':'', }\r
453 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
454 for File in Item.GetFileList():\r
455 CheckDict = {'Filename':File.GetURI(), }\r
456\r
457## ValidateMS2\r
458#\r
459# Check if any required item is missing in ModuleSurfaceArea\r
460#\r
461# @param Module: The ModuleSurfaceArea to be checked\r
462# @param XmlTreeLevel: The top level of Module \r
463#\r
464def ValidateMS2(Module, TopXmlTreeLevel):\r
465 #\r
466 # Check Header\r
467 #\r
468 XmlTreeLevel = TopXmlTreeLevel + ['Header']\r
469 CheckDict = Sdict()\r
470 CheckDict['Name'] = Module.GetName()\r
471 CheckDict['BaseName'] = Module.GetBaseName()\r
472 CheckDict['GUID'] = Module.GetGuid()\r
473 CheckDict['Version'] = Module.GetVersion()\r
474 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
475\r
476 #\r
477 # Check ModuleProperties\r
478 #\r
479 XmlTreeLevel = TopXmlTreeLevel + ['ModuleProperties']\r
480 CheckDict = {'ModuleType':Module.GetModuleType(),\r
481 'Path':Module.GetModulePath()}\r
482 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
483\r
484 if not IsValidInstallPath(Module.GetModulePath()):\r
485 Logger.Error("UPT", FORMAT_INVALID, ERR_FILE_NAME_INVALIDE % Module.GetModulePath())\r
486\r
487 #\r
488 # Check ModuleProperties->BootMode \r
489 #\r
490 XmlTreeLevel = TopXmlTreeLevel + ['ModuleProperties'] + ['BootMode']\r
491 for Item in Module.GetBootModeList():\r
492 CheckDict = {'Usage':Item.GetUsage(),\r
493 'SupportedBootModes':Item.GetSupportedBootModes()}\r
494 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
495\r
496 #\r
497 # Check ModuleProperties->Event \r
498 #\r
499 XmlTreeLevel = TopXmlTreeLevel + ['ModuleProperties'] + ['Event']\r
500 for Item in Module.GetEventList():\r
501 CheckDict = {'Usage':Item.GetUsage(),\r
502 'EventType':Item.GetEventType()}\r
503 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
504\r
505 #\r
506 # Check ModuleProperties->Hob \r
507 #\r
508 XmlTreeLevel = TopXmlTreeLevel + ['ModuleProperties'] + ['HOB']\r
509 for Item in Module.GetHobList():\r
510 CheckDict = {'Usage':Item.GetUsage(),\r
511 'HobType':Item.GetHobType()}\r
512 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
513\r
514 #\r
515 # The UDP Specification supports the module type of UEFI_RUNTIME_DRIVER, which is not present in the EDK II INF \r
516 # File Specification v. 1.23, so UPT must perform the following translation that include the generation of a \r
517 # [Depex] section.\r
518 #\r
519 if Module.ModuleType == "UEFI_RUNTIME_DRIVER":\r
520 Module.ModuleType = "DXE_RUNTIME_DRIVER"\r
521 DxeObj = DepexObject()\r
522 DxeObj.SetDepex("gEfiBdsArchProtocolGuid AND \ngEfiCpuArchProtocolGuid AND\n" + \\r
523 "gEfiMetronomeArchProtocolGuid AND \ngEfiMonotonicCounterArchProtocolGuid AND\n" + \\r
524 "gEfiRealTimeClockArchProtocolGuid AND \ngEfiResetArchProtocolGuid AND\n" + \\r
525 "gEfiRuntimeArchProtocolGuid AND \ngEfiSecurityArchProtocolGuid AND\n" + \\r
526 "gEfiTimerArchProtocolGuid AND \ngEfiVariableWriteArchProtocolGuid AND\n" + \\r
527 "gEfiVariableArchProtocolGuid AND \ngEfiWatchdogTimerArchProtocolGuid")\r
528 DxeObj.SetModuleType(['DXE_RUNTIME_DRIVER'])\r
529 Module.PeiDepex = []\r
530 Module.DxeDepex = []\r
531 Module.SmmDepex = []\r
532 Module.DxeDepex.append(DxeObj)\r
533\r
534 #\r
535 # Check LibraryClassDefinitions -> LibraryClass\r
536 #\r
537 XmlTreeLevel = TopXmlTreeLevel + ['LibraryClassDefinitions']\r
538 for Item in Module.GetLibraryClassList():\r
4231a819 539 if Item is None:\r
4234283c
LG
540 CheckDict = {'LibraryClass':''}\r
541 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
542\r
543 XmlTreeLevel = TopXmlTreeLevel + ['LibraryClassDefinitions', 'LibraryClass']\r
544\r
545 IsLibraryModule = False\r
546 LibrarySupModList = []\r
547 for Item in Module.GetLibraryClassList():\r
548 CheckDict = {'Keyword':Item.GetLibraryClass(),\r
549 'Usage':Item.GetUsage()}\r
550 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
551 #\r
552 # If the LibraryClass:SupModList is not "UNDEFINED" the LIBRARY_CLASS entry must have the list \r
553 # appended using the format:\r
554 # LIBRARY_CLASS = <ClassName> ["|" <Edk2ModuleTypeList>]\r
555 #\r
556 # Edk2ModuleTypeList ::= <ModuleType> [" " <ModuleType>]{0,}\r
557 # <ModuleTypes> ::= {"BASE"} {"SEC"} {"PEI_CORE"} {"PEIM"}\r
558 # {"DXE_CORE"} {"DXE_DRIVER"} {"SMM_CORE"}\r
559 # {"DXE_SMM_DRIVER"} {"DXE_RUNTIME_DRIVER"}\r
560 # {"DXE_SAL_DRIVER"} {"UEFI_DRIVER"}\r
561 # {"UEFI_APPLICATION"} {"USER_DEFINED"}\r
562 #\r
563 if len(Item.SupModuleList) > 0:\r
564 for SupModule in Item.SupModuleList:\r
565 if not IsValidInfMoudleType(SupModule):\r
566 Logger.Error('\nUPT',\r
567 PARSER_ERROR,\r
568 ERR_XML_INVALID_LIB_SUPMODLIST % (Item.LibraryClass, str(SupModule)),\r
569 RaiseError=True)\r
570\r
571 if Item.Usage == 'PRODUCES' or Item.Usage == 'SOMETIMES_PRODUCES':\r
572 IsLibraryModule = True\r
573 LibrarySupModList = Item.SupModuleList\r
574\r
575\r
576 #\r
577 # For Library modules (indicated by a LIBRARY_CLASS statement in the [Defines] section) \r
578 # If the SupModList attribute of the CONSTRUCTOR or DESTRUCTOR element does not match the Supported Module \r
579 # Types listed after "LIBRARY_CLASS = <Keyword> |", the tool should gracefully exit with an error message \r
580 # stating that there is a conflict in the module types the CONSTRUCTOR/DESTRUCTOR is to be used with and \r
581 # the Module types this Library supports.\r
582 #\r
583 if IsLibraryModule:\r
584 for Item in Module.GetExternList():\r
585 if Item.Constructor or Item.Destructor:\r
586 if hasattr(Item, 'SupModList') and len(Item.SupModList) > 0 and \\r
587 not IsEqualList(Item.SupModList, LibrarySupModList):\r
588 Logger.Error('\nUPT',\r
589 PARSER_ERROR,\r
590 ERR_XML_INVALID_EXTERN_SUPMODLIST % (str(Item.SupModList), str(LibrarySupModList)),\r
591 RaiseError=True)\r
592\r
593 #\r
594 # If the module is not a library module, the MODULE_TYPE listed in the ModuleSurfaceArea.Header must match the \r
595 # SupModList attribute. If these conditions cannot be met, the tool must exit gracefully, informing the user \r
596 # that the EDK II Build system does not currently support the features required by this Module.\r
597 # \r
598 if not IsLibraryModule:\r
599 for Item in Module.GetExternList():\r
600 if hasattr(Item, 'SupModList') and len(Item.SupModList) > 0 and \\r
601 not IsEqualList(Item.SupModList, [Module.ModuleType]):\r
602 Logger.Error('\nUPT',\r
603 PARSER_ERROR,\r
604 ERR_XML_INVALID_EXTERN_SUPMODLIST_NOT_LIB % (str(Module.ModuleType), str(Item.SupModList)),\r
605 RaiseError=True)\r
606 #\r
607 # Check SourceFiles\r
608 #\r
609 XmlTreeLevel = TopXmlTreeLevel + ['SourceFiles']\r
610 for Item in Module.GetSourceFileList():\r
4231a819 611 if Item is None:\r
4234283c
LG
612 CheckDict = {'Filename':''}\r
613 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
614\r
615 XmlTreeLevel = TopXmlTreeLevel + ['SourceFiles']\r
616 for Item in Module.GetSourceFileList():\r
617 CheckDict = {'Filename':Item.GetSourceFile()}\r
618 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
619\r
620 for ItemCount in range(len(Module.GetBinaryFileList())):\r
621 Item = Module.GetBinaryFileList()[ItemCount]\r
622 if Item and len(Item.FileNamList) > 0 and Item.FileNamList[0].FileType == 'FREEFORM':\r
623 Item.FileNamList[0].FileType = 'SUBTYPE_GUID'\r
624 Module.GetBinaryFileList()[ItemCount] = Item\r
4234283c
LG
625\r
626## ValidateMS3\r
627#\r
628# Check if any required item is missing in ModuleSurfaceArea\r
629#\r
630# @param Module: The ModuleSurfaceArea to be checked\r
631# @param XmlTreeLevel: The top level of Module \r
632#\r
633def ValidateMS3(Module, TopXmlTreeLevel):\r
634 #\r
635 # Check PackageDependencies -> Package\r
636 #\r
637 XmlTreeLevel = TopXmlTreeLevel + ['PackageDependencies']\r
638 for Item in Module.GetPackageDependencyList():\r
4231a819 639 if Item is None:\r
4234283c
LG
640 CheckDict = {'Package':''}\r
641 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
642\r
643 XmlTreeLevel = TopXmlTreeLevel + ['PackageDependencies', 'Package']\r
644 for Item in Module.GetPackageDependencyList():\r
645 CheckDict = {'GUID':Item.GetGuid()}\r
646 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
647\r
648 #\r
649 # Check BinaryFiles -> BinaryFile\r
650 #\r
651 for Item in Module.GetBinaryFileList():\r
4231a819 652 if Item is None:\r
4234283c
LG
653 XmlTreeLevel = TopXmlTreeLevel + ['BinaryFiles']\r
654 CheckDict = {'BinaryFile':''}\r
655 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
656 if not Item.GetFileNameList():\r
657 XmlTreeLevel = TopXmlTreeLevel + ['BinaryFiles', 'BinaryFile']\r
658 CheckDict = {'Filename':''}\r
659 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
660\r
661 XmlTreeLevel = TopXmlTreeLevel + ['BinaryFiles', 'BinaryFile']\r
662 for File in Item.GetFileNameList():\r
663 CheckDict = {'Filename':File.GetFilename(),\r
664 'FileType':File.GetFileType()}\r
665 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
666 for AsBuilt in Item.GetAsBuiltList():\r
667 #\r
668 # Check LibInstance\r
669 # \r
670 if len(AsBuilt.LibraryInstancesList) == 1 and not AsBuilt.LibraryInstancesList[0]:\r
671 CheckDict = {'GUID':''}\r
672 XmlTreeLevel = TopXmlTreeLevel + ['BinaryFiles', 'BinaryFile', 'AsBuilt', 'LibraryInstances']\r
673 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
674 \r
675 for LibItem in AsBuilt.LibraryInstancesList:\r
676 CheckDict = {'Guid':LibItem.Guid,\r
677 'Version':LibItem.Version}\r
678 XmlTreeLevel = TopXmlTreeLevel + ['BinaryFiles', 'BinaryFile', 'AsBuilt', 'LibraryInstances']\r
679 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
680\r
681 #\r
682 # Check PatchPcd\r
683 #\r
684 for PatchPcdItem in AsBuilt.PatchPcdList:\r
685 CheckDict = {'TokenSpaceGuidValue':PatchPcdItem.TokenSpaceGuidValue,\r
686 'PcdCName':PatchPcdItem.PcdCName,\r
687 'Token':PatchPcdItem.Token,\r
688 'DatumType':PatchPcdItem.DatumType,\r
689 'Value':PatchPcdItem.DefaultValue,\r
690 'Offset':PatchPcdItem.Offset}\r
691 XmlTreeLevel = TopXmlTreeLevel + ['BinaryFiles', 'BinaryFile', 'AsBuilt', 'PatchPcdValue']\r
692 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
693 #\r
694 # Check PcdError\r
695 #\r
696 for PcdErrorItem in PatchPcdItem.PcdErrorsList:\r
697 CheckDict = {'ErrorNumber':PcdErrorItem.ErrorNumber}\r
698 XmlTreeLevel = TopXmlTreeLevel + ['BinaryFiles', 'BinaryFile', 'AsBuilt',\r
699 'PatchPcdValue', 'PcdError']\r
700 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
701 #\r
702 # Check PcdEx\r
703 #\r
704 for PcdExItem in AsBuilt.PcdExValueList:\r
705 CheckDict = {'TokenSpaceGuidValue':PcdExItem.TokenSpaceGuidValue,\r
706 'Token':PcdExItem.Token,\r
421ccda3 707 'DatumType':PcdExItem.DatumType}\r
4234283c
LG
708 XmlTreeLevel = TopXmlTreeLevel + ['BinaryFiles', 'BinaryFile', 'AsBuilt', 'PcdExValue']\r
709 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
710 #\r
711 # Check PcdError\r
712 #\r
713 for PcdErrorItem in PcdExItem.PcdErrorsList:\r
714 CheckDict = {'ErrorNumber':PcdErrorItem.ErrorNumber}\r
715 XmlTreeLevel = TopXmlTreeLevel + ['BinaryFiles', 'BinaryFile', 'AsBuilt',\r
716 'PcdExValue', 'PcdError']\r
717 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
718 #\r
719 # Check SmmDepex\r
720 #\r
721 XmlTreeLevel = TopXmlTreeLevel + ['SmmDepex']\r
722 for Item in Module.GetSmmDepex():\r
723 CheckDict = {'Expression':Item.GetDepex()}\r
724 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
725\r
726 #\r
727 # Check PeiDepex\r
728 #\r
729 XmlTreeLevel = TopXmlTreeLevel + ['PeiDepex']\r
730 for Item in Module.GetPeiDepex():\r
731 CheckDict = {'Expression':Item.GetDepex()}\r
732 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
733\r
734 #\r
735 # Check DxeDepex\r
736 #\r
737 XmlTreeLevel = TopXmlTreeLevel + ['DxeDepex']\r
738 for Item in Module.GetDxeDepex():\r
739 CheckDict = {'Expression':Item.GetDepex()}\r
740 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
741\r
742 #\r
743 # Check <UserExtensions>\r
744 #\r
745 XmlTreeLevel = TopXmlTreeLevel + ['UserExtensions']\r
746 for Item in Module.GetUserExtensionList():\r
747 CheckDict = {'UserId':Item.GetUserID(), 'Identifier':Item.GetIdentifier()}\r
748 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
749\r
750## ValidatePS1\r
751#\r
752# ValidatePS1\r
753#\r
754def ValidatePS1(Package):\r
755 #\r
756 # Check DistributionPackage -> PackageSurfaceArea -> Header\r
757 #\r
758 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'Header']\r
759 CheckDict = Sdict()\r
760 CheckDict['Name'] = Package.GetName()\r
761 CheckDict['BaseName'] = Package.GetBaseName()\r
762 CheckDict['GUID'] = Package.GetGuid()\r
763 CheckDict['Version'] = Package.GetVersion()\r
764 CheckDict['PackagePath'] = Package.GetPackagePath()\r
765\r
766 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
767 if not IsValidInstallPath(Package.GetPackagePath()):\r
768 Logger.Error("UPT", FORMAT_INVALID, ERR_FILE_NAME_INVALIDE % Package.GetPackagePath())\r
769\r
770 #\r
771 # Check DistributionPackage -> PackageSurfaceArea -> ClonedFrom\r
772 #\r
773 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'ClonedFrom']\r
774 for Item in Package.GetClonedFromList():\r
4231a819 775 if Item is None:\r
4234283c
LG
776 CheckDict = Sdict()\r
777 CheckDict['GUID'] = ''\r
778 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
779 CheckDict = Sdict()\r
780 CheckDict['GUID'] = Item.GetPackageGuid()\r
781 CheckDict['Version'] = Item.GetPackageVersion()\r
782\r
783 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
784\r
785 #\r
786 # Check DistributionPackage -> PackageSurfaceArea -> LibraryClassDeclarations -> LibraryClass\r
787 #\r
788 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'LibraryClassDeclarations']\r
789 for Item in Package.GetLibraryClassList():\r
4231a819 790 if Item is None:\r
4234283c
LG
791 CheckDict = {'LibraryClass':''}\r
792 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
793\r
794 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'LibraryClassDeclarations', 'LibraryClass']\r
795 for Item in Package.GetLibraryClassList():\r
796 CheckDict = {'Keyword':Item.GetLibraryClass(),\r
797 'HeaderFile':Item.GetIncludeHeader()}\r
798 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
799\r
800 #\r
801 # Check DistributionPackage -> PackageSurfaceArea -> IndustryStandardIncludes -> IndustryStandardHeader\r
802 #\r
803 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'IndustryStandardIncludes']\r
804 for Item in Package.GetStandardIncludeFileList():\r
4231a819 805 if Item is None:\r
4234283c
LG
806 CheckDict = {'IndustryStandardHeader':''}\r
807 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
808\r
809 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'IndustryStandardIncludes', 'IndustryStandardHeader']\r
810 for Item in Package.GetStandardIncludeFileList():\r
811 CheckDict = {'HeaderFile':Item.GetFilePath()}\r
812 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
813\r
814 #\r
815 # Check DistributionPackage -> PackageSurfaceArea -> PackageIncludes -> PackageHeader\r
816 #\r
817 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'PackageIncludes']\r
818 for Item in Package.GetPackageIncludeFileList():\r
4231a819 819 if Item is None:\r
4234283c
LG
820 CheckDict = {'PackageHeader':''}\r
821 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
822\r
823 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'PackageIncludes', 'PackageHeader']\r
824 for Item in Package.GetPackageIncludeFileList():\r
825 CheckDict = {'HeaderFile':Item.GetFilePath()}\r
826 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
827\r
828## ValidatePS2\r
829#\r
830# ValidatePS2\r
831#\r
832def ValidatePS2(Package):\r
833 #\r
834 # Check DistributionPackage -> PackageSurfaceArea -> Modules -> ModuleSurfaceArea\r
835 #\r
836 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'Modules', 'ModuleSurfaceArea']\r
837 for Item in Package.GetModuleDict().values():\r
838 ValidateMS(Item, XmlTreeLevel)\r
839\r
840 #\r
841 # Check DistributionPackage -> PackageSurfaceArea -> GuidDeclarations Entry\r
842 #\r
843 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'GuidDeclarations']\r
844 for Item in Package.GetGuidList():\r
4231a819 845 if Item is None:\r
4234283c
LG
846 CheckDict = {'Entry':''}\r
847 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
848\r
849 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'GuidDeclarations', 'Entry']\r
850 for Item in Package.GetGuidList():\r
851 CheckDict = {'CName':Item.GetCName(),\r
852 'GuidValue':Item.GetGuid()}\r
853 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
854\r
855 #\r
856 # Check DistributionPackage -> PackageSurfaceArea -> ProtocolDeclarations -> Entry\r
857 #\r
858 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'ProtocolDeclarations']\r
859 for Item in Package.GetProtocolList():\r
4231a819 860 if Item is None:\r
4234283c
LG
861 CheckDict = {'Entry':''}\r
862 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
863\r
864 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'ProtocolDeclarations', 'Entry']\r
865 for Item in Package.GetProtocolList():\r
866 CheckDict = {'CName':Item.GetCName(),\r
867 'GuidValue':Item.GetGuid()}\r
868 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
869\r
870 #\r
871 # Check DistributionPackage -> PackageSurfaceArea -> PpiDeclarations -> Entry\r
872 #\r
873 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'PpiDeclarations']\r
874 for Item in Package.GetPpiList():\r
4231a819 875 if Item is None:\r
4234283c
LG
876 CheckDict = {'Entry':''}\r
877 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
878\r
879 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'PpiDeclarations', 'Entry']\r
880 for Item in Package.GetPpiList():\r
881 CheckDict = {'CName':Item.GetCName(),\r
882 'GuidValue':Item.GetGuid()}\r
883 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
884\r
885 #\r
886 # Check DistributionPackage -> PackageSurfaceArea -> PcdDeclarations -> Entry\r
887 #\r
888 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'PcdDeclarations']\r
889 for Item in Package.GetPcdList():\r
4231a819 890 if Item is None:\r
4234283c
LG
891 CheckDict = {'PcdEntry':''}\r
892 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
893\r
894 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'PcdDeclarations', 'PcdEntry']\r
895 for Item in Package.GetPcdList():\r
896 CheckDict = {'TokenSpaceGuidCname':Item.GetTokenSpaceGuidCName(),\r
897 'Token':Item.GetToken(),\r
898 'CName':Item.GetCName(),\r
899 'DatumType':Item.GetDatumType(),\r
900 'ValidUsage':Item.GetValidUsage(),\r
901 'DefaultValue':Item.GetDefaultValue()}\r
902 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
903\r
904 #\r
905 # Check DistributionPackage -> PackageSurfaceArea -> UserExtensions\r
906 #\r
907 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'UserExtensions']\r
908 for Item in Package.GetUserExtensionList():\r
909 CheckDict = {'UserId':Item.GetUserID(), 'Identifier':Item.GetIdentifier()}\r
910 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
911\r
912 #\r
913 # Check DistributionPackage -> PackageSurfaceArea -> MiscellaneousFiles -> Filename\r
914 #\r
915 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'MiscellaneousFiles']\r
916 for Item in Package.GetMiscFileList():\r
917 if not Item.GetFileList():\r
918 CheckDict = {'Filename':'', }\r
919 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
920 for File in Item.GetFileList():\r
921 CheckDict = {'Filename':File.GetURI(), }\r
922 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
923\r
924## ValidatePackageSurfaceArea\r
925#\r
926# Check if any required item is missing in PackageSurfaceArea\r
927#\r
928# @param Package: The PackageSurfaceArea to be checked \r
929#\r
930def ValidatePackageSurfaceArea(Package):\r
931 ValidatePS1(Package)\r
932 ValidatePS2(Package)\r