]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/PomAdapter/DecPomAlignment.py
BaseTools: Clear build versions to sync with buildtools/BaseTools
[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
4# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
5#\r
6# This program and the accompanying materials are licensed and made available \r
7# under the terms and conditions of the BSD License which accompanies this \r
8# distribution. The full text of the license may be found at \r
9# http://opensource.org/licenses/bsd-license.php\r
10#\r
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13#\r
14\r
15'''\r
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
26import Logger.Log as Logger\r
27from Logger import StringTable as ST\r
28from Logger.ToolError import UPT_MUL_DEC_ERROR\r
29\r
30from Library.Parsing import NormPath\r
31from Library.DataType import ARCH_LIST\r
32from Library.DataType import TAB_GUIDS\r
33from Library.DataType import TAB_PROTOCOLS\r
34from Library.DataType import TAB_PPIS\r
35from Library.DataType import TAB_DEC_DEFINES_PACKAGE_NAME\r
36from Library.DataType import TAB_DEC_DEFINES_PACKAGE_GUID\r
37from Library.DataType import TAB_DEC_DEFINES_PACKAGE_VERSION\r
38from Library.DataType import TAB_DEC_DEFINES_DEC_SPECIFICATION\r
39from Library.DataType import TAB_ARCH_COMMON\r
40from Library.CommentParsing import ParseHeaderCommentSection\r
41from Library.DataType import TAB_INCLUDES\r
42from Library.CommentParsing import ParseGenericComment\r
43from Library.DataType import TAB_LIBRARY_CLASSES\r
44from Library.DataType import TAB_PCDS\r
45from Library.DataType import TAB_PCDS_FIXED_AT_BUILD_NULL\r
46from Library.DataType import TAB_PCDS_PATCHABLE_IN_MODULE_NULL\r
47from Library.DataType import TAB_PCDS_FEATURE_FLAG_NULL\r
48from Library.DataType import TAB_PCDS_DYNAMIC_EX_NULL\r
49from Library.DataType import TAB_PCDS_DYNAMIC_NULL\r
50from Library.DataType import TAB_PTR_TYPE_PCD\r
51from Library.DataType import ITEM_UNDEFINED\r
52from Library.CommentParsing import ParseDecPcdGenericComment\r
53from Library.CommentParsing import ParseDecPcdTailComment\r
54from Library.Misc import GetFiles\r
55from Library.Misc import Sdict\r
56from Parser.DecParser import Dec\r
57\r
58from Object.POM.PackageObject import PackageObject\r
59from Object.POM.CommonObject import UserExtensionObject\r
60from Object.POM.CommonObject import IncludeObject\r
61from Object.POM.CommonObject import GuidObject\r
62from Object.POM.CommonObject import ProtocolObject\r
63from Object.POM.CommonObject import PpiObject\r
64from Object.POM.CommonObject import LibraryClassObject\r
65from Object.POM.CommonObject import PcdObject\r
66from Object.POM.CommonObject import TextObject\r
67\r
68\r
69## DecPomAlignment\r
70#\r
71# Inherited from PackageObject\r
72#\r
73class DecPomAlignment(PackageObject):\r
74 def __init__(self, Filename, WorkspaceDir = None, CheckMulDec = False):\r
75 PackageObject.__init__(self)\r
76 self.UserExtensions = ''\r
77 self.WorkspaceDir = WorkspaceDir\r
78 self.SupArchList = ARCH_LIST\r
79 self.CheckMulDec = CheckMulDec\r
80 self.DecParser = None\r
81 \r
82 #\r
83 # Load Dec file\r
84 #\r
85 self.LoadDecFile(Filename)\r
86 \r
87 #\r
88 # Transfer to Package Object if IsToPackage is True\r
89 #\r
90 self.DecToPackage()\r
91 \r
92 ## Load Dec file\r
93 #\r
94 # Load the file if it exists\r
95 #\r
96 # @param Filename: Input value for filename of Dec file\r
97 #\r
98 def LoadDecFile(self, Filename):\r
99 #\r
100 # Insert a record for file\r
101 #\r
102 Filename = NormPath(Filename)\r
103 (Path, Name) = os.path.split(Filename)\r
104 self.SetFullPath(Filename)\r
105 self.SetRelaPath(Path)\r
106 self.SetFileName(Name)\r
107 self.SetPackagePath(Path[Path.upper().find(self.WorkspaceDir.upper()) + len(self.WorkspaceDir) + 1:])\r
108 self.SetCombinePath(Filename[Filename.upper().find(self.WorkspaceDir.upper()) + len(self.WorkspaceDir) + 1:])\r
109 \r
110 self.DecParser = Dec(Filename)\r
111 \r
112 ## Transfer to Package Object\r
113 # \r
114 # Transfer all contents of a Dec file to a standard Package Object\r
115 #\r
116 def DecToPackage(self):\r
117 #\r
118 # Init global information for the file\r
119 #\r
120 ContainerFile = self.GetFullPath()\r
121 \r
122 #\r
123 # Generate Package Header\r
124 #\r
125 self.GenPackageHeader(ContainerFile)\r
126 \r
127 #\r
128 # Generate Includes\r
129 #\r
130 self.GenIncludes(ContainerFile)\r
131\r
132 #\r
133 # Generate Guids\r
134 #\r
135 self.GenGuidProtocolPpis(TAB_GUIDS, ContainerFile)\r
136\r
137 #\r
138 # Generate Protocols\r
139 #\r
140 self.GenGuidProtocolPpis(TAB_PROTOCOLS, ContainerFile)\r
141\r
142 #\r
143 # Generate Ppis\r
144 #\r
145 self.GenGuidProtocolPpis(TAB_PPIS, ContainerFile)\r
146 \r
147 #\r
148 # Generate LibraryClasses\r
149 #\r
150 self.GenLibraryClasses(ContainerFile)\r
151 \r
152 #\r
153 # Generate Pcds\r
154 #\r
155 self.GenPcds(ContainerFile)\r
156 \r
157 #\r
158 # Generate Module File list, will be used later on to generate \r
159 # distribution\r
160 #\r
161 self.GenModuleFileList(ContainerFile)\r
162 \r
163 #\r
164 # Generate user extensions\r
165 #\r
166 self.GenUserExtensions()\r
167 \r
168 ## Generate user extention\r
169 #\r
170 #\r
171 def GenUserExtensions(self):\r
172 UEObj = self.DecParser.GetUserExtensionSectionObject()\r
173 UEList = UEObj.GetAllUserExtensions()\r
174 for Item in UEList:\r
175 if not Item.UserString:\r
176 continue\r
177 UserExtension = UserExtensionObject()\r
178 UserId = Item.UserId\r
179 if UserId.startswith('"') and UserId.endswith('"'):\r
180 UserId = UserId[1:-1]\r
181 UserExtension.SetUserID(UserId)\r
182 Identifier = Item.IdString\r
183 if Identifier.startswith('"') and Identifier.endswith('"'):\r
184 Identifier = Identifier[1:-1]\r
185 UserExtension.SetIdentifier(Identifier)\r
186 UserExtension.SetStatement(Item.UserString)\r
187 UserExtension.SetSupArchList(\r
188 Item.ArchAndModuleType\r
189 )\r
190 self.SetUserExtensionList(\r
191 self.GetUserExtensionList() + [UserExtension]\r
192 )\r
193 \r
194 ## Generate Package Header\r
195 #\r
196 # Gen Package Header of Dec as <Key> = <Value>\r
197 #\r
198 # @param ContainerFile: The Dec file full path \r
199 #\r
200 def GenPackageHeader(self, ContainerFile):\r
201 Logger.Debug(2, "Generate PackageHeader ...")\r
202 DefinesDict = {}\r
203 \r
204 #\r
205 # Update all defines item in database\r
206 #\r
207 DefObj = self.DecParser.GetDefineSectionObject()\r
208 for Item in DefObj.GetDefines():\r
209 #\r
210 # put items into Dict except for PackageName, Guid, Version, DEC_SPECIFICATION\r
211 #\r
212 SkipItemList = [TAB_DEC_DEFINES_PACKAGE_NAME, \\r
213 TAB_DEC_DEFINES_PACKAGE_GUID, TAB_DEC_DEFINES_PACKAGE_VERSION, TAB_DEC_DEFINES_DEC_SPECIFICATION]\r
214 if Item.Key in SkipItemList:\r
215 continue\r
216 DefinesDict['%s = %s' % (Item.Key, Item.Value)] = TAB_ARCH_COMMON\r
217\r
218 self.SetBaseName(DefObj.GetPackageName())\r
219 self.SetVersion(DefObj.GetPackageVersion())\r
220# self.SetName(DefObj.GetPackageName() + ' Version ' + \\r
221# DefObj.GetPackageVersion())\r
222 self.SetName(os.path.splitext(self.GetFileName())[0])\r
223 self.SetGuid(DefObj.GetPackageGuid())\r
224 \r
225 if DefinesDict:\r
226 UserExtension = UserExtensionObject()\r
227 UserExtension.SetDefinesDict(DefinesDict)\r
228 UserExtension.SetIdentifier('DefineModifiers')\r
229 UserExtension.SetUserID('EDK2') \r
230 self.SetUserExtensionList(\r
231 self.GetUserExtensionList() + [UserExtension]\r
232 )\r
233\r
234 #\r
235 # Get All header comment section information\r
236 #\r
237 Abstract, Description, Copyright, License = \\r
238 ParseHeaderCommentSection(self.DecParser.GetHeadComment(),\r
239 ContainerFile)\r
240 self.SetAbstract(Abstract)\r
241 self.SetDescription(Description)\r
242 self.SetCopyright(Copyright)\r
243 self.SetLicense(License)\r
244 \r
245 ## GenIncludes\r
246 #\r
247 # Gen Includes of Dec\r
248 # \r
249 # @param ContainerFile: The Dec file full path \r
250 #\r
251 def GenIncludes(self, ContainerFile):\r
252 if ContainerFile:\r
253 pass\r
254 Logger.Debug(2, "Generate %s ..." % TAB_INCLUDES)\r
255 IncludesDict = Sdict()\r
256\r
257 IncObj = self.DecParser.GetIncludeSectionObject()\r
258 for Item in IncObj.GetAllIncludes():\r
259 IncludePath = os.path.normpath(Item.File)\r
260 if platform.system() != 'Windows':\r
261 IncludePath = IncludePath.replace('\\', '/')\r
262 if IncludePath in IncludesDict:\r
263 if Item.GetArchList() == [TAB_ARCH_COMMON] or IncludesDict[IncludePath] == [TAB_ARCH_COMMON]:\r
264 IncludesDict[IncludePath] = [TAB_ARCH_COMMON]\r
265 else:\r
266 IncludesDict[IncludePath] = IncludesDict[IncludePath] + Item.GetArchList()\r
267 else:\r
268 IncludesDict[IncludePath] = Item.GetArchList()\r
269 \r
270 # \r
271 # get the standardIncludeFileList(industry), packageIncludeFileList\r
272 # (others) for PackageObject \r
273 # \r
274 PackagePath = os.path.split(self.GetFullPath())[0]\r
275 IncludePathList = \\r
276 [os.path.normpath(Path) + sep for Path in IncludesDict.keys()]\r
277 IncludePathList.sort()\r
278 \r
279 #\r
280 # get a non-overlap set of include path, IncludePathList should be \r
281 # sorted, and path should be end with path seperator '\'\r
282 #\r
283 NonOverLapList = []\r
284 for Path1 in IncludePathList:\r
285 for Path2 in NonOverLapList:\r
286 if Path1.startswith(Path2):\r
287 break\r
288 else:\r
289 NonOverLapList.append(Path1)\r
290 #\r
291 # revert the list so the longest path shown first in list, also need\r
292 # to remove the extra path seperator '\'\r
293 # as this list is used to search the supported Arch info\r
294 #\r
295 for IndexN in range (0, len(IncludePathList)):\r
296 IncludePathList[IndexN] = os.path.normpath(IncludePathList[IndexN])\r
297 IncludePathList.sort() \r
298 IncludePathList.reverse()\r
299 #\r
300 # save the include path list for later usage\r
301 #\r
302 self.SetIncludePathList(IncludePathList)\r
303 StandardIncludeFileList = []\r
304 PackageIncludeFileList = []\r
305 \r
306 IncludeFileList = []\r
307 for Path in NonOverLapList:\r
308 FileList = GetFiles(os.path.join(PackagePath, Path), ['CVS', '.svn'], False)\r
309 IncludeFileList += [os.path.normpath(os.path.join(Path, File)) for File in FileList]\r
310 for Includefile in IncludeFileList:\r
311 ExtName = os.path.splitext(Includefile)[1]\r
312 if ExtName.upper() == '.DEC' and self.CheckMulDec:\r
313 Logger.Error('MkPkg', \r
314 UPT_MUL_DEC_ERROR,\r
315 ST.ERR_MUL_DEC_ERROR%(os.path.dirname(ContainerFile), \r
316 os.path.basename(ContainerFile),\r
317 Includefile))\r
318\r
319 FileCombinePath = os.path.dirname(Includefile)\r
320 Include = IncludeObject()\r
321 for Path in IncludePathList:\r
322 if FileCombinePath.startswith(Path):\r
323 SupArchList = IncludesDict[Path]\r
324 break\r
325 Include.SetFilePath(Includefile)\r
326 Include.SetSupArchList(SupArchList)\r
327 if Includefile.find('IndustryStandard') != -1:\r
328 StandardIncludeFileList.append(Include)\r
329 else:\r
330 PackageIncludeFileList.append(Include) \r
331 \r
332 self.SetStandardIncludeFileList(StandardIncludeFileList)\r
333\r
334 #\r
335 # put include path into the PackageIncludeFileList\r
336 #\r
337 PackagePathList = []\r
338 IncObj = self.DecParser.GetIncludeSectionObject() \r
339 for Item in IncObj.GetAllIncludes():\r
340 IncludePath = Item.File\r
341 Include = IncludeObject()\r
342 Include.SetFilePath(IncludePath)\r
343 Include.SetSupArchList(Item.GetArchList())\r
344 PackagePathList.append(Include)\r
345 self.SetPackageIncludeFileList(PackagePathList + PackageIncludeFileList)\r
346 \r
347 ## GenPpis\r
348 #\r
349 # Gen Ppis of Dec\r
350 # <CName>=<GuidValue>\r
351 #\r
352 # @param ContainerFile: The Dec file full path \r
353 #\r
354 def GenGuidProtocolPpis(self, Type, ContainerFile):\r
355 if ContainerFile:\r
356 pass\r
357 Logger.Debug(2, "Generate %s ..." % Type)\r
358\r
359 Obj = None\r
360 Factory = None\r
361 if Type == TAB_GUIDS:\r
362 Obj = self.DecParser.GetGuidSectionObject()\r
363 def CreateGuidObject():\r
364 Object = GuidObject()\r
365 Object.SetGuidTypeList([])\r
366 Object.SetUsage(None)\r
367 Object.SetName(None)\r
368 return Object\r
369 Factory = CreateGuidObject\r
370 elif Type == TAB_PROTOCOLS:\r
371 Obj = self.DecParser.GetProtocolSectionObject()\r
372 \r
373 def CreateProtocolObject():\r
374 return ProtocolObject()\r
375 Factory = CreateProtocolObject\r
376 elif Type == TAB_PPIS:\r
377 Obj = self.DecParser.GetPpiSectionObject()\r
378\r
379 def CreatePpiObject():\r
380 return PpiObject()\r
381 Factory = CreatePpiObject\r
382 else:\r
383 #\r
384 # Should not be here\r
385 #\r
386 return\r
387 \r
388 DeclarationsList = []\r
389 \r
390 #\r
391 # Go through each arch\r
392 #\r
393 for Item in Obj.GetGuidStyleAllItems():\r
394 Name = Item.GuidCName\r
395 Value = Item.GuidString\r
396 HelpTxt = ParseGenericComment(Item.GetHeadComment() + \\r
397 Item.GetTailComment())\r
398 \r
399 ListObject = Factory()\r
400 ListObject.SetCName(Name)\r
401 ListObject.SetGuid(Value)\r
402 ListObject.SetSupArchList(Item.GetArchList())\r
403 if HelpTxt:\r
404 ListObject.SetHelpTextList([HelpTxt])\r
405 \r
406 DeclarationsList.append(ListObject)\r
407\r
408 # \r
409 #GuidTypeList is abstracted from help\r
410 #\r
411 if Type == TAB_GUIDS:\r
412 self.SetGuidList(self.GetGuidList() + DeclarationsList)\r
413 elif Type == TAB_PROTOCOLS:\r
414 self.SetProtocolList(self.GetProtocolList() + DeclarationsList)\r
415 elif Type == TAB_PPIS:\r
416 self.SetPpiList(self.GetPpiList() + DeclarationsList)\r
417 \r
418 ## GenLibraryClasses\r
419 #\r
420 # Gen LibraryClasses of Dec\r
421 # <CName>=<GuidValue>\r
422 #\r
423 # @param ContainerFile: The Dec file full path \r
424 #\r
425 def GenLibraryClasses(self, ContainerFile):\r
426 if ContainerFile:\r
427 pass\r
428 Logger.Debug(2, "Generate %s ..." % TAB_LIBRARY_CLASSES)\r
429 LibraryClassDeclarations = []\r
430 \r
431 LibObj = self.DecParser.GetLibraryClassSectionObject()\r
432 for Item in LibObj.GetAllLibraryclasses():\r
433 LibraryClass = LibraryClassObject()\r
434 LibraryClass.SetLibraryClass(Item.Libraryclass)\r
435 LibraryClass.SetSupArchList(Item.GetArchList())\r
436 LibraryClass.SetIncludeHeader(Item.File)\r
437 HelpTxt = ParseGenericComment(Item.GetHeadComment() + \\r
438 Item.GetTailComment(), None, '@libraryclass')\r
439 if HelpTxt:\r
440 LibraryClass.SetHelpTextList([HelpTxt])\r
441 LibraryClassDeclarations.append(LibraryClass)\r
442 \r
443 self.SetLibraryClassList(self.GetLibraryClassList() + \\r
444 LibraryClassDeclarations)\r
445 \r
446 ## GenPcds\r
447 #\r
448 # Gen Pcds of Dec\r
449 # <TokenSpcCName>.<TokenCName>|<Value>|<DatumType>|<Token>\r
450 #\r
451 # @param ContainerFile: The Dec file full path \r
452 #\r
453 def GenPcds(self, ContainerFile):\r
454 Logger.Debug(2, "Generate %s ..." % TAB_PCDS)\r
455 \r
456 PcdObj = self.DecParser.GetPcdSectionObject()\r
457 #\r
458 # Get all Pcds\r
459 # \r
460 PcdDeclarations = []\r
461 IterList = [\r
462 (TAB_PCDS_FIXED_AT_BUILD_NULL, 'FixedPcd'),\r
463 (TAB_PCDS_PATCHABLE_IN_MODULE_NULL, 'PatchPcd'), \r
464 (TAB_PCDS_FEATURE_FLAG_NULL, 'FeaturePcd'),\r
465 (TAB_PCDS_DYNAMIC_EX_NULL, 'PcdEx'), \r
466 (TAB_PCDS_DYNAMIC_NULL, 'Pcd')]\r
467 #\r
468 # For each PCD type\r
469 #\r
470 for PcdType, Type in IterList:\r
471 #\r
472 # Go through all archs\r
473 #\r
474 # for Arch in self.SupArchList + [TAB_ARCH_COMMON]:\r
475 #\r
476 for Item in PcdObj.GetPcdsByType(PcdType.upper()):\r
477 PcdDeclaration = GenPcdDeclaration(\r
478 ContainerFile,\r
479 (Item.TokenSpaceGuidCName, Item.TokenCName,\r
480 Item.DefaultValue, Item.DatumType, Item.TokenValue,\r
481 Type, Item.GetHeadComment(), Item.GetTailComment(),\r
482 '')\r
483 )\r
484 PcdDeclaration.SetSupArchList(Item.GetArchListOfType(PcdType))\r
485 PcdDeclarations.append(PcdDeclaration)\r
486 \r
487 self.SetPcdList(self.GetPcdList() + PcdDeclarations)\r
488\r
489 \r
490 ## GenModuleFileList\r
491 #\r
492 def GenModuleFileList(self, ContainerFile): \r
493 ModuleFileList = []\r
494 ContainerFileName = os.path.basename(ContainerFile)\r
495 ContainerFilePath = os.path.dirname(ContainerFile)\r
496 for Item in GetFiles(ContainerFilePath, \r
497 ['CVS', '.svn'] + self.GetIncludePathList(), False):\r
498 ExtName = os.path.splitext(Item)[1]\r
499 if ExtName.lower() == '.inf':\r
500 ModuleFileList.append(Item)\r
501 elif ExtName.upper() == '.DEC' and self.CheckMulDec:\r
502 if Item == ContainerFileName:\r
503 continue\r
504 Logger.Error('MkPkg', \r
505 UPT_MUL_DEC_ERROR,\r
506 ST.ERR_MUL_DEC_ERROR%(ContainerFilePath, \r
507 ContainerFileName, \r
508 Item))\r
509 \r
510 self.SetModuleFileList(ModuleFileList)\r
511 \r
512 ## Show detailed information of Package\r
513 #\r
514 # Print all members and their values of Package class\r
515 #\r
516 def ShowPackage(self):\r
517 print '\nName =', self.GetName()\r
518 print '\nBaseName =', self.GetBaseName()\r
519 print '\nVersion =', self.GetVersion() \r
520 print '\nGuid =', self.GetGuid()\r
521 \r
522 print '\nStandardIncludes = %d ' \\r
523 % len(self.GetStandardIncludeFileList()),\r
524 for Item in self.GetStandardIncludeFileList():\r
525 print Item.GetFilePath(), ' ', Item.GetSupArchList()\r
526 print '\nPackageIncludes = %d \n' \\r
527 % len(self.GetPackageIncludeFileList()),\r
528 for Item in self.GetPackageIncludeFileList():\r
529 print Item.GetFilePath(), ' ', Item.GetSupArchList()\r
530 \r
531 print '\nGuids =', self.GetGuidList()\r
532 for Item in self.GetGuidList():\r
533 print Item.GetCName(), Item.GetGuid(), Item.GetSupArchList()\r
534 print '\nProtocols =', self.GetProtocolList()\r
535 for Item in self.GetProtocolList():\r
536 print Item.GetCName(), Item.GetGuid(), Item.GetSupArchList()\r
537 print '\nPpis =', self.GetPpiList()\r
538 for Item in self.GetPpiList():\r
539 print Item.GetCName(), Item.GetGuid(), Item.GetSupArchList()\r
540 print '\nLibraryClasses =', self.GetLibraryClassList()\r
541 for Item in self.GetLibraryClassList():\r
542 print Item.GetLibraryClass(), Item.GetRecommendedInstance(), \\r
543 Item.GetSupArchList()\r
544 print '\nPcds =', self.GetPcdList()\r
545 for Item in self.GetPcdList():\r
546 print 'CName=', Item.GetCName(), 'TokenSpaceGuidCName=', \\r
547 Item.GetTokenSpaceGuidCName(), \\r
548 'DefaultValue=', Item.GetDefaultValue(), \\r
549 'ValidUsage=', Item.GetValidUsage(), \\r
550 'SupArchList', Item.GetSupArchList(), \\r
551 'Token=', Item.GetToken(), 'DatumType=', Item.GetDatumType()\r
552 \r
553 for Item in self.GetMiscFileList():\r
554 print Item.GetName()\r
555 for FileObjectItem in Item.GetFileList():\r
556 print FileObjectItem.GetURI()\r
557 print '****************\n'\r
558\r
559## GenPcdDeclaration\r
560#\r
561# @param ContainerFile: File name of the DEC file\r
562# @param PcdInfo: Pcd information, of format (TokenGuidCName, \r
563# TokenName, Value, DatumType, Token, Type, \r
564# GenericComment, TailComment, Arch)\r
565# \r
566def GenPcdDeclaration(ContainerFile, PcdInfo):\r
567 HelpStr = ''\r
568 TailHelpStr = ''\r
569 TokenGuidCName, TokenName, Value, DatumType, Token, Type, \\r
570 GenericComment, TailComment, Arch = PcdInfo\r
571 Pcd = PcdObject()\r
572 Pcd.SetCName(TokenName)\r
573 Pcd.SetToken(Token)\r
574 Pcd.SetTokenSpaceGuidCName(TokenGuidCName)\r
575 Pcd.SetDatumType(DatumType)\r
576 Pcd.SetDefaultValue(Value)\r
577 Pcd.SetValidUsage(Type)\r
578 #\r
579 # MaxDatumSize is required field for 'VOID*' PCD\r
580 #\r
581 if DatumType == TAB_PTR_TYPE_PCD:\r
582 Pcd.SetMaxDatumSize(ITEM_UNDEFINED)\r
583\r
584 SupArchList = [Arch]\r
585 Pcd.SetSupArchList(SupArchList)\r
586 \r
587 if GenericComment:\r
588 HelpStr, PcdErr = ParseDecPcdGenericComment(GenericComment, \r
589 ContainerFile)\r
590 if PcdErr:\r
591 Pcd.SetPcdErrorsList([PcdErr])\r
592\r
593 if TailComment:\r
594 SupModuleList, TailHelpStr = ParseDecPcdTailComment(TailComment, \r
595 ContainerFile)\r
596 if SupModuleList:\r
597 Pcd.SetSupModuleList(SupModuleList)\r
598 \r
599 if HelpStr and (not HelpStr.endswith('\n')) and TailHelpStr:\r
600 HelpStr += '\n'\r
601 HelpStr += TailHelpStr\r
602 if HelpStr:\r
603 HelpTxtObj = TextObject() \r
604 HelpTxtObj.SetString(HelpStr)\r
605 Pcd.SetHelpTextList([HelpTxtObj])\r
606\r
607 return Pcd\r