]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/Common/DecClassObjectLight.py
Check In tool source code based on Build tool project revision r1655.
[mirror_edk2.git] / BaseTools / Source / Python / Common / DecClassObjectLight.py
CommitLineData
30fdf114
LG
1## @file\r
2# This file is used to define each component of DEC file in light mode\r
3#\r
4# Copyright (c) 2008, Intel Corporation\r
5# All rights reserved. This program and the accompanying materials\r
6# are licensed and made available under the terms and conditions of the BSD License\r
7# which accompanies this distribution. The full text of the license may be found at\r
8# http://opensource.org/licenses/bsd-license.php\r
9#\r
10# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12#\r
13\r
14##\r
15# Import Modules\r
16#\r
17import os\r
18from Misc import GetFiles\r
19from String import *\r
20from DataType import *\r
21from CommonDataClass.PackageClass import *\r
22from CommonDataClass import CommonClass\r
23from BuildToolError import *\r
24from Parsing import *\r
25\r
26# Global variable\r
27Section = {TAB_UNKNOWN.upper() : MODEL_UNKNOWN,\r
28 TAB_DEC_DEFINES.upper() : MODEL_META_DATA_HEADER,\r
29 TAB_INCLUDES.upper() : MODEL_EFI_INCLUDE,\r
30 TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_CLASS,\r
31 TAB_COMPONENTS.upper() : MODEL_META_DATA_COMPONENT,\r
32 TAB_GUIDS.upper() : MODEL_EFI_GUID,\r
33 TAB_PROTOCOLS.upper() : MODEL_EFI_PROTOCOL,\r
34 TAB_PPIS.upper() : MODEL_EFI_PPI,\r
35 TAB_PCDS_FIXED_AT_BUILD_NULL.upper() : MODEL_PCD_FIXED_AT_BUILD,\r
36 TAB_PCDS_PATCHABLE_IN_MODULE_NULL.upper() : MODEL_PCD_PATCHABLE_IN_MODULE,\r
37 TAB_PCDS_FEATURE_FLAG_NULL.upper() : MODEL_PCD_FEATURE_FLAG,\r
38 TAB_PCDS_DYNAMIC_EX_NULL.upper() : MODEL_PCD_DYNAMIC_EX,\r
39 TAB_PCDS_DYNAMIC_NULL.upper() : MODEL_PCD_DYNAMIC,\r
40 TAB_USER_EXTENSIONS.upper() : MODEL_META_DATA_USER_EXTENSION\r
41 }\r
42\r
43## DecObject\r
44#\r
45# This class defined basic Dec object which is used by inheriting\r
46# \r
47# @param object: Inherited from object class\r
48#\r
49class DecObject(object):\r
50 def __init__(self):\r
51 object.__init__()\r
52\r
53## Dec\r
54#\r
55# This class defined the structure used in Dec object\r
56# \r
57# @param DecObject: Inherited from DecObject class\r
58# @param Filename: Input value for Filename of Dec file, default is None\r
59# @param IsMergeAllArches: Input value for IsMergeAllArches\r
60# True is to merge all arches\r
61# Fales is not to merge all arches\r
62# default is False\r
63# @param IsToPackage: Input value for IsToPackage\r
64# True is to transfer to PackageObject automatically\r
65# False is not to transfer to PackageObject automatically\r
66# default is False\r
67# @param WorkspaceDir: Input value for current workspace directory, default is None\r
68#\r
69# @var Identification: To store value for Identification, it is a structure as Identification\r
70# @var Defines: To store value for Defines, it is a structure as DecDefines\r
71# @var UserExtensions: To store value for UserExtensions\r
72# @var Package: To store value for Package, it is a structure as PackageClass\r
73# @var WorkspaceDir: To store value for WorkspaceDir\r
74# @var Contents: To store value for Contents, it is a structure as DecContents\r
75# @var KeyList: To store value for KeyList, a list for all Keys used in Dec\r
76#\r
77class Dec(DecObject):\r
78 def __init__(self, Filename = None, IsToPackage = False, WorkspaceDir = None, AllGuidVersionDict = None, SupArchList = DataType.ARCH_LIST):\r
79 self.Identification = IdentificationClass()\r
80 self.Package = PackageClass()\r
81 self.UserExtensions = ''\r
82 self.WorkspaceDir = WorkspaceDir\r
83 self.SupArchList = SupArchList\r
84 self.AllGuidVersionDict = {}\r
85 if AllGuidVersionDict:\r
86 self.AllGuidVersionDict = AllGuidVersionDict\r
87\r
88 self.KeyList = [\r
89 TAB_INCLUDES, TAB_GUIDS, TAB_PROTOCOLS, TAB_PPIS, TAB_LIBRARY_CLASSES, \\r
90 TAB_PCDS_FIXED_AT_BUILD_NULL, TAB_PCDS_PATCHABLE_IN_MODULE_NULL, TAB_PCDS_FEATURE_FLAG_NULL, \\r
91 TAB_PCDS_DYNAMIC_NULL, TAB_PCDS_DYNAMIC_EX_NULL, TAB_DEC_DEFINES\r
92 ]\r
93 # Upper all KEYs to ignore case sensitive when parsing\r
94 self.KeyList = map(lambda c: c.upper(), self.KeyList)\r
95 \r
96 # Init RecordSet\r
97 self.RecordSet = {} \r
98 for Key in self.KeyList:\r
99 self.RecordSet[Section[Key]] = []\r
100 \r
101 # Init Comment\r
102 self.SectionHeaderCommentDict = {}\r
103 \r
104 # Load Dec file if filename is not None\r
105 if Filename != None:\r
106 self.LoadDecFile(Filename)\r
107 \r
108 # Transfer to Package Object if IsToPackage is True\r
109 if IsToPackage:\r
110 self.DecToPackage()\r
111 \r
112 ## Load Dec file\r
113 #\r
114 # Load the file if it exists\r
115 #\r
116 # @param Filename: Input value for filename of Dec file\r
117 #\r
118 def LoadDecFile(self, Filename):\r
119 # Insert a record for file\r
120 Filename = NormPath(Filename)\r
121 self.Identification.FullPath = Filename\r
122 (self.Identification.RelaPath, self.Identification.FileName) = os.path.split(Filename)\r
123 if self.Identification.FullPath.find(self.WorkspaceDir) > -1:\r
124 self.Identification.PackagePath = os.path.dirname(self.Identification.FullPath[len(self.WorkspaceDir) + 1:]) \r
125 \r
126 # Init common datas\r
127 IfDefList, SectionItemList, CurrentSection, ArchList, ThirdList, IncludeFiles = \\r
128 [], [], TAB_UNKNOWN, [], [], []\r
129 LineNo = 0\r
130 \r
131 # Parse file content\r
132 IsFindBlockComment = False\r
133 ReservedLine = ''\r
134 Comment = ''\r
135 for Line in open(Filename, 'r'):\r
136 LineNo = LineNo + 1\r
137 # Remove comment block\r
138 if Line.find(TAB_COMMENT_R8_START) > -1:\r
139 ReservedLine = GetSplitValueList(Line, TAB_COMMENT_R8_START, 1)[0]\r
140 if ReservedLine.strip().startswith(TAB_COMMENT_SPLIT):\r
141 Comment = Comment + Line.strip() + '\n'\r
142 ReservedLine = ''\r
143 else:\r
144 Comment = Comment + Line[len(ReservedLine):] + '\n'\r
145 IsFindBlockComment = True\r
146 if not ReservedLine:\r
147 continue\r
148 if Line.find(TAB_COMMENT_R8_END) > -1:\r
149 Comment = Comment + Line[:Line.find(TAB_COMMENT_R8_END) + len(TAB_COMMENT_R8_END)] + '\n'\r
150 Line = ReservedLine + GetSplitValueList(Line, TAB_COMMENT_R8_END, 1)[1]\r
151 ReservedLine = ''\r
152 IsFindBlockComment = False\r
153 if IsFindBlockComment:\r
154 Comment = Comment + Line.strip() + '\n'\r
155 continue\r
156\r
157 # Remove comments at tail and remove spaces again\r
158 if Line.strip().startswith(TAB_COMMENT_SPLIT) or Line.strip().startswith('--/'):\r
159 Comment = Comment + Line.strip() + '\n'\r
160 Line = CleanString(Line)\r
161 if Line == '':\r
162 continue\r
163 \r
164 ## Find a new section tab\r
165 # First insert previous section items\r
166 # And then parse the content of the new section\r
167 #\r
168 if Line.startswith(TAB_SECTION_START) and Line.endswith(TAB_SECTION_END):\r
169 # Insert items data of previous section\r
170 Model = Section[CurrentSection.upper()]\r
171 InsertSectionItems(Model, CurrentSection, SectionItemList, ArchList, ThirdList, self.RecordSet)\r
172 # Parse the new section\r
173 SectionItemList = []\r
174 ArchList = []\r
175 ThirdList = []\r
176 \r
177 CurrentSection = ''\r
178 LineList = GetSplitValueList(Line[len(TAB_SECTION_START):len(Line) - len(TAB_SECTION_END)], TAB_COMMA_SPLIT)\r
179 for Item in LineList:\r
180 ItemList = GetSplitValueList(Item, TAB_SPLIT)\r
181 if CurrentSection == '':\r
182 CurrentSection = ItemList[0]\r
183 else:\r
184 if CurrentSection != ItemList[0]:\r
185 EdkLogger.error("Parser", PARSER_ERROR, "Different section names '%s' and '%s' are found in one section definition, this is not allowed." % (CurrentSection, ItemList[0]), File=Filename, Line=LineNo, RaiseError = EdkLogger.IsRaiseError)\r
186 if CurrentSection.upper() not in self.KeyList:\r
187 RaiseParserError(Line, CurrentSection, Filename, '', LineNo)\r
188 ItemList.append('')\r
189 ItemList.append('')\r
190 if len(ItemList) > 5:\r
191 RaiseParserError(Line, CurrentSection, Filename, '', LineNo)\r
192 else:\r
193 if ItemList[1] != '' and ItemList[1].upper() not in ARCH_LIST_FULL:\r
194 EdkLogger.error("Parser", PARSER_ERROR, "Invalid Arch definition '%s' found" % ItemList[1], File=Filename, Line=LineNo, RaiseError = EdkLogger.IsRaiseError)\r
195 ArchList.append(ItemList[1].upper())\r
196 ThirdList.append(ItemList[2])\r
197 \r
198 if Comment:\r
199 if Comment.endswith('\n'):\r
200 Comment = Comment[:len(Comment) - len('\n')]\r
201 self.SectionHeaderCommentDict[Section[CurrentSection.upper()]] = Comment\r
202 Comment = ''\r
203 continue\r
204 \r
205 # Not in any defined section\r
206 if CurrentSection == TAB_UNKNOWN:\r
207 ErrorMsg = "%s is not in any defined section" % Line\r
208 EdkLogger.error("Parser", PARSER_ERROR, ErrorMsg, File=Filename, Line=LineNo, RaiseError = EdkLogger.IsRaiseError)\r
209\r
210 # Add a section item\r
211 SectionItemList.append([Line, LineNo, Comment])\r
212 Comment = ''\r
213 # End of parse\r
214 #End of For\r
215 \r
216 #\r
217 # Insert items data of last section\r
218 #\r
219 Model = Section[CurrentSection.upper()]\r
220 InsertSectionItems(Model, CurrentSection, SectionItemList, ArchList, ThirdList, self.RecordSet)\r
221 if Comment != '':\r
222 self.SectionHeaderCommentDict[Model] = Comment\r
223 Comment = ''\r
224\r
225 ## Package Object to DEC file\r
226 def PackageToDec(self, Package):\r
227 Dec = ''\r
228 DecList = sdict()\r
229 SectionHeaderCommentDict = {}\r
230 if Package == None:\r
231 return Dec\r
232 \r
233 PackageHeader = Package.PackageHeader\r
234 TmpList = []\r
235 if PackageHeader.Name:\r
236 TmpList.append(TAB_DEC_DEFINES_PACKAGE_NAME + ' = ' + PackageHeader.Name)\r
237 if PackageHeader.Guid:\r
238 TmpList.append(TAB_DEC_DEFINES_PACKAGE_GUID + ' = ' + PackageHeader.Guid)\r
239 if PackageHeader.Version:\r
240 TmpList.append(TAB_DEC_DEFINES_PACKAGE_VERSION + ' = ' + PackageHeader.Version)\r
241 if PackageHeader.DecSpecification:\r
242 TmpList.append(TAB_DEC_DEFINES_DEC_SPECIFICATION + ' = ' + PackageHeader.DecSpecification)\r
243 if Package.UserExtensions != None:\r
244 for Item in Package.UserExtensions.Defines:\r
245 TmpList.append(Item)\r
246 DecList['Defines'] =TmpList\r
247 if PackageHeader.Description != '':\r
248 SectionHeaderCommentDict['Defines'] = PackageHeader.Description\r
249 \r
250 for Item in Package.Includes:\r
251 Key = 'Includes.' + Item.SupArchList\r
252 Value = Item.FilePath\r
253 GenMetaDatSectionItem(Key, Value, DecList)\r
254 \r
255 for Item in Package.GuidDeclarations:\r
256 Key = 'Guids.' + Item.SupArchList\r
257 Value = Item.CName + '=' + Item.Guid\r
258 GenMetaDatSectionItem(Key, Value, DecList)\r
259 \r
260 for Item in Package.ProtocolDeclarations:\r
261 Key = 'Protocols.' + Item.SupArchList\r
262 Value = Item.CName + '=' + Item.Guid\r
263 GenMetaDatSectionItem(Key, Value, DecList)\r
264 \r
265 for Item in Package.PpiDeclarations:\r
266 Key = 'Ppis.' + Item.SupArchList\r
267 Value = Item.CName + '=' + Item.Guid\r
268 GenMetaDatSectionItem(Key, Value, DecList)\r
269 \r
270 for Item in Package.LibraryClassDeclarations:\r
271 Key = 'LibraryClasses.' + Item.SupArchList\r
272 Value = Item.LibraryClass + '|' + Item.RecommendedInstance\r
273 GenMetaDatSectionItem(Key, Value, DecList)\r
274\r
275 for Item in Package.PcdDeclarations:\r
276 Key = 'Pcds' + Item.ItemType + '.' + Item.SupArchList\r
277 Value = Item.TokenSpaceGuidCName + '.' + Item.CName\r
278 if Item.DefaultValue != '':\r
279 Value = Value + '|' + Item.DefaultValue\r
280 if Item.DatumType != '':\r
281 Value = Value + '|' + Item.DatumType\r
282 if Item.Token != '':\r
283 Value = Value + '|' + Item.Token\r
284 GenMetaDatSectionItem(Key, Value, DecList)\r
285\r
286 # Transfer Package to Inf\r
287 for Key in DecList:\r
288 if Key in SectionHeaderCommentDict:\r
289 List = SectionHeaderCommentDict[Key].split('\r')\r
290 for Item in List:\r
291 Dec = Dec + Item + '\n'\r
292 Dec = Dec + '[' + Key + ']' + '\n'\r
293 for Value in DecList[Key]:\r
294 if type(Value) == type([]):\r
295 for SubValue in Value:\r
296 Dec = Dec + ' ' + SubValue + '\n'\r
297 else:\r
298 Dec = Dec + ' ' + Value + '\n'\r
299 Dec = Dec + '\n'\r
300 \r
301 return Dec\r
302\r
303 ## Transfer to Package Object\r
304 # \r
305 # Transfer all contents of a Dec file to a standard Package Object\r
306 #\r
307 def DecToPackage(self):\r
308 # Init global information for the file\r
309 ContainerFile = self.Identification.FullPath\r
310 \r
311 # Generate Package Header\r
312 self.GenPackageHeader(ContainerFile)\r
313 \r
314 # Generate Includes\r
315 # Only for R8\r
316 self.GenIncludes(ContainerFile)\r
317\r
318 # Generate Guids\r
319 self.GenGuidProtocolPpis(DataType.TAB_GUIDS, ContainerFile)\r
320\r
321 # Generate Protocols\r
322 self.GenGuidProtocolPpis(DataType.TAB_PROTOCOLS, ContainerFile)\r
323\r
324 # Generate Ppis\r
325 self.GenGuidProtocolPpis(DataType.TAB_PPIS, ContainerFile)\r
326 \r
327 # Generate LibraryClasses\r
328 self.GenLibraryClasses(ContainerFile)\r
329 \r
330 # Generate Pcds\r
331 self.GenPcds(ContainerFile)\r
332 \r
333 # Init MiscFiles\r
334 self.GenMiscFiles(ContainerFile)\r
335 \r
336 ## GenMiscFiles\r
337 #\r
338 def GenMiscFiles(self, ContainerFile):\r
339 MiscFiles = MiscFileClass()\r
340 MiscFiles.Name = 'ModuleFiles'\r
341 for Item in GetFiles(os.path.dirname(ContainerFile), ['CVS', '.svn'], False):\r
342 File = CommonClass.FileClass()\r
343 File.Filename = Item\r
344 MiscFiles.Files.append(File)\r
345 self.Package.MiscFiles = MiscFiles\r
346 \r
347 ## Get Package Header\r
348 #\r
349 # Gen Package Header of Dec as <Key> = <Value>\r
350 #\r
351 # @param ContainerFile: The Dec file full path \r
352 #\r
353 def GenPackageHeader(self, ContainerFile):\r
354 EdkLogger.debug(2, "Generate PackageHeader ...")\r
355 #\r
356 # Update all defines item in database\r
357 #\r
358 RecordSet = self.RecordSet[MODEL_META_DATA_HEADER]\r
359 PackageHeader = PackageHeaderClass()\r
360 OtherDefines = []\r
361 for Record in RecordSet:\r
362 ValueList = GetSplitValueList(Record[0], TAB_EQUAL_SPLIT)\r
363 if len(ValueList) != 2:\r
364 OtherDefines.append(Record[0])\r
365 else:\r
366 Name = ValueList[0]\r
367 Value = ValueList[1]\r
368 if Name == TAB_DEC_DEFINES_PACKAGE_NAME:\r
369 PackageHeader.Name = Value\r
370 elif Name == TAB_DEC_DEFINES_PACKAGE_GUID:\r
371 PackageHeader.Guid = Value\r
372 elif Name == TAB_DEC_DEFINES_PACKAGE_VERSION:\r
373 PackageHeader.Version = Value\r
374 elif Name == TAB_DEC_DEFINES_DEC_SPECIFICATION:\r
375 PackageHeader.DecSpecification = Value\r
376 else:\r
377 OtherDefines.append(Record[0])\r
378 \r
379 PackageHeader.FileName = self.Identification.FileName\r
380 PackageHeader.FullPath = self.Identification.FullPath\r
381 PackageHeader.RelaPath = self.Identification.RelaPath\r
382 PackageHeader.PackagePath = self.Identification.PackagePath\r
383 PackageHeader.ModulePath = self.Identification.ModulePath\r
384 PackageHeader.CombinePath = os.path.normpath(os.path.join(PackageHeader.PackagePath, PackageHeader.ModulePath, PackageHeader.FileName))\r
385 \r
386 if MODEL_META_DATA_HEADER in self.SectionHeaderCommentDict:\r
387 PackageHeader.Description = self.SectionHeaderCommentDict[MODEL_META_DATA_HEADER]\r
388 \r
389 self.Package.PackageHeader = PackageHeader\r
390 UE = UserExtensionsClass()\r
391 UE.Defines = OtherDefines\r
392 self.Package.UserExtensions = UE\r
393 \r
394 \r
395 ## GenIncludes\r
396 #\r
397 # Gen Includes of Dec\r
398 # \r
399 # @param ContainerFile: The Dec file full path \r
400 #\r
401 def GenIncludes(self, ContainerFile):\r
402 EdkLogger.debug(2, "Generate %s ..." % TAB_INCLUDES)\r
403 Includes = {}\r
404 # Get all Includes\r
405 RecordSet = self.RecordSet[MODEL_EFI_INCLUDE]\r
406 \r
407 # Go through each arch\r
408 for Record in RecordSet:\r
409 Arch = Record[1]\r
410 Key = Record[0]\r
411 Include = IncludeClass()\r
412 Include.FilePath = NormPath(Key)\r
413 Include.SupArchList = Arch\r
414 self.Package.Includes.append(Include)\r
415 \r
416 ## GenPpis\r
417 #\r
418 # Gen Ppis of Dec\r
419 # <CName>=<GuidValue>\r
420 #\r
421 # @param ContainerFile: The Dec file full path \r
422 #\r
423 def GenGuidProtocolPpis(self, Type, ContainerFile):\r
424 EdkLogger.debug(2, "Generate %s ..." % Type)\r
425 Lists = {}\r
426 # Get all Items\r
427 RecordSet = self.RecordSet[Section[Type.upper()]]\r
428 \r
429 # Go through each arch\r
430 for Record in RecordSet:\r
431 Arch = Record[1]\r
432 (Name, Value) = GetGuidsProtocolsPpisOfDec(Record[0], Type, ContainerFile, Record[2])\r
433 \r
434 ListMember = None\r
435 if Type == TAB_GUIDS:\r
436 ListMember = self.Package.GuidDeclarations\r
437 elif Type == TAB_PROTOCOLS:\r
438 ListMember = self.Package.ProtocolDeclarations\r
439 elif Type == TAB_PPIS:\r
440 ListMember = self.Package.PpiDeclarations\r
441 \r
442 ListClass = GuidProtocolPpiCommonClass()\r
443 ListClass.CName = Name\r
444 ListClass.Guid = Value\r
445 ListClass.SupArchList = Arch\r
446 ListMember.append(ListClass)\r
447 \r
448 ## GenLibraryClasses\r
449 #\r
450 # Gen LibraryClasses of Dec\r
451 # <CName>=<GuidValue>\r
452 #\r
453 # @param ContainerFile: The Dec file full path \r
454 #\r
455 def GenLibraryClasses(self, ContainerFile):\r
456 EdkLogger.debug(2, "Generate %s ..." % TAB_LIBRARY_CLASSES)\r
457 LibraryClasses = {}\r
458 # Get all Guids\r
459 RecordSet = self.RecordSet[MODEL_EFI_LIBRARY_CLASS]\r
460 \r
461 # Go through each arch\r
462 for Record in RecordSet:\r
463 Arch = Record[1]\r
464 List = GetSplitValueList(Record[0], DataType.TAB_VALUE_SPLIT)\r
465 if len(List) != 2:\r
466 continue\r
467 LibraryClass = LibraryClassClass()\r
468 LibraryClass.LibraryClass = List[0]\r
469 LibraryClass.RecommendedInstance = NormPath(List[1])\r
470 LibraryClass.SupArchList = Arch\r
471 self.Package.LibraryClassDeclarations.append(LibraryClass)\r
472 \r
473 def AddPcd(self, CName, Token, TokenSpaceGuidCName, DatumType, DefaultValue, ItemType, Arch):\r
474 Pcd = CommonClass.PcdClass()\r
475 Pcd.CName = CName\r
476 Pcd.Token = Token\r
477 Pcd.TokenSpaceGuidCName = TokenSpaceGuidCName\r
478 Pcd.DatumType = DatumType\r
479 Pcd.DefaultValue = DefaultValue\r
480 Pcd.ItemType = ItemType\r
481 Pcd.SupArchList = Arch\r
482 self.Package.PcdDeclarations.append(Pcd)\r
483 \r
484 ## GenPcds\r
485 #\r
486 # Gen Pcds of Dec\r
487 # <TokenSpcCName>.<TokenCName>|<Value>|<DatumType>|<Token>\r
488 #\r
489 # @param ContainerFile: The Dec file full path \r
490 #\r
491 def GenPcds(self, ContainerFile):\r
492 EdkLogger.debug(2, "Generate %s ..." % TAB_PCDS)\r
493 Pcds = {}\r
494 PcdToken = {}\r
495 # Get all Pcds\r
496 RecordSet1 = self.RecordSet[MODEL_PCD_FIXED_AT_BUILD]\r
497 RecordSet2 = self.RecordSet[MODEL_PCD_PATCHABLE_IN_MODULE]\r
498 RecordSet3 = self.RecordSet[MODEL_PCD_FEATURE_FLAG]\r
499 RecordSet4 = self.RecordSet[MODEL_PCD_DYNAMIC_EX]\r
500 RecordSet5 = self.RecordSet[MODEL_PCD_DYNAMIC]\r
501 \r
502 # Go through each pcd\r
503 for Record in RecordSet1:\r
504 Arch = Record[1]\r
505 (TokenGuidCName, TokenName, DefaultValue, DatumType, Token, ItemType) = GetPcdOfDec(Record[0], TAB_PCDS_FIXED_AT_BUILD, ContainerFile, Record[2])\r
506 self.AddPcd(TokenName, Token, TokenGuidCName, DatumType, DefaultValue, ItemType, Arch)\r
507 for Record in RecordSet2:\r
508 Arch = Record[1]\r
509 (TokenGuidCName, TokenName, DefaultValue, DatumType, Token, ItemType) = GetPcdOfDec(Record[0], TAB_PCDS_PATCHABLE_IN_MODULE, ContainerFile, Record[2])\r
510 self.AddPcd(TokenName, Token, TokenGuidCName, DatumType, DefaultValue, ItemType, Arch)\r
511 for Record in RecordSet3:\r
512 Arch = Record[1]\r
513 (TokenGuidCName, TokenName, DefaultValue, DatumType, Token, ItemType) = GetPcdOfDec(Record[0], TAB_PCDS_FEATURE_FLAG, ContainerFile, Record[2])\r
514 self.AddPcd(TokenName, Token, TokenGuidCName, DatumType, DefaultValue, ItemType, Arch)\r
515 for Record in RecordSet4:\r
516 Arch = Record[1]\r
517 (TokenGuidCName, TokenName, DefaultValue, DatumType, Token, ItemType) = GetPcdOfDec(Record[0], TAB_PCDS_DYNAMIC_EX, ContainerFile, Record[2])\r
518 self.AddPcd(TokenName, Token, TokenGuidCName, DatumType, DefaultValue, ItemType, Arch)\r
519 for Record in RecordSet5:\r
520 Arch = Record[1]\r
521 (TokenGuidCName, TokenName, DefaultValue, DatumType, Token, ItemType) = GetPcdOfDec(Record[0], TAB_PCDS_DYNAMIC, ContainerFile, Record[2])\r
522 self.AddPcd(TokenName, Token, TokenGuidCName, DatumType, DefaultValue, ItemType, Arch)\r
523 \r
524 ## Show detailed information of Package\r
525 #\r
526 # Print all members and their values of Package class\r
527 #\r
528 def ShowPackage(self):\r
529 M = self.Package\r
530 print 'Filename =', M.PackageHeader.FileName\r
531 print 'FullPath =', M.PackageHeader.FullPath\r
532 print 'RelaPath =', M.PackageHeader.RelaPath\r
533 print 'PackagePath =', M.PackageHeader.PackagePath\r
534 print 'ModulePath =', M.PackageHeader.ModulePath\r
535 print 'CombinePath =', M.PackageHeader.CombinePath\r
536 \r
537 print 'BaseName =', M.PackageHeader.Name\r
538 print 'Guid =', M.PackageHeader.Guid\r
539 print 'Version =', M.PackageHeader.Version\r
540 print 'DecSpecification =', M.PackageHeader.DecSpecification\r
541\r
542 print '\nIncludes ='#, M.Includes\r
543 for Item in M.Includes:\r
544 print Item.FilePath, Item.SupArchList\r
545 print '\nGuids ='#, M.GuidDeclarations\r
546 for Item in M.GuidDeclarations:\r
547 print Item.CName, Item.Guid, Item.SupArchList\r
548 print '\nProtocols ='#, M.ProtocolDeclarations\r
549 for Item in M.ProtocolDeclarations:\r
550 print Item.CName, Item.Guid, Item.SupArchList\r
551 print '\nPpis ='#, M.PpiDeclarations\r
552 for Item in M.PpiDeclarations:\r
553 print Item.CName, Item.Guid, Item.SupArchList\r
554 print '\nLibraryClasses ='#, M.LibraryClassDeclarations\r
555 for Item in M.LibraryClassDeclarations:\r
556 print Item.LibraryClass, Item.RecommendedInstance, Item.SupModuleList, Item.SupArchList\r
557 print '\nPcds ='#, M.PcdDeclarations\r
558 for Item in M.PcdDeclarations:\r
559 print 'CName=', Item.CName, 'TokenSpaceGuidCName=', Item.TokenSpaceGuidCName, 'DefaultValue=', Item.DefaultValue, 'ItemType=', Item.ItemType, 'Token=', Item.Token, 'DatumType=', Item.DatumType, Item.SupArchList\r
560 print '\nUserExtensions =', M.UserExtensions.Defines\r
561 print '\n*** FileList ***'\r
562 for Item in M.MiscFiles.Files:\r
563 print Item.Filename\r
564 print '****************\n'\r
565\r
566##\r
567#\r
568# This acts like the main() function for the script, unless it is 'import'ed into another\r
569# script.\r
570#\r
571if __name__ == '__main__':\r
572 EdkLogger.Initialize()\r
573 EdkLogger.SetLevel(EdkLogger.QUIET)\r
574 \r
575 W = os.getenv('WORKSPACE')\r
576 F = os.path.join(W, 'MdeModulePkg/MdeModulePkg.dec')\r
577\r
578 P = Dec(os.path.normpath(F), True, W)\r
579 P.ShowPackage()\r
580 print P.PackageToDec(P.Package)\r