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