1## @file InfPomAlignment.py 2# This file contained the adapter for convert INF parser object to POM Object 3# 4# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR> 5# 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 10# 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. 13# 14''' 15InfPomAlignment 16''' 17## 18# Import modules 19# 20import os.path 21from Logger import StringTable as ST 22import Logger.Log as Logger 23from Library.String import FORMAT_INVALID 24from Library.String import PARSER_ERROR 25from Library.String import NormPath 26from Library.String import GetSplitValueList 27from Library.Misc import ConvertVersionToDecimal 28from Library.Misc import GetHelpStringByRemoveHashKey 29from Library.Misc import ConvertArchList 30from Library.Misc import GetRelativePath 31from Library.Misc import PathClass 32from Library.Parsing import GetPkgInfoFromDec 33from Library.UniClassObject import UniFileClassObject 34from Library.UniClassObject import ConvertSpecialUnicodes 35from Library.UniClassObject import GetLanguageCode1766 36from Library import DataType as DT 37from Library import GlobalData 38from Library.ParserValidate import IsValidPath 39from Object.POM import CommonObject 40from Object.POM.ModuleObject import ModuleObject 41from Object.POM.ModuleObject import ExternObject 42from Object.POM.ModuleObject import HobObject 43from Object.POM.ModuleObject import EventObject 44from Object.POM.ModuleObject import BootModeObject 45from Object.POM.ModuleObject import PackageDependencyObject 46from Object.POM.ModuleObject import SourceFileObject 47from Object.POM.ModuleObject import DepexObject 48from Object.POM.ModuleObject import AsBuildLibraryClassObject 49from Object.POM.ModuleObject import AsBuiltObject 50from PomAdapter.InfPomAlignmentMisc import GenModuleHeaderUserExt 51from PomAdapter.InfPomAlignmentMisc import GenBinaryData 52from Parser import InfParser 53from PomAdapter.DecPomAlignment import DecPomAlignment 54from Common.MultipleWorkspace import MultipleWorkspace as mws 55 56## InfPomAlignment 57# 58# Inherit from ModuleObject 59# 60class InfPomAlignment(ModuleObject): 61 ## Construct of InfPomAlignment 62 # Skip means that UPT don't care the syntax of INF, this may be the not 63 # distributed INF files during creation or the INF files checked for 64 # dependency rule during remove. 65 # 66 def __init__(self, FileName, WorkSpace=None, PackagePath='', Skip=False): 67 ModuleObject.__init__(self) 68 self.Parser = None 69 self.FileName = FileName 70 self.WorkSpace = WorkSpace 71 self.CombinePath = '' 72 self.LibModuleTypeList = [] 73 self.FullPath = '' 74 self.ModulePath = '' 75 self.WorkspaceDir = " " 76 self.CustomMakefile = [] 77 self.UniFileClassObject = None 78 self.SetPackagePath(PackagePath) 79 # 80 # Call GenInfPomObjects function to fill POM object. 81 # 82 if Skip: 83 OrigConfig = Logger.SUPRESS_ERROR 84 Logger.SUPRESS_ERROR = True 85 try: 86 self._GenInfPomObjects(Skip) 87 finally: 88 Logger.SUPRESS_ERROR = OrigConfig 89 else: 90 self._GenInfPomObjects(Skip) 91 92 ## 93 # Generate all POM objects, the original input comes 94 # from INF parser's output 95 # 96 def _GenInfPomObjects(self, Skip): 97 # 98 # Call INF Parser to get information from INF file 99 # 100 self.Parser = InfParser.InfParser(self.FileName, self.WorkSpace) 101 self.FullPath = self.Parser.FullPath 102 self.GetFullPath() 103 self._GenModuleHeader() 104 # 105 # Call GenBinaries after Module Header for Binary INF consideration. 106 # 107 self._GenBinaries() 108 self._GenBuildOptions() 109 self._GenLibraryClasses() 110 self._GenPackages(Skip) 111 self._GenPcds() 112 self._GenSources() 113 self._GenUserExtensions() 114 self._GenGuidProtocolPpis(DT.TAB_GUIDS) 115 self._GenGuidProtocolPpis(DT.TAB_PROTOCOLS) 116 self._GenGuidProtocolPpis(DT.TAB_PPIS) 117 self._GenDepexes() 118 119 ## Convert [Defines] section content to InfDefObject 120 # 121 # Convert [Defines] section content to InfDefObject 122 # 123 # @param Defines The content under [Defines] section 124 # @param ModuleHeader An object of ModuleHeaderClass 125 # @param Arch The supported ARCH 126 # 127 def _GenModuleHeader(self): 128 Logger.Debug(2, "Generate ModuleHeader ...") 129 # 130 # Get all defines information form InfParser Object 131 # 132 RecordSet = self.Parser.InfDefSection.Defines 133 # 134 # Should only have one ArchString Item. 135 # 136 ArchString = RecordSet.keys()[0] 137 ArchList = GetSplitValueList(ArchString, ' ') 138 ArchList = ConvertArchList(ArchList) 139 HasCalledFlag = False 140 # 141 # Get data from Sdict() 142 # 143 ValueList = RecordSet[ArchString] 144 self.SetFileName(self.FileName) 145 self.SetFullPath(self.FullPath) 146 # 147 # The INF's filename (without the directory path or the extension) 148 # must be used for the value of the 149 # ModuleSurfaceArea.Header.Name element 150 # 151 self.SetName(os.path.splitext(os.path.basename(self.FileName))[0]) 152 self.WorkspaceDir = " " 153 # 154 # CombinePath and ModulePath 155 # 156 CombinePath = GetRelativePath(self.FullPath, self.WorkSpace) 157 self.SetCombinePath(CombinePath) 158 ModulePath = os.path.split(CombinePath)[0] 159 ModuleRelativePath = ModulePath 160 if self.GetPackagePath() != '': 161 ModuleRelativePath = GetRelativePath(ModulePath, self.GetPackagePath()) 162 self.SetModulePath(ModuleRelativePath) 163 # 164 # For Define Seciton Items. 165 # 166 DefineObj = ValueList 167 # 168 # Convert UEFI/PI version to decimal number 169 # 170 if DefineObj.GetUefiSpecificationVersion() != None: 171 __UefiVersion = DefineObj.GetUefiSpecificationVersion().GetValue() 172 __UefiVersion = ConvertVersionToDecimal(__UefiVersion) 173 self.SetUefiSpecificationVersion(str(__UefiVersion)) 174 if DefineObj.GetPiSpecificationVersion() != None: 175 __PiVersion = DefineObj.GetPiSpecificationVersion().GetValue() 176 __PiVersion = ConvertVersionToDecimal(__PiVersion) 177 178 self.SetPiSpecificationVersion(str(__PiVersion)) 179 SpecList = DefineObj.GetSpecification() 180 NewSpecList = [] 181 for SpecItem in SpecList: 182 NewSpecList.append((SpecItem[0], ConvertVersionToDecimal(SpecItem[1]))) 183 self.SetSpecList(NewSpecList) 184 185 # 186 # must exist items in INF define section 187 # MODULE_TYPE/BASE_NAME/INF_VERSION/FILE_GUID/VERSION_STRING 188 # 189 if DefineObj.GetModuleType() == None: 190 Logger.Error("InfParser", FORMAT_INVALID, 191 ST.ERR_INF_PARSER_DEFINE_SECTION_MUST_ITEM_NOT_EXIST % ("MODULE_TYPE"), File=self.FullPath) 192 else: 193 self.SetModuleType(DefineObj.GetModuleType().GetValue()) 194 ModuleType = DefineObj.GetModuleType().GetValue() 195 if ModuleType: 196 # 197 # Drivers and applications are not allowed to have a MODULE_TYPE of "BASE". Only 198 # libraries are permitted to a have a MODULE_TYPE of "BASE". 199 # 200 if len(DefineObj.LibraryClass) == 0 and ModuleType == 'BASE': 201 Logger.Error("InfParser", 202 FORMAT_INVALID, 203 ST.ERR_INF_PARSER_MODULETYPE_INVALID, 204 File=self.FullPath, 205 Line=DefineObj.ModuleType.CurrentLine.LineNo, 206 ExtraData=DefineObj.ModuleType.CurrentLine.LineString) 207 self.LibModuleTypeList.append(ModuleType) 208 if DefineObj.GetBaseName() == None: 209 Logger.Error("InfParser", FORMAT_INVALID, 210 ST.ERR_INF_PARSER_DEFINE_SECTION_MUST_ITEM_NOT_EXIST % ("BASE_NAME"), File=self.FullPath) 211 else: 212 self.SetBaseName(DefineObj.GetBaseName().GetValue()) 213 if DefineObj.GetModuleUniFileName(): 214 self.UniFileClassObject = UniFileClassObject([PathClass(DefineObj.GetModuleUniFileName())]) 215 else: 216 self.UniFileClassObject = None 217 if DefineObj.GetInfVersion() == None: 218 Logger.Error("InfParser", FORMAT_INVALID, 219 ST.ERR_INF_PARSER_DEFINE_SECTION_MUST_ITEM_NOT_EXIST % ("INF_VERSION"), File=self.FullPath) 220 else: 221 self.SetVersion(DefineObj.GetInfVersion().GetValue()) 222 if DefineObj.GetFileGuid() == None: 223 Logger.Error("InfParser", FORMAT_INVALID, 224 ST.ERR_INF_PARSER_DEFINE_SECTION_MUST_ITEM_NOT_EXIST % ("FILE_GUID"), File=self.FullPath) 225 else: 226 self.SetGuid(DefineObj.GetFileGuid().GetValue()) 227 if DefineObj.GetVersionString() == None: 228 # 229 # VERSION_STRING is missing from the [Defines] section, tools must assume that the module's version is 0. 230 # 231 self.SetVersion('0') 232 else: 233 # 234 # Get version of INF 235 # 236 if DefineObj.GetVersionString().GetValue() != "": 237 # 238 # EDK2 inf 239 # 240 VersionString = DefineObj.GetVersionString().GetValue() 241 if len(VersionString) > 0: 242 VersionString = ConvertVersionToDecimal(VersionString) 243 self.SetVersion(VersionString) 244 else: 245 # 246 # EDK1 inf 247 # 248 Logger.Error("Parser", PARSER_ERROR, ST.ERR_INF_PARSER_NOT_SUPPORT_EDKI_INF, ExtraData=self.FullPath, 249 RaiseError=Logger.IS_RAISE_ERROR) 250 # 251 # if there is Shadow, Should judge the MODULE_TYPE in 252 # SEC, PEI_CORE and PEIM 253 # 254 if DefineObj.GetShadow(): 255 ModuleTypeValue = DefineObj.GetModuleType().GetValue() 256 if not (ModuleTypeValue == 'SEC' or ModuleTypeValue == 'PEI_CORE' or ModuleTypeValue == 'PEIM'): 257 Logger.Error("InfParser", FORMAT_INVALID, ST.ERR_INF_PARSER_DEFINE_SHADOW_INVALID, File=self.FullPath) 258 259 if DefineObj.GetPcdIsDriver() != None: 260 self.SetPcdIsDriver(DefineObj.GetPcdIsDriver().GetValue()) 261 # 262 # LIBRARY_CLASS 263 # 264 self._GenModuleHeaderLibClass(DefineObj, ArchList) 265 # 266 # CUSTOM_MAKEFILE 267 # 268 self.CustomMakefile = DefineObj.GetCustomMakefile() 269 # 270 # Externs in Defines section 271 # Only one define section, so just call once. 272 # 273 if not HasCalledFlag: 274 self._GenModuleHeaderExterns(DefineObj) 275 HasCalledFlag = True 276 # 277 # each module has only one module header 278 # 279 self.SetSupArchList(ArchList) 280 # 281 # Get Hob/BootMode/EventList information 282 # 283 self._GenSpecialComments() 284 # 285 # put all define statement into user-extension sections 286 # 287 DefinesDictNew = GenModuleHeaderUserExt(DefineObj, ArchString) 288 if DefinesDictNew: 289 UserExtension = CommonObject.UserExtensionObject() 290 UserExtension.SetDefinesDict(DefinesDictNew) 291 UserExtension.SetIdentifier('DefineModifiers') 292 UserExtension.SetUserID('EDK2') 293 self.SetUserExtensionList(self.GetUserExtensionList() + [UserExtension]) 294 # 295 # Get all meta-file header information 296 # the record is list of items formated: 297 # [LineValue, Arch, StartLine, ID, Third] 298 # 299 InfHeaderObj = self.Parser.InfHeader 300 # 301 # Put header information into POM object 302 # 303 if self.UniFileClassObject: 304 Lang = DT.TAB_LANGUAGE_EN_X 305 else: 306 Lang = DT.TAB_LANGUAGE_EN_US 307 if InfHeaderObj.GetAbstract(): 308 self.SetAbstract((Lang, InfHeaderObj.GetAbstract())) 309 if InfHeaderObj.GetDescription(): 310 self.SetDescription((Lang, InfHeaderObj.GetDescription())) 311 if InfHeaderObj.GetCopyright(): 312 self.SetCopyright(('', InfHeaderObj.GetCopyright())) 313 if InfHeaderObj.GetLicense(): 314 self.SetLicense(('', InfHeaderObj.GetLicense())) 315 # 316 # Put Binary header information into POM object 317 # 318 InfBinaryHeaderObj = self.Parser.InfBinaryHeader 319 if InfBinaryHeaderObj.GetAbstract(): 320 self.SetBinaryHeaderAbstract((Lang, InfBinaryHeaderObj.GetAbstract())) 321 if InfBinaryHeaderObj.GetDescription(): 322 self.SetBinaryHeaderDescription((Lang, InfBinaryHeaderObj.GetDescription())) 323 if InfBinaryHeaderObj.GetCopyright(): 324 self.SetBinaryHeaderCopyright(('', InfBinaryHeaderObj.GetCopyright())) 325 if InfBinaryHeaderObj.GetLicense(): 326 self.SetBinaryHeaderLicense(('', InfBinaryHeaderObj.GetLicense())) 327 328 ## GenModuleHeaderLibClass 329 # 330 # 331 def _GenModuleHeaderLibClass(self, DefineObj, ArchList): 332 LibraryList = DefineObj.GetLibraryClass() 333 for LibraryItem in LibraryList: 334 Lib = CommonObject.LibraryClassObject() 335 Lib.SetLibraryClass(LibraryItem.GetLibraryName()) 336 Lib.SetUsage(DT.USAGE_ITEM_PRODUCES) 337 SupModuleList = LibraryItem.GetTypes() 338 self.LibModuleTypeList += SupModuleList 339 Lib.SetSupModuleList(SupModuleList) 340 Lib.SetSupArchList(ArchList) 341 self.SetLibraryClassList(self.GetLibraryClassList() + [Lib]) 342 self.SetIsLibrary(True) 343 self.SetIsLibraryModList(self.GetIsLibraryModList() + SupModuleList) 344 345 ## GenModuleHeaderExterns 346 # 347 # 348 def _GenModuleHeaderExterns(self, DefineObj): 349 EntryPointList = DefineObj.GetEntryPoint() 350 for EntryPoint in EntryPointList: 351 Image = ExternObject() 352 Image.SetEntryPoint(EntryPoint.GetCName()) 353 # 354 # Future enhancement 355 # 356 self.SetExternList(self.GetExternList() + [Image]) 357 # 358 # UNLOAD_IMAGE 359 # 360 UnloadImageList = DefineObj.GetUnloadImages() 361 for UnloadImage in UnloadImageList: 362 Image = ExternObject() 363 # 364 # Future enhancement 365 # 366 Image.SetUnloadImage(UnloadImage.GetCName()) 367 self.SetExternList(self.GetExternList() + [Image]) 368 # 369 # CONSTRUCTOR 370 # 371 ConstructorList = DefineObj.GetConstructor() 372 for ConstructorItem in ConstructorList: 373 Image = ExternObject() 374 # 375 # Future enhancement 376 # 377 Image.SetConstructor(ConstructorItem.GetCName()) 378 self.SetExternList(self.GetExternList() + [Image]) 379 # 380 # DESTRUCTOR 381 # 382 DestructorList = DefineObj.GetDestructor() 383 for DestructorItem in DestructorList: 384 Image = ExternObject() 385 # 386 # Future enhancement 387 # 388 Image.SetDestructor(DestructorItem.GetCName()) 389 self.SetExternList(self.GetExternList() + [Image]) 390 391 ## GenModuleHeaderExterns 392 # BootMode/HOB/Event 393 # 394 def _GenSpecialComments(self): 395 SpecialCommentsList = self.Parser.InfSpecialCommentSection.GetSpecialComments() 396 for Key in SpecialCommentsList: 397 if Key == DT.TYPE_HOB_SECTION: 398 HobList = [] 399 for Item in SpecialCommentsList[Key]: 400 Hob = HobObject() 401 Hob.SetHobType(Item.GetHobType()) 402 Hob.SetUsage(Item.GetUsage()) 403 Hob.SetSupArchList(Item.GetSupArchList()) 404 if Item.GetHelpString(): 405 HelpTextObj = CommonObject.TextObject() 406 if self.UniFileClassObject: 407 HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X) 408 HelpTextObj.SetString(Item.GetHelpString()) 409 Hob.SetHelpTextList([HelpTextObj]) 410 HobList.append(Hob) 411 self.SetHobList(HobList) 412 elif Key == DT.TYPE_EVENT_SECTION: 413 EventList = [] 414 for Item in SpecialCommentsList[Key]: 415 Event = EventObject() 416 Event.SetEventType(Item.GetEventType()) 417 Event.SetUsage(Item.GetUsage()) 418 if Item.GetHelpString(): 419 HelpTextObj = CommonObject.TextObject() 420 if self.UniFileClassObject: 421 HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X) 422 HelpTextObj.SetString(Item.GetHelpString()) 423 Event.SetHelpTextList([HelpTextObj]) 424 EventList.append(Event) 425 self.SetEventList(EventList) 426 elif Key == DT.TYPE_BOOTMODE_SECTION: 427 BootModeList = [] 428 for Item in SpecialCommentsList[Key]: 429 BootMode = BootModeObject() 430 BootMode.SetSupportedBootModes(Item.GetSupportedBootModes()) 431 BootMode.SetUsage(Item.GetUsage()) 432 if Item.GetHelpString(): 433 HelpTextObj = CommonObject.TextObject() 434 if self.UniFileClassObject: 435 HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X) 436 HelpTextObj.SetString(Item.GetHelpString()) 437 BootMode.SetHelpTextList([HelpTextObj]) 438 BootModeList.append(BootMode) 439 self.SetBootModeList(BootModeList) 440 441 ## GenBuildOptions 442 # 443 # Gen BuildOptions of Inf 444 # [<Family>:]<ToolFlag>=Flag 445 # 446 # 447 def _GenBuildOptions(self): 448 Logger.Debug(2, "Generate %s ..." % DT.TAB_BUILD_OPTIONS) 449 # 450 # Get all BuildOptions 451 # 452 BuildOptionsList = self.Parser.InfBuildOptionSection.GetBuildOptions() 453 if not GlobalData.gIS_BINARY_INF: 454 BuildOptionDict = {} 455 for BuildOptionObj in BuildOptionsList: 456 ArchList = BuildOptionObj.GetSupArchList() 457 ArchList = ConvertArchList(ArchList) 458 BuildOptionsContent = BuildOptionObj.GetContent() 459 ArchString = ' '.join(ArchList) 460 if not BuildOptionsContent: 461 continue 462 BuildOptionDict[ArchString] = BuildOptionsContent 463 if not BuildOptionDict: 464 return 465 UserExtension = CommonObject.UserExtensionObject() 466 UserExtension.SetBuildOptionDict(BuildOptionDict) 467 UserExtension.SetIdentifier('BuildOptionModifiers') 468 UserExtension.SetUserID('EDK2') 469 self.SetUserExtensionList(self.GetUserExtensionList() + [UserExtension]) 470 else: 471 # 472 # Not process this information, will be processed in GenBinaries() 473 # 474 pass 475 476 ## GenLibraryClasses 477 # 478 # Get LibraryClass of Inf 479 # <LibraryClassKeyWord>|<LibraryInstance> 480 # 481 # @param ContainerFile: The Inf file full path 482 # 483 def _GenLibraryClasses(self): 484 Logger.Debug(2, "Generate %s ..." % DT.TAB_LIBRARY_CLASSES) 485 if not GlobalData.gIS_BINARY_INF: 486 # 487 # Get all LibraryClasses 488 # 489 LibClassObj = self.Parser.InfLibraryClassSection.LibraryClasses 490 Keys = LibClassObj.keys() 491 for Key in Keys: 492 LibraryClassData = LibClassObj[Key] 493 for Item in LibraryClassData: 494 LibraryClass = CommonObject.LibraryClassObject() 495 LibraryClass.SetUsage(DT.USAGE_ITEM_CONSUMES) 496 LibraryClass.SetLibraryClass(Item.GetLibName()) 497 LibraryClass.SetRecommendedInstance(None) 498 LibraryClass.SetFeatureFlag(Item.GetFeatureFlagExp()) 499 LibraryClass.SetSupArchList(ConvertArchList(Item.GetSupArchList())) 500 LibraryClass.SetSupModuleList(Item.GetSupModuleList()) 501 HelpStringObj = Item.GetHelpString() 502 if HelpStringObj != None: 503 CommentString = GetHelpStringByRemoveHashKey(HelpStringObj.HeaderComments + 504 HelpStringObj.TailComments) 505 HelpTextHeaderObj = CommonObject.TextObject() 506 if self.UniFileClassObject: 507 HelpTextHeaderObj.SetLang(DT.TAB_LANGUAGE_EN_X) 508 HelpTextHeaderObj.SetString(CommentString) 509 LibraryClass.SetHelpTextList([HelpTextHeaderObj]) 510 self.SetLibraryClassList(self.GetLibraryClassList() + [LibraryClass]) 511 512 ## GenPackages 513 # 514 # Gen Packages of Inf 515 # 516 # 517 # @param ContainerFile: The Inf file full path 518 # 519 def _GenPackages(self, Skip): 520 Logger.Debug(2, "Generate %s ..." % DT.TAB_PACKAGES) 521 # 522 # Get all Packages 523 # 524 PackageObj = self.Parser.InfPackageSection.Packages 525 # 526 # Go through each arch 527 # 528 for PackageItemObj in PackageObj: 529 # 530 # Need package information for dependency check usage 531 # 532 PackageDependency = PackageDependencyObject() 533 PackageDependency.SetPackageFilePath(NormPath(PackageItemObj.GetPackageName())) 534 PackageDependency.SetSupArchList(ConvertArchList(PackageItemObj.GetSupArchList())) 535 PackageDependency.SetFeatureFlag(PackageItemObj.GetFeatureFlagExp()) 536 537 PkgInfo = GetPkgInfoFromDec(mws.join(self.WorkSpace, NormPath(PackageItemObj.GetPackageName()))) 538 if PkgInfo[1] and PkgInfo[2]: 539 PackageDependency.SetGuid(PkgInfo[1]) 540 PackageDependency.SetVersion(PkgInfo[2]) 541 elif Skip: 542 continue 543 else: 544 Logger.Error("\nUPT", PARSER_ERROR, 545 ST.ERR_INF_GET_PKG_DEPENDENCY_FAIL % PackageItemObj.GetPackageName(), File=self.FullPath) 546 547 PackageDependencyList = self.GetPackageDependencyList() 548 PackageDependencyList.append(PackageDependency) 549 self.SetPackageDependencyList(PackageDependencyList) 550 551 ## GenPcds 552 # 553 # Gen Pcds of Inf 554 # <TokenSpaceGuidCName>.<PcdCName>[|<Value> [|<FFE>]] 555 # 556 # @param ContainerFile: The Inf file full path 557 # 558 def _GenPcds(self): 559 if not GlobalData.gIS_BINARY_INF: 560 Logger.Debug(2, "Generate %s ..." % DT.TAB_PCDS) 561 # 562 # Get all Pcds 563 # 564 PcdObj = self.Parser.InfPcdSection.Pcds 565 KeysList = PcdObj.keys() 566 # 567 # Go through each arch 568 # 569 for (PcdType, PcdKey) in KeysList: 570 PcdData = PcdObj[PcdType, PcdKey] 571 for PcdItemObj in PcdData: 572 CommentList = PcdItemObj.GetHelpStringList() 573 if CommentList: 574 for CommentItem in CommentList: 575 Pcd = CommonObject.PcdObject() 576 Pcd.SetCName(PcdItemObj.GetCName()) 577 Pcd.SetTokenSpaceGuidCName(PcdItemObj.GetTokenSpaceGuidCName()) 578 Pcd.SetDefaultValue(PcdItemObj.GetDefaultValue()) 579 Pcd.SetItemType(PcdType) 580 Pcd.SetValidUsage(CommentItem.GetUsageItem()) 581 Pcd.SetFeatureFlag(PcdItemObj.GetFeatureFlagExp()) 582 Pcd.SetSupArchList(ConvertArchList(PcdItemObj.GetSupportArchList())) 583 HelpTextObj = CommonObject.TextObject() 584 if self.UniFileClassObject: 585 HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X) 586 HelpTextObj.SetString(CommentItem.GetHelpStringItem()) 587 Pcd.SetHelpTextList([HelpTextObj]) 588 PcdList = self.GetPcdList() 589 PcdList.append(Pcd) 590 self.SetPcdList(PcdList) 591 592 ## GenSources 593 # 594 # Gen Sources of Inf 595 # <Filename>[|<Family>[|<TagName>[|<ToolCode>[|<PcdFeatureFlag>]]]] 596 # 597 # @param ContainerFile: The Inf file full path 598 # 599 def _GenSources(self): 600 Logger.Debug(2, "Generate %s ..." % DT.TAB_SOURCES) 601 602 # 603 # Get all SourceFiles 604 # 605 SourceObj = self.Parser.InfSourcesSection.Sources 606 DataList = SourceObj.keys() 607 # 608 # Go through each arch 609 # 610 SourceList = [] 611 for Key in DataList: 612 SourceData = SourceObj[Key] 613 for Item in SourceData: 614 SourceFile = Item.GetSourceFileName() 615 Family = Item.GetFamily() 616 FeatureFlag = Item.GetFeatureFlagExp() 617 SupArchList = ConvertArchList(Item.GetSupArchList()) 618 SupArchList.sort() 619 Source = SourceFileObject() 620 Source.SetSourceFile(SourceFile) 621 Source.SetFamily(Family) 622 Source.SetFeatureFlag(FeatureFlag) 623 Source.SetSupArchList(SupArchList) 624 SourceList.append(Source) 625 626 self.SetSourceFileList(self.GetSourceFileList() + SourceList) 627 628 629 ## GenUserExtensions 630 # 631 # Gen UserExtensions of Inf 632 # 633 def _GenUserExtensions(self): 634 # 635 # UserExtensions 636 # 637 UserExtensionObj = self.Parser.InfUserExtensionSection.UserExtension 638 Keys = UserExtensionObj.keys() 639 640 for Key in Keys: 641 UserExtensionData = UserExtensionObj[Key] 642 for UserExtensionDataObj in UserExtensionData: 643 UserExtension = CommonObject.UserExtensionObject() 644 UserId = UserExtensionDataObj.GetUserId() 645 if UserId.startswith('"') and UserId.endswith('"'): 646 UserId = UserId[1:-1] 647 UserExtension.SetUserID(UserId) 648 Identifier = UserExtensionDataObj.GetIdString() 649 if Identifier.startswith('"') and Identifier.endswith('"'): 650 Identifier = Identifier[1:-1] 651 # 652 # Generate miscellaneous files on INF file 653 # 654 if UserId == 'TianoCore' and Identifier == 'ExtraFiles': 655 self._GenMiscFiles(UserExtensionDataObj.GetContent()) 656 UserExtension.SetIdentifier(Identifier) 657 UserExtension.SetStatement(UserExtensionDataObj.GetContent()) 658 UserExtension.SetSupArchList(ConvertArchList(UserExtensionDataObj.GetSupArchList())) 659 self.SetUserExtensionList(self.GetUserExtensionList() + [UserExtension]) 660 661 # 662 # Gen UserExtensions of TianoCore."BinaryHeader" 663 # 664 665 #Get Binary header from INF file 666 BinaryAbstractList = self.BinaryHeaderAbstractList 667 BinaryDescriptionList = self.BinaryHeaderDescriptionList 668 BinaryCopyrightList = self.BinaryHeaderCopyrightList 669 BinaryLicenseList = self.BinaryHeaderLicenseList 670 #Get Binary header from UNI file 671 # Initialize UniStrDict, the top keys are language codes 672 UniStrDict = {} 673 if self.UniFileClassObject: 674 UniStrDict = self.UniFileClassObject.OrderedStringList 675 for Lang in UniStrDict: 676 for StringDefClassObject in UniStrDict[Lang]: 677 Lang = GetLanguageCode1766(Lang) 678 if StringDefClassObject.StringName == DT.TAB_INF_BINARY_ABSTRACT: 679 BinaryAbstractList.append((Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue))) 680 if StringDefClassObject.StringName == DT.TAB_INF_BINARY_DESCRIPTION: 681 BinaryDescriptionList.append((Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue))) 682 if BinaryAbstractList or BinaryDescriptionList or BinaryCopyrightList or BinaryLicenseList: 683 BinaryUserExtension = CommonObject.UserExtensionObject() 684 BinaryUserExtension.SetBinaryAbstract(BinaryAbstractList) 685 BinaryUserExtension.SetBinaryDescription(BinaryDescriptionList) 686 BinaryUserExtension.SetBinaryCopyright(BinaryCopyrightList) 687 BinaryUserExtension.SetBinaryLicense(BinaryLicenseList) 688 BinaryUserExtension.SetIdentifier(DT.TAB_BINARY_HEADER_IDENTIFIER) 689 BinaryUserExtension.SetUserID(DT.TAB_BINARY_HEADER_USERID) 690 self.SetUserExtensionList(self.GetUserExtensionList() + [BinaryUserExtension]) 691 692 def _GenDepexesList(self, SmmDepexList, DxeDepexList, PeiDepexList): 693 if SmmDepexList: 694 self.SetSmmDepex(SmmDepexList) 695 if DxeDepexList: 696 self.SetDxeDepex(DxeDepexList) 697 if PeiDepexList: 698 self.SetPeiDepex(PeiDepexList) 699 700 ## GenDepexes 701 # 702 # Gen Depex of Inf 703 # 704 # @param ContainerFile: The Inf file full path 705 # 706 def _GenDepexes(self): 707 Logger.Debug(2, "Generate %s ..." % DT.TAB_DEPEX) 708 709 PEI_LIST = [DT.SUP_MODULE_PEIM] 710 SMM_LIST = [DT.SUP_MODULE_DXE_SMM_DRIVER] 711 DXE_LIST = [DT.SUP_MODULE_DXE_DRIVER, DT.SUP_MODULE_DXE_SAL_DRIVER, 712 DT.SUP_MODULE_DXE_RUNTIME_DRIVER] 713 714 IsLibraryClass = self.GetIsLibrary() 715 # 716 # Get all Depexes 717 # 718 DepexData = self.Parser.InfDepexSection.GetDepex() 719 SmmDepexList = [] 720 DxeDepexList = [] 721 PeiDepexList = [] 722 for Depex in DepexData: 723 ModuleType = Depex.GetModuleType() 724 ModuleTypeList = [] 725 if IsLibraryClass: 726 if self.GetModuleType() == 'BASE' and not ModuleType: 727 Logger.Error("\nMkPkg", PARSER_ERROR, 728 ST.ERR_INF_PARSER_DEPEX_SECTION_INVALID_FOR_BASE_LIBRARY_CLASS, 729 self.GetFullPath(), RaiseError=True) 730 if self.GetModuleType() != 'BASE' and not self.GetIsLibraryModList(): 731 Logger.Error("\nMkPkg", PARSER_ERROR, ST.ERR_INF_PARSER_DEPEX_SECTION_INVALID_FOR_LIBRARY_CLASS, 732 self.GetFullPath(), RaiseError=True) 733 if self.GetModuleType() != 'BASE' and ModuleType and ModuleType not in self.GetIsLibraryModList(): 734 Logger.Error("\nMkPkg", PARSER_ERROR, ST.ERR_INF_PARSER_DEPEX_SECTION_NOT_DETERMINED, 735 self.GetFullPath(), RaiseError=True) 736 if ModuleType: 737 ModuleTypeList = [ModuleType] 738 else: 739 for ModuleTypeInList in self.GetIsLibraryModList(): 740 if ModuleTypeInList in DT.VALID_DEPEX_MODULE_TYPE_LIST: 741 ModuleTypeList.append(ModuleTypeInList) 742 if not ModuleTypeList: 743 Logger.Error("\nMkPkg", PARSER_ERROR, ST.ERR_INF_PARSER_DEPEX_SECTION_NOT_DETERMINED, 744 self.GetFullPath(), RaiseError=True) 745 else: 746 if not ModuleType: 747 ModuleType = self.ModuleType 748 if ModuleType not in DT.VALID_DEPEX_MODULE_TYPE_LIST: 749 Logger.Error("\nMkPkg", PARSER_ERROR, 750 ST.ERR_INF_PARSER_DEPEX_SECTION_MODULE_TYPE_ERROR % (ModuleType), 751 self.GetFullPath(), RaiseError=True) 752 if ModuleType != self.ModuleType: 753 Logger.Error("\nMkPkg", PARSER_ERROR, ST.ERR_INF_PARSER_DEPEX_SECTION_NOT_DETERMINED, 754 self.GetFullPath(), RaiseError=True) 755 ModuleTypeList = [ModuleType] 756 for ModuleType in ModuleTypeList: 757 DepexIns = DepexObject() 758 DepexIns.SetDepex(Depex.GetDepexContent()) 759 if IsLibraryClass: 760 DepexIns.SetModuleType(ModuleType) 761 else: 762 if Depex.GetModuleType(): 763 DepexIns.SetModuleType(Depex.GetModuleType()) 764 DepexIns.SetSupArchList(ConvertArchList([Depex.GetSupArch()])) 765 DepexIns.SetFeatureFlag(Depex.GetFeatureFlagExp()) 766 if Depex.HelpString: 767 HelpIns = CommonObject.TextObject() 768 if self.UniFileClassObject: 769 HelpIns.SetLang(DT.TAB_LANGUAGE_EN_X) 770 HelpIns.SetString(GetHelpStringByRemoveHashKey(Depex.HelpString)) 771 DepexIns.SetHelpText(HelpIns) 772 773 if ModuleType in SMM_LIST: 774 SmmDepexList.append(DepexIns) 775 if ModuleType in DXE_LIST: 776 DxeDepexList.append(DepexIns) 777 if ModuleType in PEI_LIST: 778 PeiDepexList.append(DepexIns) 779 if ModuleType == DT.SUP_MODULE_UEFI_DRIVER: 780 if IsLibraryClass: 781 DxeDepexList.append(DepexIns) 782 else: 783 Logger.Error("\nMkPkg", PARSER_ERROR, ST.ERR_INF_PARSER_DEPEX_SECTION_INVALID_FOR_DRIVER, 784 self.GetFullPath(), RaiseError=True) 785 786 #End of for ModuleType in ModuleTypeList 787 self._GenDepexesList(SmmDepexList, DxeDepexList, PeiDepexList) 788 #End of for Depex in DepexData 789 790 ## GenBinaries 791 # 792 # Gen Binary of Inf, must be called after Pcd/Library is generated 793 # <FileType>|<Filename>|<Target>[|<TokenSpaceGuidCName>.<PcdCName>] 794 # 795 # @param ContainerFile: The Inf file full path 796 # 797 def _GenBinaries(self): 798 Logger.Debug(2, "Generate %s ..." % DT.TAB_BINARIES) 799 BinariesDict = {} 800 801 # 802 # Get all Binary data 803 # 804 BinaryObj = self.Parser.InfBinariesSection.GetBinary() 805 806 BinaryData = BinaryObj.keys() 807 808 # 809 # If the INF file does not contain a [Sources] section, and the INF file does contain a [Binaries] section, 810 # then the ModuleSurfaceArea.BinaryModule attribute must be set to true. Otherwise, do not use the attribute 811 # 812 if BinaryObj and not self.Parser.InfSourcesSection.GetSources(): 813 self.BinaryModule = True 814 else: 815 self.BinaryModule = False 816 817 BinaryFileObjectList = [] 818 AsBuildLibraryClassList = [] 819 AsBuildBuildOptionList = [] 820 AsBuildIns = AsBuiltObject() 821 # 822 # Library AsBuild Info 823 # 824 for LibItem in self.Parser.InfLibraryClassSection.GetLibraryClasses(): 825 AsBuildLibIns = AsBuildLibraryClassObject() 826 AsBuildLibIns.SetLibGuid(LibItem.GetFileGuid()) 827 AsBuildLibIns.SetLibVersion(LibItem.GetVersion()) 828 AsBuildLibIns.SetSupArchList(LibItem.GetSupArchList()) 829 AsBuildLibraryClassList.append(AsBuildLibIns) 830 AsBuildIns.SetLibraryInstancesList(AsBuildLibraryClassList) 831 832 # 833 # BuildOption AsBuild Info 834 # 835 for BuildOptionItem in self.Parser.InfBuildOptionSection.GetBuildOptions(): 836 AsBuildBuildOptionList.append(BuildOptionItem) 837 AsBuildIns.SetBuildFlagsList(AsBuildBuildOptionList) 838 839 # 840 # PatchPcd and PcdEx 841 # 842 AsBuildIns = self._GenAsBuiltPcds(self.Parser.InfPcdSection.GetPcds(), AsBuildIns) 843 844 # 845 # Parse the DEC file that contains the GUID value of the GUID CName which is used by 846 # SUBTYPE_GUID type binary file in the Binaries section in the INF file 847 # 848 DecObjList = [] 849 if not self.PackagePath: 850 WorkSpace = os.path.normpath(self.WorkSpace) 851 TempPath = ModulePath = os.path.normpath(self.ModulePath) 852 while ModulePath: 853 TempPath = ModulePath 854 ModulePath = os.path.dirname(ModulePath) 855 PackageName = TempPath 856 DecFilePath = os.path.normpath(os.path.join(WorkSpace, PackageName)) 857 if DecFilePath: 858 for File in os.listdir(DecFilePath): 859 if File.upper().endswith('.DEC'): 860 DecFileFullPath = os.path.normpath(os.path.join(DecFilePath, File)) 861 DecObjList.append(DecPomAlignment(DecFileFullPath, self.WorkSpace)) 862 863 864 BinariesDict, AsBuildIns, BinaryFileObjectList = GenBinaryData(BinaryData, BinaryObj, 865 BinariesDict, 866 AsBuildIns, 867 BinaryFileObjectList, 868 self.GetSupArchList(), 869 self.BinaryModule, 870 DecObjList) 871 872 BinariesDict2 = {} 873 for Key in BinariesDict: 874 ValueList = BinariesDict[Key] 875 if len(ValueList) > 1: 876 BinariesDict2[Key] = ValueList 877 else: 878 # 879 # if there is no TagName, ToolCode, HelpStr, 880 # then do not need to put them into userextension 881 # 882 (Target, Family, TagName, HelpStr) = ValueList[0] 883 if not (Target or Family or TagName or HelpStr): 884 continue 885 else: 886 BinariesDict2[Key] = ValueList 887 888 self.SetBinaryFileList(self.GetBinaryFileList() + BinaryFileObjectList) 889 890 if BinariesDict2: 891 UserExtension = CommonObject.UserExtensionObject() 892 UserExtension.SetBinariesDict(BinariesDict2) 893 UserExtension.SetIdentifier('BinaryFileModifiers') 894 UserExtension.SetUserID('EDK2') 895 self.SetUserExtensionList(self.GetUserExtensionList() + [UserExtension]) 896 897 ## GenAsBuiltPcds 898 # 899 # 900 def _GenAsBuiltPcds(self, PcdList, AsBuildIns): 901 AsBuildPatchPcdList = [] 902 AsBuildPcdExList = [] 903 # 904 # Pcd AsBuild Info 905 # 906 for PcdItem in PcdList: 907 if PcdItem[0].upper() == DT.TAB_INF_PATCH_PCD.upper(): 908 PcdItemObj = PcdItem[1] 909 Pcd = CommonObject.PcdObject() 910 Pcd.SetCName(PcdItemObj.GetCName()) 911 Pcd.SetTokenSpaceGuidCName(PcdItemObj.GetTokenSpaceGuidCName()) 912 if PcdItemObj.GetTokenSpaceGuidValue() == '' and self.BinaryModule: 913 Logger.Error("\nMkPkg", 914 PARSER_ERROR, 915 ST.ERR_ASBUILD_PCD_TOKENSPACE_GUID_VALUE_MISS % \ 916 (PcdItemObj.GetTokenSpaceGuidCName()), 917 self.GetFullPath(), RaiseError=True) 918 else: 919 Pcd.SetTokenSpaceGuidValue(PcdItemObj.GetTokenSpaceGuidValue()) 920 if (PcdItemObj.GetToken() == '' or PcdItemObj.GetDatumType() == '') and self.BinaryModule: 921 Logger.Error("\nMkPkg", 922 PARSER_ERROR, 923 ST.ERR_ASBUILD_PCD_DECLARITION_MISS % \ 924 (PcdItemObj.GetTokenSpaceGuidCName() + '.' + PcdItemObj.GetCName()), 925 self.GetFullPath(), RaiseError=True) 926 Pcd.SetToken(PcdItemObj.GetToken()) 927 Pcd.SetDatumType(PcdItemObj.GetDatumType()) 928 Pcd.SetMaxDatumSize(PcdItemObj.GetMaxDatumSize()) 929 Pcd.SetDefaultValue(PcdItemObj.GetDefaultValue()) 930 Pcd.SetOffset(PcdItemObj.GetOffset()) 931 Pcd.SetItemType(PcdItem[0]) 932 Pcd.SetFeatureFlag(PcdItemObj.GetFeatureFlagExp()) 933 Pcd.SetSupArchList(ConvertArchList(PcdItemObj.GetSupportArchList())) 934 Pcd.SetValidUsage(PcdItemObj.GetValidUsage()) 935 for CommentItem in PcdItemObj.GetHelpStringList(): 936 HelpTextObj = CommonObject.TextObject() 937 if self.UniFileClassObject: 938 HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X) 939 HelpTextObj.SetString(CommentItem.GetHelpStringItem()) 940 Pcd.SetHelpTextList(Pcd.GetHelpTextList() + [HelpTextObj]) 941 AsBuildPatchPcdList.append(Pcd) 942 elif PcdItem[0].upper() == DT.TAB_INF_PCD_EX.upper(): 943 PcdItemObj = PcdItem[1] 944 Pcd = CommonObject.PcdObject() 945 Pcd.SetTokenSpaceGuidValue(PcdItemObj.GetTokenSpaceGuidValue()) 946 Pcd.SetToken(PcdItemObj.GetToken()) 947 Pcd.SetDatumType(PcdItemObj.GetDatumType()) 948 Pcd.SetMaxDatumSize(PcdItemObj.GetMaxDatumSize()) 949 Pcd.SetDefaultValue(PcdItemObj.GetDefaultValue()) 950 Pcd.SetItemType(PcdItem[0]) 951 Pcd.SetFeatureFlag(PcdItemObj.GetFeatureFlagExp()) 952 Pcd.SetSupArchList(ConvertArchList(PcdItemObj.GetSupportArchList())) 953 Pcd.SetValidUsage(PcdItemObj.GetValidUsage()) 954 for CommentItem in PcdItemObj.GetHelpStringList(): 955 HelpTextObj = CommonObject.TextObject() 956 if self.UniFileClassObject: 957 HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X) 958 HelpTextObj.SetString(CommentItem.GetHelpStringItem()) 959 Pcd.SetHelpTextList(Pcd.GetHelpTextList() + [HelpTextObj]) 960 AsBuildPcdExList.append(Pcd) 961 AsBuildIns.SetPatchPcdList(AsBuildPatchPcdList) 962 AsBuildIns.SetPcdExList(AsBuildPcdExList) 963 964 return AsBuildIns 965 966 ## GenGuidProtocolPpis 967 # 968 # Gen Guids/Protocol/Ppis of INF 969 # <CName>=<GuidValue> 970 # 971 def _GenGuidProtocolPpis(self, Type): 972 Logger.Debug(2, "Generate %s ..." % Type) 973 # 974 # Get all Guid/Protocol/Ppis data 975 # 976 GuidObj = self.Parser.InfGuidSection.GetGuid() 977 ProtocolObj = self.Parser.InfProtocolSection.GetProtocol() 978 PpisObj = self.Parser.InfPpiSection.GetPpi() 979 980 GuidProtocolPpiList = [] 981 982 if Type == DT.TAB_GUIDS: 983 GuidData = GuidObj.keys() 984 for Item in GuidData: 985 CommentList = Item.GetCommentList() 986 # 987 # Depend on CommentList content 988 # generate muti-guid-obj 989 # 990 if CommentList: 991 for GuidComentItem in CommentList: 992 ListObject = CommonObject.GuidObject() 993 ListObject.SetGuidTypeList([GuidComentItem.GetGuidTypeItem()]) 994 ListObject.SetVariableName(GuidComentItem.GetVariableNameItem()) 995 ListObject.SetUsage(GuidComentItem.GetUsageItem()) 996 ListObject.SetName(Item.GetName()) 997 ListObject.SetCName(Item.GetName()) 998 ListObject.SetSupArchList(ConvertArchList(Item.GetSupArchList())) 999 ListObject.SetFeatureFlag(Item.GetFeatureFlagExp()) 1000 HelpString = GuidComentItem.GetHelpStringItem() 1001 if HelpString.strip(): 1002 HelpTxtTailObj = CommonObject.TextObject() 1003 if self.UniFileClassObject: 1004 HelpTxtTailObj.SetLang(DT.TAB_LANGUAGE_EN_X) 1005 HelpTxtTailObj.SetString(HelpString) 1006 ListObject.SetHelpTextList([HelpTxtTailObj]) 1007 1008 GuidProtocolPpiList.append(ListObject) 1009 elif Type == DT.TAB_PROTOCOLS: 1010 ProtocolData = ProtocolObj.keys() 1011 for Item in ProtocolData: 1012 CommentList = Item.GetCommentList() 1013 for CommentItem in CommentList: 1014 ListObject = CommonObject.ProtocolObject() 1015 ListObject.SetCName(Item.GetName()) 1016 ListObject.SetSupArchList(ConvertArchList(Item.GetSupArchList())) 1017 ListObject.SetFeatureFlag(Item.GetFeatureFlagExp()) 1018 ListObject.SetNotify(CommentItem.GetNotify()) 1019 ListObject.SetUsage(CommentItem.GetUsageItem()) 1020 HelpString = CommentItem.GetHelpStringItem() 1021 if HelpString.strip(): 1022 HelpTxtObj = CommonObject.TextObject() 1023 if self.UniFileClassObject: 1024 HelpTxtObj.SetLang(DT.TAB_LANGUAGE_EN_X) 1025 HelpTxtObj.SetString(HelpString) 1026 ListObject.SetHelpTextList([HelpTxtObj]) 1027 GuidProtocolPpiList.append(ListObject) 1028 elif Type == DT.TAB_PPIS: 1029 PpiData = PpisObj.keys() 1030 for Item in PpiData: 1031 CommentList = Item.GetCommentList() 1032 for CommentItem in CommentList: 1033 ListObject = CommonObject.PpiObject() 1034 ListObject.SetCName(Item.GetName()) 1035 ListObject.SetSupArchList(ConvertArchList(Item.GetSupArchList())) 1036 ListObject.SetFeatureFlag(Item.GetFeatureFlagExp()) 1037 ListObject.SetNotify(CommentItem.GetNotify()) 1038 ListObject.SetUsage(CommentItem.GetUsage()) 1039 HelpString = CommentItem.GetHelpStringItem() 1040 if HelpString.strip(): 1041 HelpTextObj = CommonObject.TextObject() 1042 if self.UniFileClassObject: 1043 HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X) 1044 HelpTextObj.SetString(HelpString) 1045 ListObject.SetHelpTextList([HelpTextObj]) 1046 GuidProtocolPpiList.append(ListObject) 1047 1048 if Type == DT.TAB_GUIDS: 1049 self.SetGuidList(self.GetGuidList() + GuidProtocolPpiList) 1050 elif Type == DT.TAB_PROTOCOLS: 1051 self.SetProtocolList(self.GetProtocolList() + GuidProtocolPpiList) 1052 elif Type == DT.TAB_PPIS: 1053 self.SetPpiList(self.GetPpiList() + GuidProtocolPpiList) 1054 1055 ## GenMiscFiles 1056 # 1057 # Gen MiscellaneousFiles of Inf 1058 # 1059 # @param ContainerFile: The Inf file full path 1060 # 1061 def _GenMiscFiles(self, Content): 1062 MiscFileObj = CommonObject.MiscFileObject() 1063 for Line in Content.splitlines(): 1064 FileName = '' 1065 if '#' in Line: 1066 FileName = Line[:Line.find('#')] 1067 else: 1068 FileName = Line 1069 if FileName: 1070 if IsValidPath(FileName, GlobalData.gINF_MODULE_DIR): 1071 FileObj = CommonObject.FileObject() 1072 FileObj.SetURI(FileName) 1073 MiscFileObj.SetFileList(MiscFileObj.GetFileList()+[FileObj]) 1074 else: 1075 Logger.Error("InfParser", 1076 FORMAT_INVALID, 1077 ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(Line), 1078 File=GlobalData.gINF_MODULE_NAME, 1079 ExtraData=Line) 1080 self.SetMiscFileList(self.GetMiscFileList()+[MiscFileObj]) 1081 1082