2 # This file is used to parse a xml file of .PKG file
4 # Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
6 # This program and the accompanying materials are licensed and made available
7 # under the terms and conditions of the BSD License which accompanies this
8 # distribution. The full text of the license may be found at
9 # http://opensource.org/licenses/bsd-license.php
11 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
24 from Library
.Xml
.XmlRoutines
import XmlNode
25 from Library
.Xml
.XmlRoutines
import CreateXmlElement
26 from Library
.Xml
.XmlRoutines
import XmlList
27 from Library
.Xml
.XmlRoutines
import XmlParseFile
28 from Core
.DistributionPackageClass
import DistributionPackageClass
29 from Object
.POM
.ModuleObject
import DepexObject
30 from Library
.ParserValidate
import IsValidInfMoudleType
31 from Library
.ParserValidate
import IsValidInstallPath
32 from Library
.Misc
import IsEqualList
33 from Library
.Misc
import Sdict
35 from Logger
.StringTable
import ERR_XML_INVALID_VARIABLENAME
36 from Logger
.StringTable
import ERR_XML_INVALID_LIB_SUPMODLIST
37 from Logger
.StringTable
import ERR_XML_INVALID_EXTERN_SUPARCHLIST
38 from Logger
.StringTable
import ERR_XML_INVALID_EXTERN_SUPMODLIST
39 from Logger
.StringTable
import ERR_XML_INVALID_EXTERN_SUPMODLIST_NOT_LIB
40 from Logger
.StringTable
import ERR_FILE_NAME_INVALIDE
41 from Logger
.StringTable
import ERR_XML_INVALID_BINARY_FILE_TYPE
42 from Logger
.ToolError
import PARSER_ERROR
43 from Logger
.ToolError
import FORMAT_INVALID
45 from Xml
.CommonXml
import DistributionPackageHeaderXml
46 from Xml
.CommonXml
import MiscellaneousFileXml
47 from Xml
.CommonXml
import UserExtensionsXml
48 from Xml
.XmlParserMisc
import ConvertVariableName
49 from Xml
.XmlParserMisc
import IsRequiredItemListNull
50 from Xml
.ModuleSurfaceAreaXml
import ModuleSurfaceAreaXml
51 from Xml
.PackageSurfaceAreaXml
import PackageSurfaceAreaXml
53 import Logger
.Log
as Logger
56 # DistributionPackageXml
58 class DistributionPackageXml(object):
60 self
.DistP
= DistributionPackageClass()
63 ## ValidateDistributionPackage
65 # Check if any required item is missing in DistributionPackage
67 def ValidateDistributionPackage(self
):
68 XmlTreeLevel
= ['DistributionPackage']
71 # Check DistributionPackage -> DistributionHeader
73 XmlTreeLevel
= ['DistributionPackage', '']
74 CheckDict
= {'DistributionHeader':self
.DistP
.Header
}
75 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
78 DpHeader
= self
.DistP
.Header
79 XmlTreeLevel
= ['DistributionPackage', 'DistributionHeader']
81 CheckDict
['Name'] = DpHeader
.GetName()
82 CheckDict
['GUID'] = DpHeader
.GetGuid()
83 CheckDict
['Version'] = DpHeader
.GetVersion()
84 CheckDict
['Copyright'] = DpHeader
.GetCopyright()
85 CheckDict
['License'] = DpHeader
.GetLicense()
86 CheckDict
['Abstract'] = DpHeader
.GetAbstract()
87 CheckDict
['Vendor'] = DpHeader
.GetVendor()
88 CheckDict
['Date'] = DpHeader
.GetDate()
89 CheckDict
['XmlSpecification'] = DpHeader
.GetXmlSpecification()
91 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
93 XmlTreeLevel
= ['DistributionPackage', 'DistributionHeader']
94 CheckDict
= CheckDict
= {'DistributionHeader':'', }
95 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
100 for Key
in self
.DistP
.PackageSurfaceArea
:
101 ValidatePackageSurfaceArea(self
.DistP
.PackageSurfaceArea
[Key
])
106 for Key
in self
.DistP
.ModuleSurfaceArea
:
107 ValidateMS(self
.DistP
.ModuleSurfaceArea
[Key
], ['DistributionPackage', 'ModuleSurfaceArea'])
113 XmlTreeLevel
= ['DistributionPackage', 'Tools', 'Header']
114 CheckDict
= {'Name':self
.DistP
.Tools
.GetName(), }
115 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
117 if not self
.DistP
.Tools
.GetFileList():
118 XmlTreeLevel
= ['DistributionPackage', 'Tools']
119 CheckDict
= {'FileName':None, }
120 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
121 for Item
in self
.DistP
.Tools
.GetFileList():
122 XmlTreeLevel
= ['DistributionPackage', 'Tools']
123 CheckDict
= {'FileName':Item
.GetURI(), }
124 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
127 # Check Each Misc File
129 if self
.DistP
.MiscellaneousFiles
:
130 XmlTreeLevel
= ['DistributionPackage', 'MiscellaneousFiles', 'Header']
131 CheckDict
= {'Name':self
.DistP
.MiscellaneousFiles
.GetName(), }
132 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
134 if not self
.DistP
.MiscellaneousFiles
.GetFileList():
135 XmlTreeLevel
= ['DistributionPackage', 'MiscellaneousFiles']
136 CheckDict
= {'FileName':None, }
137 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
138 for Item
in self
.DistP
.MiscellaneousFiles
.GetFileList():
139 XmlTreeLevel
= ['DistributionPackage', 'MiscellaneousFiles']
140 CheckDict
= {'FileName':Item
.GetURI(), }
141 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
144 # Check Each Distribution Level User Extension
146 for Item
in self
.DistP
.UserExtensions
:
147 XmlTreeLevel
= ['DistributionPackage', 'UserExtensions']
148 CheckDict
= {'UserId':Item
.GetUserID(), }
149 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
152 def FromXml(self
, Filename
=None):
154 self
.DistP
= DistributionPackageClass()
158 self
.Pkg
= XmlParseFile(Filename
)
161 # Parse Header information
163 Tmp
= DistributionPackageHeaderXml()
164 DistributionPackageHeader
= \
165 Tmp
.FromXml(XmlNode(self
.Pkg
, '/DistributionPackage/DistributionHeader'), 'DistributionHeader')
166 self
.DistP
.Header
= DistributionPackageHeader
168 # Parse each PackageSurfaceArea
170 for Item
in XmlList(self
.Pkg
, '/DistributionPackage/PackageSurfaceArea'):
171 Psa
= PackageSurfaceAreaXml()
172 Package
= Psa
.FromXml(Item
, 'PackageSurfaceArea')
173 self
.DistP
.PackageSurfaceArea
[(Package
.GetGuid(), \
174 Package
.GetVersion(), \
175 Package
.GetPackagePath())] = \
178 # Parse each ModuleSurfaceArea
180 for Item
in XmlList(self
.Pkg
, '/DistributionPackage/ModuleSurfaceArea'):
181 Msa
= ModuleSurfaceAreaXml()
182 Module
= Msa
.FromXml(Item
, 'ModuleSurfaceArea', True)
183 self
.DistP
.ModuleSurfaceArea
[(Module
.GetGuid(), Module
.GetVersion(), Module
.GetModulePath())] = Module
187 Tmp
= MiscellaneousFileXml()
188 self
.DistP
.Tools
= Tmp
.FromXml2(XmlNode(self
.Pkg
, '/DistributionPackage/Tools'), 'Tools')
193 Tmp
= MiscellaneousFileXml()
194 self
.DistP
.MiscellaneousFiles
= \
195 Tmp
.FromXml2(XmlNode(self
.Pkg
, \
196 '/DistributionPackage/MiscellaneousFiles'), \
197 'MiscellaneousFiles')
200 # Parse UserExtensions
202 for Item
in XmlList(self
.Pkg
, '/DistributionPackage/UserExtensions'):
203 Tmp
= UserExtensionsXml()
204 self
.DistP
.UserExtensions
.append(Tmp
.FromXml2(Item
, 'UserExtensions'))
207 # Check Required Items for XML
209 self
.ValidateDistributionPackage()
213 def ToXml(self
, DistP
):
218 # Parse DistributionPackageHeader
220 Attrs
= [['xmlns', 'http://www.uefi.org/2011/1.1'],
221 ['xmlns:xsi', 'http:/www.w3.org/2001/XMLSchema-instance'],
223 Root
= CreateXmlElement('DistributionPackage', '', [], Attrs
)
225 Tmp
= DistributionPackageHeaderXml()
226 Root
.appendChild(Tmp
.ToXml(DistP
.Header
, 'DistributionHeader'))
228 # Parse each PackageSurfaceArea
230 for Package
in DistP
.PackageSurfaceArea
.values():
231 Psa
= PackageSurfaceAreaXml()
232 DomPackage
= Psa
.ToXml(Package
)
233 Root
.appendChild(DomPackage
)
235 # Parse each ModuleSurfaceArea
237 for Module
in DistP
.ModuleSurfaceArea
.values():
238 Msa
= ModuleSurfaceAreaXml()
239 DomModule
= Msa
.ToXml(Module
)
240 Root
.appendChild(DomModule
)
244 Tmp
= MiscellaneousFileXml()
245 ToolNode
= Tmp
.ToXml2(DistP
.Tools
, 'Tools')
246 if ToolNode
is not None:
247 Root
.appendChild(ToolNode
)
251 Tmp
= MiscellaneousFileXml()
252 MiscFileNode
= Tmp
.ToXml2(DistP
.MiscellaneousFiles
,
253 'MiscellaneousFiles')
254 if MiscFileNode
is not None:
255 Root
.appendChild(MiscFileNode
)
257 XmlContent
= Root
.toprettyxml(indent
=' ')
261 # Remove empty element
263 XmlContent
= re
.sub(r
'[\s\r\n]*<[^<>=]*/>', '', XmlContent
)
266 # Remove empty help text element
268 XmlContent
= re
.sub(r
'[\s\r\n]*<HelpText Lang="en-US"/>', '',
272 # Remove SupArchList="COMMON" or "common"
275 re
.sub(r
'[\s\r\n]*SupArchList[\s\r\n]*=[\s\r\n]*"[\s\r\n]*COMMON'
276 '[\s\r\n]*"', '', XmlContent
)
278 re
.sub(r
'[\s\r\n]*SupArchList[\s\r\n]*=[\s\r\n]*"[\s\r\n]*common'
279 '[\s\r\n]*"', '', XmlContent
)
281 # Remove <SupArchList> COMMON </SupArchList>
284 re
.sub(r
'[\s\r\n]*<SupArchList>[\s\r\n]*COMMON[\s\r\n]*'
285 '</SupArchList>[\s\r\n]*', '', XmlContent
)
288 # Remove <SupArchList> common </SupArchList>
291 re
.sub(r
'[\s\r\n]*<SupArchList>[\s\r\n]*'
292 'common[\s\r\n]*</SupArchList>[\s\r\n]*', '', XmlContent
)
295 # Remove SupModList="COMMON" or "common"
298 re
.sub(r
'[\s\r\n]*SupModList[\s\r\n]*=[\s\r\n]*"[\s\r\n]*COMMON'
299 '[\s\r\n]*"', '', XmlContent
)
301 re
.sub(r
'[\s\r\n]*SupModList[\s\r\n]*=[\s\r\n]*"[\s\r\n]*common'
302 '[\s\r\n]*"', '', XmlContent
)
310 # Check if any required item is missing in ModuleSurfaceArea
312 # @param Module: The ModuleSurfaceArea to be checked
313 # @param XmlTreeLevel: The top level of Module
315 def ValidateMS(Module
, TopXmlTreeLevel
):
316 ValidateMS1(Module
, TopXmlTreeLevel
)
317 ValidateMS2(Module
, TopXmlTreeLevel
)
318 ValidateMS3(Module
, TopXmlTreeLevel
)
322 # Check if any required item is missing in ModuleSurfaceArea
324 # @param Module: The ModuleSurfaceArea to be checked
325 # @param XmlTreeLevel: The top level of Module
327 def ValidateMS1(Module
, TopXmlTreeLevel
):
329 # Check Guids -> GuidCName
331 XmlTreeLevel
= TopXmlTreeLevel
+ ['Guids']
332 for Item
in Module
.GetGuidList():
334 CheckDict
= {'GuidCName':''}
335 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
337 XmlTreeLevel
= TopXmlTreeLevel
+ ['Guids', 'GuidCName']
338 for Item
in Module
.GetGuidList():
339 CheckDict
= {'CName':Item
.GetCName(),
340 'GuidType':Item
.GetGuidTypeList(),
341 'Usage':Item
.GetUsage()}
342 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
344 if Item
.GetVariableName():
345 Result
= ConvertVariableName(Item
.GetVariableName())
347 Msg
= "->".join(Node
for Node
in XmlTreeLevel
)
348 ErrorMsg
= ERR_XML_INVALID_VARIABLENAME
% (Item
.GetVariableName(), Item
.GetCName(), Msg
)
349 Logger
.Error('\nUPT', PARSER_ERROR
, ErrorMsg
, RaiseError
=True)
351 Item
.SetVariableName(Result
)
354 # Check Protocols -> Protocol
356 XmlTreeLevel
= TopXmlTreeLevel
+ ['Protocols']
357 for Item
in Module
.GetProtocolList():
359 CheckDict
= {'Protocol':''}
360 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
362 XmlTreeLevel
= TopXmlTreeLevel
+ ['Protocols', 'Protocol']
363 for Item
in Module
.GetProtocolList():
364 CheckDict
= {'CName':Item
.GetCName(),
365 'Usage':Item
.GetUsage()}
366 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
371 XmlTreeLevel
= TopXmlTreeLevel
+ ['PPIs']
372 for Item
in Module
.GetPpiList():
374 CheckDict
= {'Ppi':''}
375 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
377 XmlTreeLevel
= TopXmlTreeLevel
+ ['PPIs', 'Ppi']
378 for Item
in Module
.GetPpiList():
379 CheckDict
= {'CName':Item
.GetCName(),
380 'Usage':Item
.GetUsage()}
381 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
384 # Check PcdCoded -> Entry
386 XmlTreeLevel
= TopXmlTreeLevel
+ ['PcdCoded']
387 for Item
in Module
.GetPcdList():
389 CheckDict
= {'PcdEntry':''}
390 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
392 XmlTreeLevel
= TopXmlTreeLevel
+ ['PcdCoded', 'PcdEntry']
393 for Item
in Module
.GetPcdList():
394 CheckDict
= {'TokenSpaceGuidCname':Item
.GetTokenSpaceGuidCName(),
395 'CName':Item
.GetCName(),
396 'PcdUsage':Item
.GetValidUsage(),
397 'PcdItemType':Item
.GetItemType()}
398 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
401 # Check Externs -> Extern
403 XmlTreeLevel
= TopXmlTreeLevel
+ ['Externs']
404 for Item
in Module
.GetExternList():
406 CheckDict
= {'Extern':''}
407 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
410 # If SupArchList is used to identify different EntryPoint, UnloadImage, Constructor/Destructor elements and
411 # that SupArchList does not match ModuleSurfaceArea.ModuleProperties:SupArchList, the tool must exit gracefully,
412 # informing the user that the EDK II Build system does not support different EntryPoint, UnloadImage,
413 # Constructor or Destructor elements based on Architecture type. Two SupArchList attributes are considered
414 # identical if it lists the same CPU architectures in any order.
416 for Item
in Module
.GetExternList():
417 if len(Item
.SupArchList
) > 0:
418 if not IsEqualList(Item
.SupArchList
, Module
.SupArchList
):
419 Logger
.Error('\nUPT',
421 ERR_XML_INVALID_EXTERN_SUPARCHLIST
% (str(Item
.SupArchList
), str(Module
.SupArchList
)),
425 # Check DistributionPackage -> ModuleSurfaceArea -> UserExtensions
427 XmlTreeLevel
= TopXmlTreeLevel
+ ['UserExtensions']
428 for Item
in Module
.GetUserExtensionList():
429 CheckDict
= {'UserId':Item
.GetUserID(), 'Identifier':Item
.GetIdentifier()}
430 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
433 # Check DistributionPackage -> PackageSurfaceArea -> MiscellaneousFiles -> Filename
435 XmlTreeLevel
= TopXmlTreeLevel
+ ['MiscellaneousFiles']
436 for Item
in Module
.GetMiscFileList():
437 if not Item
.GetFileList():
438 CheckDict
= {'Filename':'', }
439 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
440 for File
in Item
.GetFileList():
441 CheckDict
= {'Filename':File
.GetURI(), }
445 # Check if any required item is missing in ModuleSurfaceArea
447 # @param Module: The ModuleSurfaceArea to be checked
448 # @param XmlTreeLevel: The top level of Module
450 def ValidateMS2(Module
, TopXmlTreeLevel
):
454 XmlTreeLevel
= TopXmlTreeLevel
+ ['Header']
456 CheckDict
['Name'] = Module
.GetName()
457 CheckDict
['BaseName'] = Module
.GetBaseName()
458 CheckDict
['GUID'] = Module
.GetGuid()
459 CheckDict
['Version'] = Module
.GetVersion()
460 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
463 # Check ModuleProperties
465 XmlTreeLevel
= TopXmlTreeLevel
+ ['ModuleProperties']
466 CheckDict
= {'ModuleType':Module
.GetModuleType(),
467 'Path':Module
.GetModulePath()}
468 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
470 if not IsValidInstallPath(Module
.GetModulePath()):
471 Logger
.Error("UPT", FORMAT_INVALID
, ERR_FILE_NAME_INVALIDE
% Module
.GetModulePath())
474 # Check ModuleProperties->BootMode
476 XmlTreeLevel
= TopXmlTreeLevel
+ ['ModuleProperties'] + ['BootMode']
477 for Item
in Module
.GetBootModeList():
478 CheckDict
= {'Usage':Item
.GetUsage(),
479 'SupportedBootModes':Item
.GetSupportedBootModes()}
480 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
483 # Check ModuleProperties->Event
485 XmlTreeLevel
= TopXmlTreeLevel
+ ['ModuleProperties'] + ['Event']
486 for Item
in Module
.GetEventList():
487 CheckDict
= {'Usage':Item
.GetUsage(),
488 'EventType':Item
.GetEventType()}
489 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
492 # Check ModuleProperties->Hob
494 XmlTreeLevel
= TopXmlTreeLevel
+ ['ModuleProperties'] + ['HOB']
495 for Item
in Module
.GetHobList():
496 CheckDict
= {'Usage':Item
.GetUsage(),
497 'HobType':Item
.GetHobType()}
498 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
501 # The UDP Specification supports the module type of UEFI_RUNTIME_DRIVER, which is not present in the EDK II INF
502 # File Specification v. 1.23, so UPT must perform the following translation that include the generation of a
505 if Module
.ModuleType
== "UEFI_RUNTIME_DRIVER":
506 Module
.ModuleType
= "DXE_RUNTIME_DRIVER"
507 DxeObj
= DepexObject()
508 DxeObj
.SetDepex("gEfiBdsArchProtocolGuid AND \ngEfiCpuArchProtocolGuid AND\n" + \
509 "gEfiMetronomeArchProtocolGuid AND \ngEfiMonotonicCounterArchProtocolGuid AND\n" + \
510 "gEfiRealTimeClockArchProtocolGuid AND \ngEfiResetArchProtocolGuid AND\n" + \
511 "gEfiRuntimeArchProtocolGuid AND \ngEfiSecurityArchProtocolGuid AND\n" + \
512 "gEfiTimerArchProtocolGuid AND \ngEfiVariableWriteArchProtocolGuid AND\n" + \
513 "gEfiVariableArchProtocolGuid AND \ngEfiWatchdogTimerArchProtocolGuid")
514 DxeObj
.SetModuleType(['DXE_RUNTIME_DRIVER'])
518 Module
.DxeDepex
.append(DxeObj
)
521 # Check LibraryClassDefinitions -> LibraryClass
523 XmlTreeLevel
= TopXmlTreeLevel
+ ['LibraryClassDefinitions']
524 for Item
in Module
.GetLibraryClassList():
526 CheckDict
= {'LibraryClass':''}
527 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
529 XmlTreeLevel
= TopXmlTreeLevel
+ ['LibraryClassDefinitions', 'LibraryClass']
531 IsLibraryModule
= False
532 LibrarySupModList
= []
533 for Item
in Module
.GetLibraryClassList():
534 CheckDict
= {'Keyword':Item
.GetLibraryClass(),
535 'Usage':Item
.GetUsage()}
536 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
538 # If the LibraryClass:SupModList is not "UNDEFINED" the LIBRARY_CLASS entry must have the list
539 # appended using the format:
540 # LIBRARY_CLASS = <ClassName> ["|" <Edk2ModuleTypeList>]
542 # Edk2ModuleTypeList ::= <ModuleType> [" " <ModuleType>]{0,}
543 # <ModuleTypes> ::= {"BASE"} {"SEC"} {"PEI_CORE"} {"PEIM"}
544 # {"DXE_CORE"} {"DXE_DRIVER"} {"SMM_CORE"}
545 # {"DXE_SMM_DRIVER"} {"DXE_RUNTIME_DRIVER"}
546 # {"DXE_SAL_DRIVER"} {"UEFI_DRIVER"}
547 # {"UEFI_APPLICATION"} {"USER_DEFINED"}
549 if len(Item
.SupModuleList
) > 0:
550 for SupModule
in Item
.SupModuleList
:
551 if not IsValidInfMoudleType(SupModule
):
552 Logger
.Error('\nUPT',
554 ERR_XML_INVALID_LIB_SUPMODLIST
% (Item
.LibraryClass
, str(SupModule
)),
557 if Item
.Usage
== 'PRODUCES' or Item
.Usage
== 'SOMETIMES_PRODUCES':
558 IsLibraryModule
= True
559 LibrarySupModList
= Item
.SupModuleList
563 # For Library modules (indicated by a LIBRARY_CLASS statement in the [Defines] section)
564 # If the SupModList attribute of the CONSTRUCTOR or DESTRUCTOR element does not match the Supported Module
565 # Types listed after "LIBRARY_CLASS = <Keyword> |", the tool should gracefully exit with an error message
566 # stating that there is a conflict in the module types the CONSTRUCTOR/DESTRUCTOR is to be used with and
567 # the Module types this Library supports.
570 for Item
in Module
.GetExternList():
571 if Item
.Constructor
or Item
.Destructor
:
572 if hasattr(Item
, 'SupModList') and len(Item
.SupModList
) > 0 and \
573 not IsEqualList(Item
.SupModList
, LibrarySupModList
):
574 Logger
.Error('\nUPT',
576 ERR_XML_INVALID_EXTERN_SUPMODLIST
% (str(Item
.SupModList
), str(LibrarySupModList
)),
580 # If the module is not a library module, the MODULE_TYPE listed in the ModuleSurfaceArea.Header must match the
581 # SupModList attribute. If these conditions cannot be met, the tool must exit gracefully, informing the user
582 # that the EDK II Build system does not currently support the features required by this Module.
584 if not IsLibraryModule
:
585 for Item
in Module
.GetExternList():
586 if hasattr(Item
, 'SupModList') and len(Item
.SupModList
) > 0 and \
587 not IsEqualList(Item
.SupModList
, [Module
.ModuleType
]):
588 Logger
.Error('\nUPT',
590 ERR_XML_INVALID_EXTERN_SUPMODLIST_NOT_LIB
% (str(Module
.ModuleType
), str(Item
.SupModList
)),
595 XmlTreeLevel
= TopXmlTreeLevel
+ ['SourceFiles']
596 for Item
in Module
.GetSourceFileList():
598 CheckDict
= {'Filename':''}
599 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
601 XmlTreeLevel
= TopXmlTreeLevel
+ ['SourceFiles']
602 for Item
in Module
.GetSourceFileList():
603 CheckDict
= {'Filename':Item
.GetSourceFile()}
604 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
606 for ItemCount
in range(len(Module
.GetBinaryFileList())):
607 Item
= Module
.GetBinaryFileList()[ItemCount
]
608 if Item
and len(Item
.FileNamList
) > 0 and Item
.FileNamList
[0].FileType
== 'FREEFORM':
609 Item
.FileNamList
[0].FileType
= 'SUBTYPE_GUID'
610 Module
.GetBinaryFileList()[ItemCount
] = Item
611 if Item
and len(Item
.FileNamList
) > 0 and Item
.FileNamList
[0].FileType
== 'DISPOSABLE':
612 Logger
.Error('\nUPT',
614 ERR_XML_INVALID_BINARY_FILE_TYPE
% ('DISPOSABLE'),
619 # Check if any required item is missing in ModuleSurfaceArea
621 # @param Module: The ModuleSurfaceArea to be checked
622 # @param XmlTreeLevel: The top level of Module
624 def ValidateMS3(Module
, TopXmlTreeLevel
):
626 # Check PackageDependencies -> Package
628 XmlTreeLevel
= TopXmlTreeLevel
+ ['PackageDependencies']
629 for Item
in Module
.GetPackageDependencyList():
631 CheckDict
= {'Package':''}
632 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
634 XmlTreeLevel
= TopXmlTreeLevel
+ ['PackageDependencies', 'Package']
635 for Item
in Module
.GetPackageDependencyList():
636 CheckDict
= {'GUID':Item
.GetGuid()}
637 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
640 # Check BinaryFiles -> BinaryFile
642 for Item
in Module
.GetBinaryFileList():
644 XmlTreeLevel
= TopXmlTreeLevel
+ ['BinaryFiles']
645 CheckDict
= {'BinaryFile':''}
646 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
647 if not Item
.GetFileNameList():
648 XmlTreeLevel
= TopXmlTreeLevel
+ ['BinaryFiles', 'BinaryFile']
649 CheckDict
= {'Filename':''}
650 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
652 XmlTreeLevel
= TopXmlTreeLevel
+ ['BinaryFiles', 'BinaryFile']
653 for File
in Item
.GetFileNameList():
654 CheckDict
= {'Filename':File
.GetFilename(),
655 'FileType':File
.GetFileType()}
656 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
657 for AsBuilt
in Item
.GetAsBuiltList():
661 if len(AsBuilt
.LibraryInstancesList
) == 1 and not AsBuilt
.LibraryInstancesList
[0]:
662 CheckDict
= {'GUID':''}
663 XmlTreeLevel
= TopXmlTreeLevel
+ ['BinaryFiles', 'BinaryFile', 'AsBuilt', 'LibraryInstances']
664 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
666 for LibItem
in AsBuilt
.LibraryInstancesList
:
667 CheckDict
= {'Guid':LibItem
.Guid
,
668 'Version':LibItem
.Version
}
669 XmlTreeLevel
= TopXmlTreeLevel
+ ['BinaryFiles', 'BinaryFile', 'AsBuilt', 'LibraryInstances']
670 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
675 for PatchPcdItem
in AsBuilt
.PatchPcdList
:
676 CheckDict
= {'TokenSpaceGuidValue':PatchPcdItem
.TokenSpaceGuidValue
,
677 'PcdCName':PatchPcdItem
.PcdCName
,
678 'Token':PatchPcdItem
.Token
,
679 'DatumType':PatchPcdItem
.DatumType
,
680 'Value':PatchPcdItem
.DefaultValue
,
681 'Offset':PatchPcdItem
.Offset
}
682 XmlTreeLevel
= TopXmlTreeLevel
+ ['BinaryFiles', 'BinaryFile', 'AsBuilt', 'PatchPcdValue']
683 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
687 for PcdErrorItem
in PatchPcdItem
.PcdErrorsList
:
688 CheckDict
= {'ErrorNumber':PcdErrorItem
.ErrorNumber
}
689 XmlTreeLevel
= TopXmlTreeLevel
+ ['BinaryFiles', 'BinaryFile', 'AsBuilt',
690 'PatchPcdValue', 'PcdError']
691 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
695 for PcdExItem
in AsBuilt
.PcdExValueList
:
696 CheckDict
= {'TokenSpaceGuidValue':PcdExItem
.TokenSpaceGuidValue
,
697 'Token':PcdExItem
.Token
,
698 'DatumType':PcdExItem
.DatumType
,
699 'Value':PcdExItem
.DefaultValue
}
700 XmlTreeLevel
= TopXmlTreeLevel
+ ['BinaryFiles', 'BinaryFile', 'AsBuilt', 'PcdExValue']
701 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
705 for PcdErrorItem
in PcdExItem
.PcdErrorsList
:
706 CheckDict
= {'ErrorNumber':PcdErrorItem
.ErrorNumber
}
707 XmlTreeLevel
= TopXmlTreeLevel
+ ['BinaryFiles', 'BinaryFile', 'AsBuilt',
708 'PcdExValue', 'PcdError']
709 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
713 XmlTreeLevel
= TopXmlTreeLevel
+ ['SmmDepex']
714 for Item
in Module
.GetSmmDepex():
715 CheckDict
= {'Expression':Item
.GetDepex()}
716 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
721 XmlTreeLevel
= TopXmlTreeLevel
+ ['PeiDepex']
722 for Item
in Module
.GetPeiDepex():
723 CheckDict
= {'Expression':Item
.GetDepex()}
724 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
729 XmlTreeLevel
= TopXmlTreeLevel
+ ['DxeDepex']
730 for Item
in Module
.GetDxeDepex():
731 CheckDict
= {'Expression':Item
.GetDepex()}
732 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
735 # Check <UserExtensions>
737 XmlTreeLevel
= TopXmlTreeLevel
+ ['UserExtensions']
738 for Item
in Module
.GetUserExtensionList():
739 CheckDict
= {'UserId':Item
.GetUserID(), 'Identifier':Item
.GetIdentifier()}
740 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
746 def ValidatePS1(Package
):
748 # Check DistributionPackage -> PackageSurfaceArea -> Header
750 XmlTreeLevel
= ['DistributionPackage', 'PackageSurfaceArea', 'Header']
752 CheckDict
['Name'] = Package
.GetName()
753 CheckDict
['BaseName'] = Package
.GetBaseName()
754 CheckDict
['GUID'] = Package
.GetGuid()
755 CheckDict
['Version'] = Package
.GetVersion()
756 CheckDict
['PackagePath'] = Package
.GetPackagePath()
758 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
759 if not IsValidInstallPath(Package
.GetPackagePath()):
760 Logger
.Error("UPT", FORMAT_INVALID
, ERR_FILE_NAME_INVALIDE
% Package
.GetPackagePath())
763 # Check DistributionPackage -> PackageSurfaceArea -> ClonedFrom
765 XmlTreeLevel
= ['DistributionPackage', 'PackageSurfaceArea', 'ClonedFrom']
766 for Item
in Package
.GetClonedFromList():
769 CheckDict
['GUID'] = ''
770 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
772 CheckDict
['GUID'] = Item
.GetPackageGuid()
773 CheckDict
['Version'] = Item
.GetPackageVersion()
775 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
778 # Check DistributionPackage -> PackageSurfaceArea -> LibraryClassDeclarations -> LibraryClass
780 XmlTreeLevel
= ['DistributionPackage', 'PackageSurfaceArea', 'LibraryClassDeclarations']
781 for Item
in Package
.GetLibraryClassList():
783 CheckDict
= {'LibraryClass':''}
784 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
786 XmlTreeLevel
= ['DistributionPackage', 'PackageSurfaceArea', 'LibraryClassDeclarations', 'LibraryClass']
787 for Item
in Package
.GetLibraryClassList():
788 CheckDict
= {'Keyword':Item
.GetLibraryClass(),
789 'HeaderFile':Item
.GetIncludeHeader()}
790 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
793 # Check DistributionPackage -> PackageSurfaceArea -> IndustryStandardIncludes -> IndustryStandardHeader
795 XmlTreeLevel
= ['DistributionPackage', 'PackageSurfaceArea', 'IndustryStandardIncludes']
796 for Item
in Package
.GetStandardIncludeFileList():
798 CheckDict
= {'IndustryStandardHeader':''}
799 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
801 XmlTreeLevel
= ['DistributionPackage', 'PackageSurfaceArea', 'IndustryStandardIncludes', 'IndustryStandardHeader']
802 for Item
in Package
.GetStandardIncludeFileList():
803 CheckDict
= {'HeaderFile':Item
.GetFilePath()}
804 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
807 # Check DistributionPackage -> PackageSurfaceArea -> PackageIncludes -> PackageHeader
809 XmlTreeLevel
= ['DistributionPackage', 'PackageSurfaceArea', 'PackageIncludes']
810 for Item
in Package
.GetPackageIncludeFileList():
812 CheckDict
= {'PackageHeader':''}
813 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
815 XmlTreeLevel
= ['DistributionPackage', 'PackageSurfaceArea', 'PackageIncludes', 'PackageHeader']
816 for Item
in Package
.GetPackageIncludeFileList():
817 CheckDict
= {'HeaderFile':Item
.GetFilePath()}
818 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
824 def ValidatePS2(Package
):
826 # Check DistributionPackage -> PackageSurfaceArea -> Modules -> ModuleSurfaceArea
828 XmlTreeLevel
= ['DistributionPackage', 'PackageSurfaceArea', 'Modules', 'ModuleSurfaceArea']
829 for Item
in Package
.GetModuleDict().values():
830 ValidateMS(Item
, XmlTreeLevel
)
833 # Check DistributionPackage -> PackageSurfaceArea -> GuidDeclarations Entry
835 XmlTreeLevel
= ['DistributionPackage', 'PackageSurfaceArea', 'GuidDeclarations']
836 for Item
in Package
.GetGuidList():
838 CheckDict
= {'Entry':''}
839 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
841 XmlTreeLevel
= ['DistributionPackage', 'PackageSurfaceArea', 'GuidDeclarations', 'Entry']
842 for Item
in Package
.GetGuidList():
843 CheckDict
= {'CName':Item
.GetCName(),
844 'GuidValue':Item
.GetGuid()}
845 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
848 # Check DistributionPackage -> PackageSurfaceArea -> ProtocolDeclarations -> Entry
850 XmlTreeLevel
= ['DistributionPackage', 'PackageSurfaceArea', 'ProtocolDeclarations']
851 for Item
in Package
.GetProtocolList():
853 CheckDict
= {'Entry':''}
854 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
856 XmlTreeLevel
= ['DistributionPackage', 'PackageSurfaceArea', 'ProtocolDeclarations', 'Entry']
857 for Item
in Package
.GetProtocolList():
858 CheckDict
= {'CName':Item
.GetCName(),
859 'GuidValue':Item
.GetGuid()}
860 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
863 # Check DistributionPackage -> PackageSurfaceArea -> PpiDeclarations -> Entry
865 XmlTreeLevel
= ['DistributionPackage', 'PackageSurfaceArea', 'PpiDeclarations']
866 for Item
in Package
.GetPpiList():
868 CheckDict
= {'Entry':''}
869 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
871 XmlTreeLevel
= ['DistributionPackage', 'PackageSurfaceArea', 'PpiDeclarations', 'Entry']
872 for Item
in Package
.GetPpiList():
873 CheckDict
= {'CName':Item
.GetCName(),
874 'GuidValue':Item
.GetGuid()}
875 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
878 # Check DistributionPackage -> PackageSurfaceArea -> PcdDeclarations -> Entry
880 XmlTreeLevel
= ['DistributionPackage', 'PackageSurfaceArea', 'PcdDeclarations']
881 for Item
in Package
.GetPcdList():
883 CheckDict
= {'PcdEntry':''}
884 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
886 XmlTreeLevel
= ['DistributionPackage', 'PackageSurfaceArea', 'PcdDeclarations', 'PcdEntry']
887 for Item
in Package
.GetPcdList():
888 CheckDict
= {'TokenSpaceGuidCname':Item
.GetTokenSpaceGuidCName(),
889 'Token':Item
.GetToken(),
890 'CName':Item
.GetCName(),
891 'DatumType':Item
.GetDatumType(),
892 'ValidUsage':Item
.GetValidUsage(),
893 'DefaultValue':Item
.GetDefaultValue()}
894 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
897 # Check DistributionPackage -> PackageSurfaceArea -> UserExtensions
899 XmlTreeLevel
= ['DistributionPackage', 'PackageSurfaceArea', 'UserExtensions']
900 for Item
in Package
.GetUserExtensionList():
901 CheckDict
= {'UserId':Item
.GetUserID(), 'Identifier':Item
.GetIdentifier()}
902 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
905 # Check DistributionPackage -> PackageSurfaceArea -> MiscellaneousFiles -> Filename
907 XmlTreeLevel
= ['DistributionPackage', 'PackageSurfaceArea', 'MiscellaneousFiles']
908 for Item
in Package
.GetMiscFileList():
909 if not Item
.GetFileList():
910 CheckDict
= {'Filename':'', }
911 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
912 for File
in Item
.GetFileList():
913 CheckDict
= {'Filename':File
.GetURI(), }
914 IsRequiredItemListNull(CheckDict
, XmlTreeLevel
)
916 ## ValidatePackageSurfaceArea
918 # Check if any required item is missing in PackageSurfaceArea
920 # @param Package: The PackageSurfaceArea to be checked
922 def ValidatePackageSurfaceArea(Package
):