]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/PomAdapter/DecPomAlignment.py
BaseTools/UPT: Porting UPT Tool from Python2 to Python3
[mirror_edk2.git] / BaseTools / Source / Python / UPT / PomAdapter / DecPomAlignment.py
CommitLineData
4234283c
LG
1## @file DecPomAlignment.py\r
2# This file contained the adapter for convert INF parser object to POM Object\r
3#\r
f7496d71 4# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
4234283c 5#\r
f7496d71
LG
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
4234283c
LG
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
16DecPomAlignment\r
17'''\r
18\r
19##\r
20# Import Modules\r
21#\r
22import os.path\r
23from os import sep\r
24import platform\r
25\r
421ccda3 26import re\r
4234283c
LG
27import Logger.Log as Logger\r
28from Logger import StringTable as ST\r
29from Logger.ToolError import UPT_MUL_DEC_ERROR\r
421ccda3 30from Logger.ToolError import FORMAT_INVALID\r
4234283c
LG
31\r
32from Library.Parsing import NormPath\r
33from Library.DataType import ARCH_LIST\r
34from Library.DataType import TAB_GUIDS\r
35from Library.DataType import TAB_PROTOCOLS\r
36from Library.DataType import TAB_PPIS\r
37from Library.DataType import TAB_DEC_DEFINES_PACKAGE_NAME\r
38from Library.DataType import TAB_DEC_DEFINES_PACKAGE_GUID\r
39from Library.DataType import TAB_DEC_DEFINES_PACKAGE_VERSION\r
40from Library.DataType import TAB_DEC_DEFINES_DEC_SPECIFICATION\r
421ccda3 41from Library.DataType import TAB_DEC_DEFINES_PKG_UNI_FILE\r
4234283c 42from Library.DataType import TAB_ARCH_COMMON\r
4234283c 43from Library.DataType import TAB_INCLUDES\r
4234283c
LG
44from Library.DataType import TAB_LIBRARY_CLASSES\r
45from Library.DataType import TAB_PCDS\r
46from Library.DataType import TAB_PCDS_FIXED_AT_BUILD_NULL\r
47from Library.DataType import TAB_PCDS_PATCHABLE_IN_MODULE_NULL\r
48from Library.DataType import TAB_PCDS_FEATURE_FLAG_NULL\r
49from Library.DataType import TAB_PCDS_DYNAMIC_EX_NULL\r
50from Library.DataType import TAB_PCDS_DYNAMIC_NULL\r
51from Library.DataType import TAB_PTR_TYPE_PCD\r
52from Library.DataType import ITEM_UNDEFINED\r
421ccda3
HC
53from Library.DataType import TAB_DEC_BINARY_ABSTRACT\r
54from Library.DataType import TAB_DEC_BINARY_DESCRIPTION\r
55from Library.DataType import TAB_LANGUAGE_EN_US\r
56from Library.DataType import TAB_BINARY_HEADER_IDENTIFIER\r
57from Library.DataType import TAB_BINARY_HEADER_USERID\r
58from Library.DataType import TAB_LANGUAGE_EN_X\r
59from Library.DataType import TAB_LANGUAGE_EN\r
60from Library.DataType import TAB_STR_TOKENCNAME\r
61from Library.DataType import TAB_STR_TOKENPROMPT\r
62from Library.DataType import TAB_STR_TOKENHELP\r
63from Library.DataType import TAB_STR_TOKENERR\r
64from Library.DataType import TAB_HEX_START\r
65from Library.DataType import TAB_SPLIT\r
645a5128 66import Library.DataType as DT\r
421ccda3
HC
67from Library.CommentParsing import ParseHeaderCommentSection\r
68from Library.CommentParsing import ParseGenericComment\r
4234283c
LG
69from Library.CommentParsing import ParseDecPcdGenericComment\r
70from Library.CommentParsing import ParseDecPcdTailComment\r
71from Library.Misc import GetFiles\r
72from Library.Misc import Sdict\r
421ccda3
HC
73from Library.Misc import GetRelativePath\r
74from Library.Misc import PathClass\r
75from Library.Misc import ValidateUNIFilePath\r
76from Library.UniClassObject import UniFileClassObject\r
77from Library.UniClassObject import ConvertSpecialUnicodes\r
78from Library.UniClassObject import GetLanguageCode1766\r
79from Library.ParserValidate import IsValidPath\r
4234283c 80from Parser.DecParser import Dec\r
4234283c
LG
81from Object.POM.PackageObject import PackageObject\r
82from Object.POM.CommonObject import UserExtensionObject\r
83from Object.POM.CommonObject import IncludeObject\r
84from Object.POM.CommonObject import GuidObject\r
85from Object.POM.CommonObject import ProtocolObject\r
86from Object.POM.CommonObject import PpiObject\r
87from Object.POM.CommonObject import LibraryClassObject\r
88from Object.POM.CommonObject import PcdObject\r
89from Object.POM.CommonObject import TextObject\r
421ccda3
HC
90from Object.POM.CommonObject import MiscFileObject\r
91from Object.POM.CommonObject import FileObject\r
4234283c
LG
92\r
93\r
94## DecPomAlignment\r
95#\r
96# Inherited from PackageObject\r
97#\r
98class DecPomAlignment(PackageObject):\r
99 def __init__(self, Filename, WorkspaceDir = None, CheckMulDec = False):\r
100 PackageObject.__init__(self)\r
101 self.UserExtensions = ''\r
102 self.WorkspaceDir = WorkspaceDir\r
103 self.SupArchList = ARCH_LIST\r
104 self.CheckMulDec = CheckMulDec\r
105 self.DecParser = None\r
421ccda3
HC
106 self.UniFileClassObject = None\r
107 self.PcdDefaultValueDict = {}\r
f7496d71 108\r
4234283c
LG
109 #\r
110 # Load Dec file\r
111 #\r
112 self.LoadDecFile(Filename)\r
f7496d71 113\r
4234283c
LG
114 #\r
115 # Transfer to Package Object if IsToPackage is True\r
116 #\r
117 self.DecToPackage()\r
f7496d71 118\r
4234283c
LG
119 ## Load Dec file\r
120 #\r
121 # Load the file if it exists\r
122 #\r
123 # @param Filename: Input value for filename of Dec file\r
124 #\r
125 def LoadDecFile(self, Filename):\r
126 #\r
127 # Insert a record for file\r
128 #\r
129 Filename = NormPath(Filename)\r
130 (Path, Name) = os.path.split(Filename)\r
131 self.SetFullPath(Filename)\r
132 self.SetRelaPath(Path)\r
133 self.SetFileName(Name)\r
f7496d71 134 self.SetPackagePath(GetRelativePath(Path, self.WorkspaceDir))\r
421ccda3 135 self.SetCombinePath(GetRelativePath(Filename, self.WorkspaceDir))\r
f7496d71 136\r
4234283c 137 self.DecParser = Dec(Filename)\r
f7496d71 138\r
4234283c 139 ## Transfer to Package Object\r
f7496d71 140 #\r
4234283c
LG
141 # Transfer all contents of a Dec file to a standard Package Object\r
142 #\r
143 def DecToPackage(self):\r
144 #\r
145 # Init global information for the file\r
146 #\r
147 ContainerFile = self.GetFullPath()\r
f7496d71 148\r
4234283c
LG
149 #\r
150 # Generate Package Header\r
151 #\r
152 self.GenPackageHeader(ContainerFile)\r
f7496d71 153\r
4234283c
LG
154 #\r
155 # Generate Includes\r
156 #\r
157 self.GenIncludes(ContainerFile)\r
158\r
159 #\r
160 # Generate Guids\r
161 #\r
162 self.GenGuidProtocolPpis(TAB_GUIDS, ContainerFile)\r
163\r
164 #\r
165 # Generate Protocols\r
166 #\r
167 self.GenGuidProtocolPpis(TAB_PROTOCOLS, ContainerFile)\r
168\r
169 #\r
170 # Generate Ppis\r
171 #\r
172 self.GenGuidProtocolPpis(TAB_PPIS, ContainerFile)\r
f7496d71 173\r
4234283c
LG
174 #\r
175 # Generate LibraryClasses\r
176 #\r
177 self.GenLibraryClasses(ContainerFile)\r
f7496d71 178\r
4234283c
LG
179 #\r
180 # Generate Pcds\r
181 #\r
182 self.GenPcds(ContainerFile)\r
f7496d71 183\r
4234283c 184 #\r
f7496d71 185 # Generate Module File list, will be used later on to generate\r
4234283c
LG
186 # distribution\r
187 #\r
188 self.GenModuleFileList(ContainerFile)\r
f7496d71 189\r
4234283c
LG
190 #\r
191 # Generate user extensions\r
192 #\r
193 self.GenUserExtensions()\r
f7496d71 194\r
421ccda3 195 ## Generate user extension\r
4234283c
LG
196 #\r
197 #\r
198 def GenUserExtensions(self):\r
199 UEObj = self.DecParser.GetUserExtensionSectionObject()\r
200 UEList = UEObj.GetAllUserExtensions()\r
201 for Item in UEList:\r
202 if not Item.UserString:\r
203 continue\r
204 UserExtension = UserExtensionObject()\r
205 UserId = Item.UserId\r
206 if UserId.startswith('"') and UserId.endswith('"'):\r
207 UserId = UserId[1:-1]\r
208 UserExtension.SetUserID(UserId)\r
209 Identifier = Item.IdString\r
210 if Identifier.startswith('"') and Identifier.endswith('"'):\r
211 Identifier = Identifier[1:-1]\r
421ccda3
HC
212 #\r
213 # Generate miscellaneous files of DEC file\r
214 #\r
215 if UserId == 'TianoCore' and Identifier == 'ExtraFiles':\r
216 self.GenMiscFiles(Item.UserString)\r
4234283c
LG
217 UserExtension.SetIdentifier(Identifier)\r
218 UserExtension.SetStatement(Item.UserString)\r
219 UserExtension.SetSupArchList(\r
220 Item.ArchAndModuleType\r
221 )\r
222 self.SetUserExtensionList(\r
223 self.GetUserExtensionList() + [UserExtension]\r
224 )\r
645a5128
HC
225\r
226 # Add Private sections to UserExtension\r
227 if self.DecParser.GetPrivateSections():\r
228 PrivateUserExtension = UserExtensionObject()\r
229 PrivateUserExtension.SetStatement(self.DecParser.GetPrivateSections())\r
230 PrivateUserExtension.SetIdentifier(DT.TAB_PRIVATE)\r
231 PrivateUserExtension.SetUserID(DT.TAB_INTEL)\r
232 self.SetUserExtensionList(self.GetUserExtensionList() + [PrivateUserExtension])\r
f7496d71 233\r
421ccda3
HC
234 ## Generate miscellaneous files on DEC file\r
235 #\r
236 #\r
237 def GenMiscFiles(self, Content):\r
238 MiscFileObj = MiscFileObject()\r
239 for Line in Content.splitlines():\r
240 FileName = ''\r
241 if '#' in Line:\r
242 FileName = Line[:Line.find('#')]\r
243 else:\r
244 FileName = Line\r
245 if FileName:\r
246 if IsValidPath(FileName, self.GetRelaPath()):\r
247 FileObj = FileObject()\r
248 FileObj.SetURI(FileName)\r
249 MiscFileObj.SetFileList(MiscFileObj.GetFileList()+[FileObj])\r
250 else:\r
f7496d71 251 Logger.Error("InfParser",\r
421ccda3
HC
252 FORMAT_INVALID,\r
253 ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(Line),\r
254 File=self.GetFileName(),\r
f7496d71
LG
255 ExtraData=Line)\r
256 self.SetMiscFileList(self.GetMiscFileList()+[MiscFileObj])\r
257\r
4234283c
LG
258 ## Generate Package Header\r
259 #\r
260 # Gen Package Header of Dec as <Key> = <Value>\r
261 #\r
f7496d71 262 # @param ContainerFile: The Dec file full path\r
4234283c
LG
263 #\r
264 def GenPackageHeader(self, ContainerFile):\r
265 Logger.Debug(2, "Generate PackageHeader ...")\r
266 DefinesDict = {}\r
f7496d71 267\r
4234283c
LG
268 #\r
269 # Update all defines item in database\r
270 #\r
271 DefObj = self.DecParser.GetDefineSectionObject()\r
272 for Item in DefObj.GetDefines():\r
273 #\r
274 # put items into Dict except for PackageName, Guid, Version, DEC_SPECIFICATION\r
275 #\r
276 SkipItemList = [TAB_DEC_DEFINES_PACKAGE_NAME, \\r
421ccda3
HC
277 TAB_DEC_DEFINES_PACKAGE_GUID, TAB_DEC_DEFINES_PACKAGE_VERSION, \\r
278 TAB_DEC_DEFINES_DEC_SPECIFICATION, TAB_DEC_DEFINES_PKG_UNI_FILE]\r
4234283c
LG
279 if Item.Key in SkipItemList:\r
280 continue\r
281 DefinesDict['%s = %s' % (Item.Key, Item.Value)] = TAB_ARCH_COMMON\r
282\r
283 self.SetBaseName(DefObj.GetPackageName())\r
284 self.SetVersion(DefObj.GetPackageVersion())\r
285# self.SetName(DefObj.GetPackageName() + ' Version ' + \\r
286# DefObj.GetPackageVersion())\r
287 self.SetName(os.path.splitext(self.GetFileName())[0])\r
288 self.SetGuid(DefObj.GetPackageGuid())\r
421ccda3
HC
289 if DefObj.GetPackageUniFile():\r
290 ValidateUNIFilePath(DefObj.GetPackageUniFile())\r
291 self.UniFileClassObject = \\r
292 UniFileClassObject([PathClass(os.path.join(DefObj.GetPackagePath(), DefObj.GetPackageUniFile()))])\r
293 else:\r
294 self.UniFileClassObject = None\r
f7496d71 295\r
4234283c
LG
296 if DefinesDict:\r
297 UserExtension = UserExtensionObject()\r
298 UserExtension.SetDefinesDict(DefinesDict)\r
299 UserExtension.SetIdentifier('DefineModifiers')\r
f7496d71 300 UserExtension.SetUserID('EDK2')\r
4234283c
LG
301 self.SetUserExtensionList(\r
302 self.GetUserExtensionList() + [UserExtension]\r
303 )\r
304\r
305 #\r
421ccda3 306 # Get File header information\r
4234283c 307 #\r
421ccda3
HC
308 if self.UniFileClassObject:\r
309 Lang = TAB_LANGUAGE_EN_X\r
310 else:\r
311 Lang = TAB_LANGUAGE_EN_US\r
4234283c
LG
312 Abstract, Description, Copyright, License = \\r
313 ParseHeaderCommentSection(self.DecParser.GetHeadComment(),\r
314 ContainerFile)\r
421ccda3
HC
315 if Abstract:\r
316 self.SetAbstract((Lang, Abstract))\r
317 if Description:\r
318 self.SetDescription((Lang, Description))\r
319 if Copyright:\r
320 self.SetCopyright(('', Copyright))\r
321 if License:\r
322 self.SetLicense(('', License))\r
f7496d71 323\r
421ccda3
HC
324 #\r
325 # Get Binary header information\r
326 #\r
327 if self.DecParser.BinaryHeadComment:\r
328 Abstract, Description, Copyright, License = \\r
329 ParseHeaderCommentSection(self.DecParser.BinaryHeadComment,\r
330 ContainerFile, True)\r
f7496d71 331\r
421ccda3
HC
332 if not Abstract or not Description or not Copyright or not License:\r
333 Logger.Error('MkPkg',\r
334 FORMAT_INVALID,\r
335 ST.ERR_INVALID_BINARYHEADER_FORMAT,\r
336 ContainerFile)\r
337 else:\r
338 self.SetBinaryHeaderAbstract((Lang, Abstract))\r
339 self.SetBinaryHeaderDescription((Lang, Description))\r
340 self.SetBinaryHeaderCopyright(('', Copyright))\r
341 self.SetBinaryHeaderLicense(('', License))\r
342\r
343 BinaryAbstractList = []\r
344 BinaryDescriptionList = []\r
f7496d71 345\r
421ccda3
HC
346 #Get Binary header from UNI file\r
347 # Initialize the UniStrDict dictionary, top keys are language codes\r
348 UniStrDict = {}\r
349 if self.UniFileClassObject:\r
350 UniStrDict = self.UniFileClassObject.OrderedStringList\r
351 for Lang in UniStrDict:\r
352 for StringDefClassObject in UniStrDict[Lang]:\r
353 Lang = GetLanguageCode1766(Lang)\r
354 if StringDefClassObject.StringName == TAB_DEC_BINARY_ABSTRACT:\r
355 if (Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue)) \\r
356 not in self.GetBinaryHeaderAbstract():\r
357 BinaryAbstractList.append((Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue)))\r
358 if StringDefClassObject.StringName == TAB_DEC_BINARY_DESCRIPTION:\r
359 if (Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue)) \\r
360 not in self.GetBinaryHeaderDescription():\r
f7496d71 361 BinaryDescriptionList.append((Lang,\r
421ccda3
HC
362 ConvertSpecialUnicodes(StringDefClassObject.StringValue)))\r
363 #Combine Binary header from DEC file and UNI file\r
364 BinaryAbstractList = self.GetBinaryHeaderAbstract() + BinaryAbstractList\r
365 BinaryDescriptionList = self.GetBinaryHeaderDescription() + BinaryDescriptionList\r
366 BinaryCopyrightList = self.GetBinaryHeaderCopyright()\r
367 BinaryLicenseList = self.GetBinaryHeaderLicense()\r
368 #Generate the UserExtensionObject for TianoCore."BinaryHeader"\r
369 if BinaryAbstractList or BinaryDescriptionList or BinaryCopyrightList or BinaryLicenseList:\r
370 BinaryUserExtension = UserExtensionObject()\r
371 BinaryUserExtension.SetBinaryAbstract(BinaryAbstractList)\r
372 BinaryUserExtension.SetBinaryDescription(BinaryDescriptionList)\r
373 BinaryUserExtension.SetBinaryCopyright(BinaryCopyrightList)\r
374 BinaryUserExtension.SetBinaryLicense(BinaryLicenseList)\r
375 BinaryUserExtension.SetIdentifier(TAB_BINARY_HEADER_IDENTIFIER)\r
376 BinaryUserExtension.SetUserID(TAB_BINARY_HEADER_USERID)\r
377 self.SetUserExtensionList(self.GetUserExtensionList() + [BinaryUserExtension])\r
f7496d71
LG
378\r
379\r
4234283c
LG
380 ## GenIncludes\r
381 #\r
382 # Gen Includes of Dec\r
f7496d71
LG
383 #\r
384 # @param ContainerFile: The Dec file full path\r
4234283c
LG
385 #\r
386 def GenIncludes(self, ContainerFile):\r
387 if ContainerFile:\r
388 pass\r
389 Logger.Debug(2, "Generate %s ..." % TAB_INCLUDES)\r
390 IncludesDict = Sdict()\r
391\r
392 IncObj = self.DecParser.GetIncludeSectionObject()\r
393 for Item in IncObj.GetAllIncludes():\r
394 IncludePath = os.path.normpath(Item.File)\r
421ccda3 395 if platform.system() != 'Windows' and platform.system() != 'Microsoft':\r
4234283c
LG
396 IncludePath = IncludePath.replace('\\', '/')\r
397 if IncludePath in IncludesDict:\r
398 if Item.GetArchList() == [TAB_ARCH_COMMON] or IncludesDict[IncludePath] == [TAB_ARCH_COMMON]:\r
399 IncludesDict[IncludePath] = [TAB_ARCH_COMMON]\r
400 else:\r
401 IncludesDict[IncludePath] = IncludesDict[IncludePath] + Item.GetArchList()\r
402 else:\r
403 IncludesDict[IncludePath] = Item.GetArchList()\r
f7496d71
LG
404\r
405 #\r
4234283c 406 # get the standardIncludeFileList(industry), packageIncludeFileList\r
f7496d71
LG
407 # (others) for PackageObject\r
408 #\r
4234283c
LG
409 PackagePath = os.path.split(self.GetFullPath())[0]\r
410 IncludePathList = \\r
0d1f5b2b 411 sorted([os.path.normpath(Path) + sep for Path in IncludesDict.keys()])\r
f7496d71 412\r
4234283c 413 #\r
f7496d71 414 # get a non-overlap set of include path, IncludePathList should be\r
4234283c
LG
415 # sorted, and path should be end with path seperator '\'\r
416 #\r
417 NonOverLapList = []\r
418 for Path1 in IncludePathList:\r
419 for Path2 in NonOverLapList:\r
420 if Path1.startswith(Path2):\r
421 break\r
422 else:\r
423 NonOverLapList.append(Path1)\r
424 #\r
425 # revert the list so the longest path shown first in list, also need\r
426 # to remove the extra path seperator '\'\r
427 # as this list is used to search the supported Arch info\r
428 #\r
429 for IndexN in range (0, len(IncludePathList)):\r
430 IncludePathList[IndexN] = os.path.normpath(IncludePathList[IndexN])\r
f7496d71 431 IncludePathList.sort()\r
4234283c
LG
432 IncludePathList.reverse()\r
433 #\r
434 # save the include path list for later usage\r
435 #\r
436 self.SetIncludePathList(IncludePathList)\r
437 StandardIncludeFileList = []\r
438 PackageIncludeFileList = []\r
f7496d71 439\r
4234283c
LG
440 IncludeFileList = []\r
441 for Path in NonOverLapList:\r
442 FileList = GetFiles(os.path.join(PackagePath, Path), ['CVS', '.svn'], False)\r
443 IncludeFileList += [os.path.normpath(os.path.join(Path, File)) for File in FileList]\r
444 for Includefile in IncludeFileList:\r
445 ExtName = os.path.splitext(Includefile)[1]\r
446 if ExtName.upper() == '.DEC' and self.CheckMulDec:\r
f7496d71 447 Logger.Error('MkPkg',\r
4234283c 448 UPT_MUL_DEC_ERROR,\r
f7496d71 449 ST.ERR_MUL_DEC_ERROR%(os.path.dirname(ContainerFile),\r
4234283c
LG
450 os.path.basename(ContainerFile),\r
451 Includefile))\r
452\r
453 FileCombinePath = os.path.dirname(Includefile)\r
454 Include = IncludeObject()\r
455 for Path in IncludePathList:\r
456 if FileCombinePath.startswith(Path):\r
457 SupArchList = IncludesDict[Path]\r
458 break\r
459 Include.SetFilePath(Includefile)\r
460 Include.SetSupArchList(SupArchList)\r
461 if Includefile.find('IndustryStandard') != -1:\r
462 StandardIncludeFileList.append(Include)\r
463 else:\r
f7496d71
LG
464 PackageIncludeFileList.append(Include)\r
465\r
4234283c
LG
466 self.SetStandardIncludeFileList(StandardIncludeFileList)\r
467\r
468 #\r
469 # put include path into the PackageIncludeFileList\r
470 #\r
471 PackagePathList = []\r
f7496d71 472 IncObj = self.DecParser.GetIncludeSectionObject()\r
4234283c
LG
473 for Item in IncObj.GetAllIncludes():\r
474 IncludePath = Item.File\r
475 Include = IncludeObject()\r
476 Include.SetFilePath(IncludePath)\r
477 Include.SetSupArchList(Item.GetArchList())\r
478 PackagePathList.append(Include)\r
479 self.SetPackageIncludeFileList(PackagePathList + PackageIncludeFileList)\r
f7496d71 480\r
4234283c
LG
481 ## GenPpis\r
482 #\r
483 # Gen Ppis of Dec\r
484 # <CName>=<GuidValue>\r
485 #\r
f7496d71 486 # @param ContainerFile: The Dec file full path\r
4234283c
LG
487 #\r
488 def GenGuidProtocolPpis(self, Type, ContainerFile):\r
489 if ContainerFile:\r
490 pass\r
491 Logger.Debug(2, "Generate %s ..." % Type)\r
492\r
493 Obj = None\r
494 Factory = None\r
495 if Type == TAB_GUIDS:\r
496 Obj = self.DecParser.GetGuidSectionObject()\r
497 def CreateGuidObject():\r
498 Object = GuidObject()\r
499 Object.SetGuidTypeList([])\r
500 Object.SetUsage(None)\r
501 Object.SetName(None)\r
502 return Object\r
503 Factory = CreateGuidObject\r
504 elif Type == TAB_PROTOCOLS:\r
505 Obj = self.DecParser.GetProtocolSectionObject()\r
f7496d71 506\r
4234283c
LG
507 def CreateProtocolObject():\r
508 return ProtocolObject()\r
509 Factory = CreateProtocolObject\r
510 elif Type == TAB_PPIS:\r
511 Obj = self.DecParser.GetPpiSectionObject()\r
512\r
513 def CreatePpiObject():\r
514 return PpiObject()\r
515 Factory = CreatePpiObject\r
516 else:\r
517 #\r
518 # Should not be here\r
519 #\r
520 return\r
f7496d71 521\r
4234283c 522 DeclarationsList = []\r
f7496d71 523\r
4234283c
LG
524 #\r
525 # Go through each arch\r
526 #\r
527 for Item in Obj.GetGuidStyleAllItems():\r
528 Name = Item.GuidCName\r
529 Value = Item.GuidString\r
530 HelpTxt = ParseGenericComment(Item.GetHeadComment() + \\r
531 Item.GetTailComment())\r
f7496d71 532\r
4234283c
LG
533 ListObject = Factory()\r
534 ListObject.SetCName(Name)\r
535 ListObject.SetGuid(Value)\r
536 ListObject.SetSupArchList(Item.GetArchList())\r
537 if HelpTxt:\r
421ccda3
HC
538 if self.UniFileClassObject:\r
539 HelpTxt.SetLang(TAB_LANGUAGE_EN_X)\r
4234283c 540 ListObject.SetHelpTextList([HelpTxt])\r
f7496d71 541\r
4234283c
LG
542 DeclarationsList.append(ListObject)\r
543\r
f7496d71 544 #\r
4234283c
LG
545 #GuidTypeList is abstracted from help\r
546 #\r
547 if Type == TAB_GUIDS:\r
548 self.SetGuidList(self.GetGuidList() + DeclarationsList)\r
549 elif Type == TAB_PROTOCOLS:\r
550 self.SetProtocolList(self.GetProtocolList() + DeclarationsList)\r
551 elif Type == TAB_PPIS:\r
552 self.SetPpiList(self.GetPpiList() + DeclarationsList)\r
f7496d71 553\r
4234283c
LG
554 ## GenLibraryClasses\r
555 #\r
556 # Gen LibraryClasses of Dec\r
557 # <CName>=<GuidValue>\r
558 #\r
f7496d71 559 # @param ContainerFile: The Dec file full path\r
4234283c
LG
560 #\r
561 def GenLibraryClasses(self, ContainerFile):\r
562 if ContainerFile:\r
563 pass\r
564 Logger.Debug(2, "Generate %s ..." % TAB_LIBRARY_CLASSES)\r
565 LibraryClassDeclarations = []\r
f7496d71 566\r
4234283c
LG
567 LibObj = self.DecParser.GetLibraryClassSectionObject()\r
568 for Item in LibObj.GetAllLibraryclasses():\r
569 LibraryClass = LibraryClassObject()\r
570 LibraryClass.SetLibraryClass(Item.Libraryclass)\r
571 LibraryClass.SetSupArchList(Item.GetArchList())\r
572 LibraryClass.SetIncludeHeader(Item.File)\r
573 HelpTxt = ParseGenericComment(Item.GetHeadComment() + \\r
574 Item.GetTailComment(), None, '@libraryclass')\r
575 if HelpTxt:\r
421ccda3
HC
576 if self.UniFileClassObject:\r
577 HelpTxt.SetLang(TAB_LANGUAGE_EN_X)\r
4234283c
LG
578 LibraryClass.SetHelpTextList([HelpTxt])\r
579 LibraryClassDeclarations.append(LibraryClass)\r
f7496d71 580\r
4234283c
LG
581 self.SetLibraryClassList(self.GetLibraryClassList() + \\r
582 LibraryClassDeclarations)\r
f7496d71 583\r
4234283c
LG
584 ## GenPcds\r
585 #\r
586 # Gen Pcds of Dec\r
587 # <TokenSpcCName>.<TokenCName>|<Value>|<DatumType>|<Token>\r
588 #\r
f7496d71 589 # @param ContainerFile: The Dec file full path\r
4234283c
LG
590 #\r
591 def GenPcds(self, ContainerFile):\r
592 Logger.Debug(2, "Generate %s ..." % TAB_PCDS)\r
4234283c
LG
593 PcdObj = self.DecParser.GetPcdSectionObject()\r
594 #\r
595 # Get all Pcds\r
f7496d71 596 #\r
4234283c
LG
597 PcdDeclarations = []\r
598 IterList = [\r
599 (TAB_PCDS_FIXED_AT_BUILD_NULL, 'FixedPcd'),\r
f7496d71 600 (TAB_PCDS_PATCHABLE_IN_MODULE_NULL, 'PatchPcd'),\r
4234283c 601 (TAB_PCDS_FEATURE_FLAG_NULL, 'FeaturePcd'),\r
f7496d71 602 (TAB_PCDS_DYNAMIC_EX_NULL, 'PcdEx'),\r
4234283c 603 (TAB_PCDS_DYNAMIC_NULL, 'Pcd')]\r
f7496d71 604\r
421ccda3
HC
605 PromptStrList = []\r
606 HelpStrList = []\r
607 PcdErrStrList = []\r
608 # Initialize UniStrDict dictionary, top keys are language codes\r
609 UniStrDict = {}\r
610 StrList = []\r
f7496d71 611\r
421ccda3
HC
612 Language = ''\r
613 if self.UniFileClassObject:\r
614 Language = TAB_LANGUAGE_EN_X\r
615 else:\r
616 Language = TAB_LANGUAGE_EN_US\r
f7496d71 617\r
421ccda3
HC
618 if self.UniFileClassObject:\r
619 UniStrDict = self.UniFileClassObject.OrderedStringList\r
620 for Lang in UniStrDict:\r
621 for StringDefClassObject in UniStrDict[Lang]:\r
622 StrList = StringDefClassObject.StringName.split('_')\r
623 # StringName format is STR_<TOKENSPACECNAME>_<PCDCNAME>_PROMPT\r
624 if len(StrList) == 4 and StrList[0] == TAB_STR_TOKENCNAME and StrList[3] == TAB_STR_TOKENPROMPT:\r
625 PromptStrList.append((GetLanguageCode1766(Lang), StringDefClassObject.StringName, \\r
626 StringDefClassObject.StringValue))\r
627 # StringName format is STR_<TOKENSPACECNAME>_<PCDCNAME>_HELP\r
628 if len(StrList) == 4 and StrList[0] == TAB_STR_TOKENCNAME and StrList[3] == TAB_STR_TOKENHELP:\r
629 HelpStrList.append((GetLanguageCode1766(Lang), StringDefClassObject.StringName, \\r
630 StringDefClassObject.StringValue))\r
631 # StringName format is STR_<TOKENSPACECNAME>_ERR_##\r
632 if len(StrList) == 4 and StrList[0] == TAB_STR_TOKENCNAME and StrList[2] == TAB_STR_TOKENERR:\r
633 PcdErrStrList.append((GetLanguageCode1766(Lang), StringDefClassObject.StringName, \\r
634 StringDefClassObject.StringValue))\r
4234283c
LG
635 #\r
636 # For each PCD type\r
637 #\r
638 for PcdType, Type in IterList:\r
639 #\r
640 # Go through all archs\r
641 #\r
642 # for Arch in self.SupArchList + [TAB_ARCH_COMMON]:\r
643 #\r
644 for Item in PcdObj.GetPcdsByType(PcdType.upper()):\r
645 PcdDeclaration = GenPcdDeclaration(\r
646 ContainerFile,\r
647 (Item.TokenSpaceGuidCName, Item.TokenCName,\r
648 Item.DefaultValue, Item.DatumType, Item.TokenValue,\r
ccaa7754 649 Type, Item.GetHeadComment(), Item.GetTailComment(), ''),\r
421ccda3
HC
650 Language,\r
651 self.DecParser.GetDefineSectionMacro()\r
652 )\r
4234283c 653 PcdDeclaration.SetSupArchList(Item.GetArchListOfType(PcdType))\r
f7496d71 654\r
421ccda3
HC
655 #\r
656 # Get PCD error message from PCD error comment section in DEC file\r
657 #\r
658 for PcdErr in PcdDeclaration.GetPcdErrorsList():\r
659 if (PcdDeclaration.GetTokenSpaceGuidCName(), PcdErr.GetErrorNumber()) \\r
660 in self.DecParser.PcdErrorCommentDict:\r
661 Key = (PcdDeclaration.GetTokenSpaceGuidCName(), PcdErr.GetErrorNumber())\r
662 PcdErr.SetErrorMessageList(PcdErr.GetErrorMessageList() + \\r
663 [(Language, self.DecParser.PcdErrorCommentDict[Key])])\r
f7496d71 664\r
421ccda3
HC
665 for Index in range(0, len(PromptStrList)):\r
666 StrNameList = PromptStrList[Index][1].split('_')\r
667 if StrNameList[1].lower() == Item.TokenSpaceGuidCName.lower() and \\r
668 StrNameList[2].lower() == Item.TokenCName.lower():\r
669 TxtObj = TextObject()\r
670 TxtObj.SetLang(PromptStrList[Index][0])\r
671 TxtObj.SetString(PromptStrList[Index][2])\r
672 for Prompt in PcdDeclaration.GetPromptList():\r
673 if Prompt.GetLang() == TxtObj.GetLang() and \\r
674 Prompt.GetString() == TxtObj.GetString():\r
675 break\r
676 else:\r
677 PcdDeclaration.SetPromptList(PcdDeclaration.GetPromptList() + [TxtObj])\r
f7496d71 678\r
421ccda3
HC
679 for Index in range(0, len(HelpStrList)):\r
680 StrNameList = HelpStrList[Index][1].split('_')\r
681 if StrNameList[1].lower() == Item.TokenSpaceGuidCName.lower() and \\r
682 StrNameList[2].lower() == Item.TokenCName.lower():\r
683 TxtObj = TextObject()\r
684 TxtObj.SetLang(HelpStrList[Index][0])\r
685 TxtObj.SetString(HelpStrList[Index][2])\r
686 for HelpStrObj in PcdDeclaration.GetHelpTextList():\r
687 if HelpStrObj.GetLang() == TxtObj.GetLang() and \\r
688 HelpStrObj.GetString() == TxtObj.GetString():\r
689 break\r
690 else:\r
691 PcdDeclaration.SetHelpTextList(PcdDeclaration.GetHelpTextList() + [TxtObj])\r
692\r
693 #\r
694 # Get PCD error message from UNI file\r
695 #\r
696 for Index in range(0, len(PcdErrStrList)):\r
697 StrNameList = PcdErrStrList[Index][1].split('_')\r
698 if StrNameList[1].lower() == Item.TokenSpaceGuidCName.lower() and \\r
699 StrNameList[2].lower() == TAB_STR_TOKENERR.lower():\r
700 for PcdErr in PcdDeclaration.GetPcdErrorsList():\r
701 if PcdErr.GetErrorNumber().lower() == (TAB_HEX_START + StrNameList[3]).lower() and \\r
702 (PcdErrStrList[Index][0], PcdErrStrList[Index][2]) not in PcdErr.GetErrorMessageList():\r
703 PcdErr.SetErrorMessageList(PcdErr.GetErrorMessageList() + \\r
704 [(PcdErrStrList[Index][0], PcdErrStrList[Index][2])])\r
f7496d71 705\r
421ccda3
HC
706 #\r
707 # Check to prevent missing error message if a Pcd has the error code.\r
708 #\r
709 for PcdErr in PcdDeclaration.GetPcdErrorsList():\r
710 if PcdErr.GetErrorNumber().strip():\r
711 if not PcdErr.GetErrorMessageList():\r
712 Logger.Error('UPT',\r
713 FORMAT_INVALID,\r
714 ST.ERR_DECPARSE_PCD_UNMATCHED_ERRORCODE % PcdErr.GetErrorNumber(),\r
715 ContainerFile,\r
716 PcdErr.GetLineNum(),\r
f7496d71
LG
717 PcdErr.GetFileLine())\r
718\r
4234283c 719 PcdDeclarations.append(PcdDeclaration)\r
4234283c 720 self.SetPcdList(self.GetPcdList() + PcdDeclarations)\r
421ccda3 721 self.CheckPcdValue()\r
f7496d71 722\r
421ccda3
HC
723 ##\r
724 # Get error message via language\r
725 # @param ErrorMessageList: Error message tuple list the language and its message\r
726 # @param Lang: the language of setting\r
727 # @return: the error message described in the related UNI file\r
728 def GetEnErrorMessage(self, ErrorMessageList):\r
729 if self.FullPath:\r
730 pass\r
731 Lang = TAB_LANGUAGE_EN_US\r
732 for (Language, Message) in ErrorMessageList:\r
733 if Language == Lang:\r
734 return Message\r
735 for (Language, Message) in ErrorMessageList:\r
736 if Language.find(TAB_LANGUAGE_EN) >= 0:\r
737 return Message\r
738 else:\r
739 try:\r
740 return ErrorMessageList[0][1]\r
741 except IndexError:\r
742 return ''\r
f7496d71
LG
743 return ''\r
744\r
421ccda3
HC
745 ##\r
746 # Replace the strings for Python eval function.\r
f7496d71
LG
747 # @param ReplaceValue: The string that needs to be replaced.\r
748 # @return: The string was replaced, then eval function is always making out it.\r
421ccda3
HC
749 def ReplaceForEval(self, ReplaceValue, IsRange=False, IsExpr=False):\r
750 if self.FullPath:\r
751 pass\r
752 #\r
f7496d71 753 # deal with "NOT EQ", "NOT LT", "NOT GT", "NOT LE", "NOT GE", "NOT NOT"\r
421ccda3
HC
754 #\r
755 NOTNOT_Pattern = '[\t\s]*NOT[\t\s]+NOT[\t\s]*'\r
756 NOTGE_Pattern = '[\t\s]*NOT[\t\s]+GE[\t\s]*'\r
757 NOTLE_Pattern = '[\t\s]*NOT[\t\s]+LE[\t\s]*'\r
758 NOTGT_Pattern = '[\t\s]*NOT[\t\s]+GT[\t\s]*'\r
759 NOTLT_Pattern = '[\t\s]*NOT[\t\s]+LT[\t\s]*'\r
760 NOTEQ_Pattern = '[\t\s]*NOT[\t\s]+EQ[\t\s]*'\r
761 ReplaceValue = re.compile(NOTNOT_Pattern).sub('', ReplaceValue)\r
762 ReplaceValue = re.compile(NOTLT_Pattern).sub('x >= ', ReplaceValue)\r
763 ReplaceValue = re.compile(NOTGT_Pattern).sub('x <= ', ReplaceValue)\r
764 ReplaceValue = re.compile(NOTLE_Pattern).sub('x > ', ReplaceValue)\r
765 ReplaceValue = re.compile(NOTGE_Pattern).sub('x < ', ReplaceValue)\r
766 ReplaceValue = re.compile(NOTEQ_Pattern).sub('x != ', ReplaceValue)\r
f7496d71 767\r
421ccda3
HC
768 if IsRange:\r
769 ReplaceValue = ReplaceValue.replace('EQ', 'x ==')\r
770 ReplaceValue = ReplaceValue.replace('LT', 'x <')\r
771 ReplaceValue = ReplaceValue.replace('LE', 'x <=')\r
772 ReplaceValue = ReplaceValue.replace('GT', 'x >')\r
773 ReplaceValue = ReplaceValue.replace('GE', 'x >=')\r
774 ReplaceValue = ReplaceValue.replace('XOR', 'x ^')\r
775 elif IsExpr:\r
776 ReplaceValue = ReplaceValue.replace('EQ', '==')\r
777 ReplaceValue = ReplaceValue.replace('NE', '!=')\r
778 ReplaceValue = ReplaceValue.replace('LT', '<')\r
779 ReplaceValue = ReplaceValue.replace('LE', '<=')\r
780 ReplaceValue = ReplaceValue.replace('GT', '>')\r
f7496d71
LG
781 ReplaceValue = ReplaceValue.replace('GE', '>=')\r
782 ReplaceValue = ReplaceValue.replace('XOR', '^')\r
783\r
421ccda3
HC
784 ReplaceValue = ReplaceValue.replace('AND', 'and')\r
785 ReplaceValue = ReplaceValue.replace('&&', ' and ')\r
786 ReplaceValue = ReplaceValue.replace('xor', '^')\r
787 ReplaceValue = ReplaceValue.replace('OR', 'or')\r
788 ReplaceValue = ReplaceValue.replace('||', ' or ')\r
789 ReplaceValue = ReplaceValue.replace('NOT', 'not')\r
790 if ReplaceValue.find('!') >= 0 and ReplaceValue[ReplaceValue.index('!') + 1] != '=':\r
f7496d71 791 ReplaceValue = ReplaceValue.replace('!', ' not ')\r
421ccda3
HC
792 if '.' in ReplaceValue:\r
793 Pattern = '[a-zA-Z0-9]{1,}\.[a-zA-Z0-9]{1,}'\r
794 MatchedList = re.findall(Pattern, ReplaceValue)\r
795 for MatchedItem in MatchedList:\r
796 if MatchedItem not in self.PcdDefaultValueDict:\r
797 Logger.Error("Dec File Parser", FORMAT_INVALID, Message=ST.ERR_DECPARSE_PCD_NODEFINED % MatchedItem,\r
798 File=self.FullPath)\r
f7496d71 799\r
421ccda3
HC
800 ReplaceValue = ReplaceValue.replace(MatchedItem, self.PcdDefaultValueDict[MatchedItem])\r
801\r
802 return ReplaceValue\r
803\r
804 ##\r
805 # Check pcd's default value according to the pcd's description\r
806 #\r
807 def CheckPcdValue(self):\r
808 for Pcd in self.GetPcdList():\r
809 self.PcdDefaultValueDict[TAB_SPLIT.join((Pcd.GetTokenSpaceGuidCName(), Pcd.GetCName())).strip()] = \\r
810 Pcd.GetDefaultValue()\r
f7496d71 811\r
421ccda3
HC
812 for Pcd in self.GetPcdList():\r
813 ValidationExpressions = []\r
814 PcdGuidName = TAB_SPLIT.join((Pcd.GetTokenSpaceGuidCName(), Pcd.GetCName()))\r
815 Valids = Pcd.GetPcdErrorsList()\r
816 for Valid in Valids:\r
817 Expression = Valid.GetExpression()\r
818 if Expression:\r
819 #\r
820 # Delete the 'L' prefix of a quoted string, this operation is for eval()\r
821 #\r
822 QUOTED_PATTERN = '[\t\s]*L?"[^"]*"'\r
823 QuotedMatchedObj = re.search(QUOTED_PATTERN, Expression)\r
824 if QuotedMatchedObj:\r
825 MatchedStr = QuotedMatchedObj.group().strip()\r
826 if MatchedStr.startswith('L'):\r
f7496d71 827 Expression = Expression.replace(MatchedStr, MatchedStr[1:].strip())\r
421ccda3
HC
828\r
829 Expression = self.ReplaceForEval(Expression, IsExpr=True)\r
830 Expression = Expression.replace(PcdGuidName, 'x')\r
831 Message = self.GetEnErrorMessage(Valid.GetErrorMessageList())\r
f7496d71
LG
832 ValidationExpressions.append((Expression, Message))\r
833\r
421ccda3
HC
834 ValidList = Valid.GetValidValue()\r
835 if ValidList:\r
836 ValidValue = 'x in %s' % [eval(v) for v in ValidList.split(' ') if v]\r
837 Message = self.GetEnErrorMessage(Valid.GetErrorMessageList())\r
838 ValidationExpressions.append((ValidValue, Message))\r
f7496d71
LG
839\r
840 ValidValueRange = Valid.GetValidValueRange()\r
421ccda3
HC
841 if ValidValueRange:\r
842 ValidValueRange = self.ReplaceForEval(ValidValueRange, IsRange=True)\r
843 if ValidValueRange.find('-') >= 0:\r
844 ValidValueRange = ValidValueRange.replace('-', '<= x <=')\r
845 elif not ValidValueRange.startswith('x ') and not ValidValueRange.startswith('not ') \\r
846 and not ValidValueRange.startswith('not(') and not ValidValueRange.startswith('('):\r
847 ValidValueRange = 'x %s' % ValidValueRange\r
848 Message = self.GetEnErrorMessage(Valid.GetErrorMessageList())\r
849 ValidationExpressions.append((ValidValueRange, Message))\r
f7496d71 850\r
421ccda3
HC
851 DefaultValue = self.PcdDefaultValueDict[PcdGuidName.strip()]\r
852 #\r
853 # Delete the 'L' prefix of a quoted string, this operation is for eval()\r
854 #\r
855 QUOTED_PATTERN = '[\t\s]*L?"[^"]*"'\r
856 QuotedMatchedObj = re.search(QUOTED_PATTERN, DefaultValue)\r
857 if QuotedMatchedObj:\r
858 MatchedStr = QuotedMatchedObj.group().strip()\r
859 if MatchedStr.startswith('L'):\r
860 DefaultValue = DefaultValue.replace(MatchedStr, MatchedStr[1:].strip())\r
f7496d71 861\r
421ccda3
HC
862 try:\r
863 DefaultValue = eval(DefaultValue.replace('TRUE', 'True').replace('true', 'True')\r
864 .replace('FALSE', 'False').replace('false', 'False'))\r
865 except BaseException:\r
866 pass\r
867\r
868 for (Expression, Msg) in ValidationExpressions:\r
869 try:\r
870 if not eval(Expression, {'x':DefaultValue}):\r
871 Logger.Error("Dec File Parser", FORMAT_INVALID, ExtraData='%s, value = %s' %\\r
872 (PcdGuidName, DefaultValue), Message=Msg, File=self.FullPath)\r
873 except TypeError:\r
874 Logger.Error("Dec File Parser", FORMAT_INVALID, ExtraData=PcdGuidName, \\r
875 Message=Msg, File=self.FullPath)\r
4234283c 876\r
4234283c
LG
877 ## GenModuleFileList\r
878 #\r
f7496d71 879 def GenModuleFileList(self, ContainerFile):\r
4234283c
LG
880 ModuleFileList = []\r
881 ContainerFileName = os.path.basename(ContainerFile)\r
882 ContainerFilePath = os.path.dirname(ContainerFile)\r
f7496d71 883 for Item in GetFiles(ContainerFilePath,\r
4234283c
LG
884 ['CVS', '.svn'] + self.GetIncludePathList(), False):\r
885 ExtName = os.path.splitext(Item)[1]\r
886 if ExtName.lower() == '.inf':\r
887 ModuleFileList.append(Item)\r
888 elif ExtName.upper() == '.DEC' and self.CheckMulDec:\r
889 if Item == ContainerFileName:\r
890 continue\r
f7496d71 891 Logger.Error('MkPkg',\r
4234283c 892 UPT_MUL_DEC_ERROR,\r
f7496d71
LG
893 ST.ERR_MUL_DEC_ERROR%(ContainerFilePath,\r
894 ContainerFileName,\r
4234283c 895 Item))\r
f7496d71 896\r
4234283c 897 self.SetModuleFileList(ModuleFileList)\r
f7496d71 898\r
4234283c
LG
899 ## Show detailed information of Package\r
900 #\r
901 # Print all members and their values of Package class\r
902 #\r
903 def ShowPackage(self):\r
72443dd2
GL
904 print('\nName =', self.GetName())\r
905 print('\nBaseName =', self.GetBaseName())\r
906 print('\nVersion =', self.GetVersion())\r
907 print('\nGuid =', self.GetGuid())\r
f7496d71 908\r
72443dd2
GL
909 print('\nStandardIncludes = %d ' \\r
910 % len(self.GetStandardIncludeFileList()), end=' ')\r
4234283c 911 for Item in self.GetStandardIncludeFileList():\r
72443dd2
GL
912 print(Item.GetFilePath(), ' ', Item.GetSupArchList())\r
913 print('\nPackageIncludes = %d \n' \\r
914 % len(self.GetPackageIncludeFileList()), end=' ')\r
4234283c 915 for Item in self.GetPackageIncludeFileList():\r
72443dd2 916 print(Item.GetFilePath(), ' ', Item.GetSupArchList())\r
f7496d71 917\r
72443dd2 918 print('\nGuids =', self.GetGuidList())\r
4234283c 919 for Item in self.GetGuidList():\r
72443dd2
GL
920 print(Item.GetCName(), Item.GetGuid(), Item.GetSupArchList())\r
921 print('\nProtocols =', self.GetProtocolList())\r
4234283c 922 for Item in self.GetProtocolList():\r
72443dd2
GL
923 print(Item.GetCName(), Item.GetGuid(), Item.GetSupArchList())\r
924 print('\nPpis =', self.GetPpiList())\r
4234283c 925 for Item in self.GetPpiList():\r
72443dd2
GL
926 print(Item.GetCName(), Item.GetGuid(), Item.GetSupArchList())\r
927 print('\nLibraryClasses =', self.GetLibraryClassList())\r
4234283c 928 for Item in self.GetLibraryClassList():\r
72443dd2
GL
929 print(Item.GetLibraryClass(), Item.GetRecommendedInstance(), \\r
930 Item.GetSupArchList())\r
931 print('\nPcds =', self.GetPcdList())\r
4234283c 932 for Item in self.GetPcdList():\r
72443dd2 933 print('CName=', Item.GetCName(), 'TokenSpaceGuidCName=', \\r
4234283c
LG
934 Item.GetTokenSpaceGuidCName(), \\r
935 'DefaultValue=', Item.GetDefaultValue(), \\r
936 'ValidUsage=', Item.GetValidUsage(), \\r
937 'SupArchList', Item.GetSupArchList(), \\r
72443dd2 938 'Token=', Item.GetToken(), 'DatumType=', Item.GetDatumType())\r
f7496d71 939\r
4234283c 940 for Item in self.GetMiscFileList():\r
72443dd2 941 print(Item.GetName())\r
4234283c 942 for FileObjectItem in Item.GetFileList():\r
72443dd2
GL
943 print(FileObjectItem.GetURI())\r
944 print('****************\n')\r
4234283c
LG
945\r
946## GenPcdDeclaration\r
947#\r
948# @param ContainerFile: File name of the DEC file\r
f7496d71
LG
949# @param PcdInfo: Pcd information, of format (TokenGuidCName,\r
950# TokenName, Value, DatumType, Token, Type,\r
4234283c 951# GenericComment, TailComment, Arch)\r
f7496d71
LG
952# @param Language: The language of HelpText, Prompt\r
953#\r
421ccda3 954def GenPcdDeclaration(ContainerFile, PcdInfo, Language, MacroReplaceDict):\r
4234283c 955 HelpStr = ''\r
421ccda3 956 PromptStr = ''\r
4234283c
LG
957 TailHelpStr = ''\r
958 TokenGuidCName, TokenName, Value, DatumType, Token, Type, \\r
959 GenericComment, TailComment, Arch = PcdInfo\r
960 Pcd = PcdObject()\r
961 Pcd.SetCName(TokenName)\r
962 Pcd.SetToken(Token)\r
963 Pcd.SetTokenSpaceGuidCName(TokenGuidCName)\r
964 Pcd.SetDatumType(DatumType)\r
965 Pcd.SetDefaultValue(Value)\r
966 Pcd.SetValidUsage(Type)\r
967 #\r
968 # MaxDatumSize is required field for 'VOID*' PCD\r
969 #\r
970 if DatumType == TAB_PTR_TYPE_PCD:\r
971 Pcd.SetMaxDatumSize(ITEM_UNDEFINED)\r
972\r
973 SupArchList = [Arch]\r
974 Pcd.SetSupArchList(SupArchList)\r
f7496d71 975\r
4234283c 976 if GenericComment:\r
f7496d71
LG
977 HelpStr, PcdErrList, PromptStr = ParseDecPcdGenericComment(GenericComment,\r
978 ContainerFile,\r
979 TokenGuidCName,\r
421ccda3
HC
980 TokenName,\r
981 MacroReplaceDict)\r
982 if PcdErrList:\r
983 Pcd.SetPcdErrorsList(PcdErrList)\r
4234283c
LG
984\r
985 if TailComment:\r
f7496d71 986 SupModuleList, TailHelpStr = ParseDecPcdTailComment(TailComment,\r
4234283c
LG
987 ContainerFile)\r
988 if SupModuleList:\r
989 Pcd.SetSupModuleList(SupModuleList)\r
f7496d71 990\r
4234283c
LG
991 if HelpStr and (not HelpStr.endswith('\n')) and TailHelpStr:\r
992 HelpStr += '\n'\r
993 HelpStr += TailHelpStr\r
994 if HelpStr:\r
421ccda3 995 HelpTxtObj = TextObject()\r
f7496d71 996 HelpTxtObj.SetLang(Language)\r
4234283c
LG
997 HelpTxtObj.SetString(HelpStr)\r
998 Pcd.SetHelpTextList([HelpTxtObj])\r
421ccda3
HC
999 if PromptStr:\r
1000 TxtObj = TextObject()\r
1001 TxtObj.SetLang(Language)\r
1002 TxtObj.SetString(PromptStr)\r
1003 Pcd.SetPromptList([TxtObj])\r
4234283c
LG
1004\r
1005 return Pcd\r