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