1. Add some interfaces for ECC tool in DEC/INF/DSC parser
[people/mcb30/basetools.git] / Source / Python / Common / DecClassObject.py
1 ## @file\r
2 # This file is used to define each component of DEC file\r
3 #\r
4 # Copyright (c) 2007, 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
17 import os\r
18 from String import *\r
19 from DataType import *\r
20 from Identification import *\r
21 from Dictionary import *\r
22 from CommonDataClass.PackageClass import *\r
23 from CommonDataClass.CommonClass import PcdClass\r
24 from BuildToolError import *\r
25 from Table.TableDec import TableDec\r
26 import Database as Database\r
27 from Parsing import *\r
28 import GlobalData\r
29 \r
30 #\r
31 # Global variable\r
32 #\r
33 Section = {TAB_UNKNOWN.upper() : MODEL_UNKNOWN,\r
34            TAB_DEC_DEFINES.upper() : MODEL_META_DATA_HEADER,\r
35            TAB_INCLUDES.upper() : MODEL_EFI_INCLUDE,\r
36            TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_CLASS,\r
37            TAB_COMPONENTS.upper() : MODEL_META_DATA_COMPONENT,\r
38            TAB_GUIDS.upper() : MODEL_EFI_GUID,\r
39            TAB_PROTOCOLS.upper() : MODEL_EFI_PROTOCOL,\r
40            TAB_PPIS.upper() : MODEL_EFI_PPI,\r
41            TAB_PCDS_FIXED_AT_BUILD_NULL.upper() : MODEL_PCD_FIXED_AT_BUILD,\r
42            TAB_PCDS_PATCHABLE_IN_MODULE_NULL.upper() : MODEL_PCD_PATCHABLE_IN_MODULE,\r
43            TAB_PCDS_FEATURE_FLAG_NULL.upper() : MODEL_PCD_FEATURE_FLAG,\r
44            TAB_PCDS_DYNAMIC_EX_NULL.upper() : MODEL_PCD_DYNAMIC_EX,\r
45            TAB_PCDS_DYNAMIC_NULL.upper() : MODEL_PCD_DYNAMIC,\r
46            TAB_USER_EXTENSIONS.upper() : MODEL_META_DATA_USER_EXTENSION\r
47            }\r
48 \r
49 \r
50 ## DecObject\r
51 #\r
52 # This class defined basic Dec object which is used by inheriting\r
53\r
54 # @param object:       Inherited from object class\r
55 #\r
56 class DecObject(object):\r
57     def __init__(self):\r
58         object.__init__()\r
59 \r
60 ## Dec\r
61 #\r
62 # This class defined the structure used in Dec object\r
63\r
64 # @param DecObject:         Inherited from DecObject class\r
65 # @param Filename:          Input value for Filename of Dec file, default is None\r
66 # @param IsMergeAllArches:  Input value for IsMergeAllArches\r
67 #                           True is to merge all arches\r
68 #                           Fales is not to merge all arches\r
69 #                           default is False\r
70 # @param IsToPackage:       Input value for IsToPackage\r
71 #                           True is to transfer to PackageObject automatically\r
72 #                           False is not to transfer to PackageObject automatically\r
73 #                           default is False\r
74 # @param WorkspaceDir:      Input value for current workspace directory, default is None\r
75 #\r
76 # @var Identification:      To store value for Identification, it is a structure as Identification\r
77 # @var Defines:             To store value for Defines, it is a structure as DecDefines\r
78 # @var UserExtensions:      To store value for UserExtensions\r
79 # @var Package:             To store value for Package, it is a structure as PackageClass\r
80 # @var WorkspaceDir:        To store value for WorkspaceDir\r
81 # @var Contents:            To store value for Contents, it is a structure as DecContents\r
82 # @var KeyList:             To store value for KeyList, a list for all Keys used in Dec\r
83 #\r
84 class Dec(DecObject):\r
85     def __init__(self, Filename = None, IsToDatabase = False, IsToPackage = False, WorkspaceDir = None, Database = None, SupArchList = DataType.ARCH_LIST):\r
86         self.Identification = Identification()\r
87         self.Package = PackageClass()\r
88         self.UserExtensions = ''\r
89         self.WorkspaceDir = WorkspaceDir\r
90         self.SupArchList = SupArchList\r
91         self.IsToDatabase = IsToDatabase\r
92         \r
93         self.Cur = Database.Cur\r
94         self.TblFile = Database.TblFile\r
95         self.TblDec = TableDec(Database.Cur)\r
96 \r
97         self.KeyList = [\r
98             TAB_INCLUDES, TAB_GUIDS, TAB_PROTOCOLS, TAB_PPIS, TAB_LIBRARY_CLASSES, \\r
99             TAB_PCDS_FIXED_AT_BUILD_NULL, TAB_PCDS_PATCHABLE_IN_MODULE_NULL, TAB_PCDS_FEATURE_FLAG_NULL, \\r
100             TAB_PCDS_DYNAMIC_NULL, TAB_PCDS_DYNAMIC_EX_NULL, TAB_DEC_DEFINES\r
101         ]\r
102         #\r
103         # Upper all KEYs to ignore case sensitive when parsing\r
104         #\r
105         self.KeyList = map(lambda c: c.upper(), self.KeyList)\r
106         \r
107         #\r
108         # Init RecordSet\r
109         #\r
110         self.RecordSet = {}        \r
111         for Key in self.KeyList:\r
112             self.RecordSet[Section[Key]] = []\r
113         \r
114         #\r
115         # Load Dec file if filename is not None\r
116         #\r
117         if Filename != None:\r
118             self.LoadDecFile(Filename)\r
119         \r
120         #\r
121         # Transfer to Package Object if IsToPackage is True\r
122         #\r
123         if IsToPackage:\r
124             self.DecToPackage()\r
125     \r
126     ## Load Dec file\r
127     #\r
128     # Load the file if it exists\r
129     #\r
130     # @param Filename:  Input value for filename of Dec file\r
131     #\r
132     def LoadDecFile(self, Filename):\r
133         #\r
134         # Insert a record for file\r
135         #\r
136         Filename = NormPath(Filename)\r
137         self.Identification.FileFullPath = Filename\r
138         (self.Identification.FileRelativePath, self.Identification.FileName) = os.path.split(Filename)\r
139         FileID = self.TblFile.InsertFile(Filename, MODEL_FILE_DSC)\r
140         \r
141         #\r
142         # Init DecTable\r
143         #\r
144         self.TblDec.Table = "Dec%s" % FileID\r
145         self.TblDec.Create()\r
146         \r
147         #\r
148         # Init common datas\r
149         #\r
150         IfDefList, SectionItemList, CurrentSection, ArchList, ThirdList, IncludeFiles = \\r
151         [], [], TAB_UNKNOWN, [], [], []\r
152         LineNo = 0\r
153         \r
154         #\r
155         # Parse file content\r
156         #\r
157         IsFindBlockComment = False\r
158         ReservedLine = ''\r
159         for Line in open(Filename, 'r'):\r
160             LineNo = LineNo + 1\r
161             #\r
162             # Remove comment block\r
163             #\r
164             if Line.find(TAB_COMMENT_R8_START) > -1:\r
165                 ReservedLine = GetSplitValueList(Line, TAB_COMMENT_R8_START, 1)[0]\r
166                 IsFindBlockComment = True\r
167             if Line.find(TAB_COMMENT_R8_END) > -1:\r
168                 Line = ReservedLine + GetSplitValueList(Line, TAB_COMMENT_R8_END, 1)[1]\r
169                 ReservedLine = ''\r
170                 IsFindBlockComment = False\r
171             if IsFindBlockComment:\r
172                 continue\r
173 \r
174             #\r
175             # Remove comments at tail and remove spaces again\r
176             #\r
177             Line = CleanString(Line)\r
178             if Line == '':\r
179                 continue\r
180             \r
181             #\r
182             # Find a new section tab\r
183             # First insert previous section items\r
184             # And then parse the content of the new section\r
185             #\r
186             if Line.startswith(TAB_SECTION_START) and Line.endswith(TAB_SECTION_END):\r
187                 #\r
188                 # Insert items data of previous section\r
189                 #\r
190                 Model = Section[CurrentSection.upper()]\r
191                 InsertSectionItemsIntoDatabase(self.TblDec, FileID, Filename, Model, CurrentSection, SectionItemList, ArchList, ThirdList, IfDefList, self.RecordSet)\r
192 \r
193                 #\r
194                 # Parse the new section\r
195                 #\r
196                 SectionItemList = []\r
197                 ArchList = []\r
198                 ThirdList = []\r
199                 \r
200                 CurrentSection = ''\r
201                 LineList = GetSplitValueList(Line[len(TAB_SECTION_START):len(Line) - len(TAB_SECTION_END)], TAB_COMMA_SPLIT)\r
202                 for Item in LineList:\r
203                     ItemList = GetSplitValueList(Item, TAB_SPLIT)\r
204                     if CurrentSection == '':\r
205                         CurrentSection = ItemList[0]\r
206                     else:\r
207                         if CurrentSection != ItemList[0]:\r
208                             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)\r
209                     if CurrentSection.upper() not in self.KeyList:\r
210                         RaiseParserError(Line, CurrentSection, Filename, '', LineNo)\r
211                     ItemList.append('')\r
212                     ItemList.append('')\r
213                     if len(ItemList) > 5:\r
214                         RaiseParserError(Line, CurrentSection, Filename, '', LineNo)\r
215                     else:\r
216                         if ItemList[1] != '' and ItemList[1].upper() not in ARCH_LIST_FULL:\r
217                             EdkLogger.error("Parser", PARSER_ERROR, "Invalid Arch definition '%s' found" % ItemList[1], File=Filename, Line=LineNo)\r
218                         ArchList.append(ItemList[1].upper())\r
219                         ThirdList.append(ItemList[2])\r
220 \r
221                 continue\r
222             \r
223             #\r
224             # Not in any defined section\r
225             #\r
226             if CurrentSection == TAB_UNKNOWN:\r
227                 ErrorMsg = "%s is not in any defined section" % Line\r
228                 EdkLogger.error("Parser", PARSER_ERROR, ErrorMsg, File=Filename, Line=LineNo)\r
229 \r
230             #\r
231             # Add a section item\r
232             #\r
233             SectionItemList.append([Line, LineNo])\r
234             # End of parse\r
235         #End of For\r
236         \r
237         #\r
238         # Insert items data of last section\r
239         #\r
240         Model = Section[CurrentSection.upper()]\r
241         InsertSectionItemsIntoDatabase(self.TblDec, FileID, Filename, Model, CurrentSection, SectionItemList, ArchList, ThirdList, IfDefList, self.RecordSet)\r
242         \r
243         #\r
244         # Replace all DEFINE macros with its actual values\r
245         #\r
246         ParseDefineMacro2(self.TblDec, self.RecordSet, GlobalData.gGlobalDefines)\r
247 \r
248     ## Transfer to Package Object\r
249     # \r
250     # Transfer all contents of a Dec file to a standard Package Object\r
251     #\r
252     def DecToPackage(self):\r
253         #\r
254         # Init global information for the file\r
255         #\r
256         ContainerFile = self.Identification.FileFullPath\r
257         \r
258         #\r
259         # Generate Package Header\r
260         #\r
261         self.GenPackageHeader(ContainerFile)\r
262         \r
263         #\r
264         # Generate Includes\r
265         #\r
266         self.GenIncludes(ContainerFile)\r
267 \r
268         #\r
269         # Generate Guids\r
270         #\r
271         self.GenGuidProtocolPpis(DataType.TAB_GUIDS, ContainerFile)\r
272 \r
273         #\r
274         # Generate Protocols\r
275         #\r
276         self.GenGuidProtocolPpis(DataType.TAB_PROTOCOLS, ContainerFile)\r
277 \r
278         #\r
279         # Generate Ppis\r
280         #\r
281         self.GenGuidProtocolPpis(DataType.TAB_PPIS, ContainerFile)\r
282         \r
283         #\r
284         # Generate LibraryClasses\r
285         #\r
286         self.GenLibraryClasses(ContainerFile)\r
287         \r
288         #\r
289         # Generate Pcds\r
290         #\r
291         self.GenPcds(ContainerFile)\r
292     \r
293     ## Get Package Header\r
294     #\r
295     # Gen Package Header of Dec as <Key> = <Value>\r
296     #\r
297     # @param ContainerFile: The Dec file full path \r
298     #\r
299     def GenPackageHeader(self, ContainerFile):\r
300         EdkLogger.debug(2, "Generate PackageHeader ...")\r
301         #\r
302         # Update all defines item in database\r
303         #\r
304         RecordSet = self.RecordSet[MODEL_META_DATA_HEADER]\r
305         for Record in RecordSet:\r
306             ValueList = GetSplitValueList(Record[0], TAB_EQUAL_SPLIT)\r
307             if len(ValueList) != 2:\r
308                 RaiseParserError(Record[0], 'Defines', ContainerFile, '<Key> = <Value>', Record[2])\r
309             ID, Value1, Value2, Arch, LineNo = Record[3], ValueList[0], ValueList[1], Record[1], Record[2]\r
310             SqlCommand = """update %s set Value1 = '%s', Value2 = '%s'\r
311                             where ID = %s""" % (self.TblDec.Table, ConvertToSqlString2(Value1), ConvertToSqlString2(Value2), ID)\r
312             self.TblDec.Exec(SqlCommand)\r
313         \r
314         #\r
315         # Get detailed information\r
316         #\r
317         for Arch in self.SupArchList:\r
318             PackageHeader = PackageHeaderClass()\r
319             \r
320             PackageHeader.Name = QueryDefinesItem(self.TblDec, TAB_DEC_DEFINES_PACKAGE_NAME, Arch)[0]\r
321             PackageHeader.Guid = QueryDefinesItem(self.TblDec, TAB_DEC_DEFINES_PACKAGE_GUID, Arch)[0]\r
322             PackageHeader.Version = QueryDefinesItem(self.TblDec, TAB_DEC_DEFINES_PACKAGE_VERSION, Arch)[0]\r
323             PackageHeader.FileName = self.Identification.FileName\r
324             PackageHeader.FullPath = self.Identification.FileFullPath\r
325             PackageHeader.DecSpecification = QueryDefinesItem(self.TblDec, TAB_DEC_DEFINES_DEC_SPECIFICATION, Arch)[0]\r
326             \r
327             self.Package.Header[Arch] = PackageHeader\r
328     \r
329     ## GenIncludes\r
330     #\r
331     # Gen Includes of Dec\r
332     # \r
333     #\r
334     # @param ContainerFile: The Dec file full path \r
335     #\r
336     def GenIncludes(self, ContainerFile):\r
337         EdkLogger.debug(2, "Generate %s ..." % TAB_INCLUDES)\r
338         Includes = {}\r
339         #\r
340         # Get all Includes\r
341         #\r
342         RecordSet = self.RecordSet[MODEL_EFI_INCLUDE]\r
343         \r
344         #\r
345         # Go through each arch\r
346         #\r
347         for Arch in self.SupArchList:\r
348             for Record in RecordSet:\r
349                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
350                     MergeArches(Includes, Record[0], Arch)\r
351 \r
352         for Key in Includes.keys():\r
353             Include = IncludeClass()\r
354             Include.FilePath = NormPath(Key)\r
355             Include.SupArchList = Includes[Key]\r
356             self.Package.Includes.append(Include)\r
357     \r
358     ## GenPpis\r
359     #\r
360     # Gen Ppis of Dec\r
361     # <CName>=<GuidValue>\r
362     #\r
363     # @param ContainerFile: The Dec file full path \r
364     #\r
365     def GenGuidProtocolPpis(self, Type, ContainerFile):\r
366         EdkLogger.debug(2, "Generate %s ..." % Type)\r
367         Lists = {}\r
368         #\r
369         # Get all Items\r
370         #\r
371         RecordSet = self.RecordSet[Section[Type.upper()]]\r
372         \r
373         #\r
374         # Go through each arch\r
375         #\r
376         for Arch in self.SupArchList:\r
377             for Record in RecordSet:\r
378                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
379                     (Name, Value) = GetGuidsProtocolsPpisOfDec(Record[0], Type, ContainerFile, Record[2])\r
380                     MergeArches(Lists, (Name, Value), Arch)\r
381                     if self.IsToDatabase:\r
382                         SqlCommand = """update %s set Value1 = '%s', Value2 = '%s'\r
383                                         where ID = %s""" % (self.TblDec.Table, ConvertToSqlString2(Name), ConvertToSqlString2(Value), Record[3])\r
384                         self.TblDec.Exec(SqlCommand)\r
385         \r
386         ListMember = None\r
387         if Type == TAB_GUIDS:\r
388             ListMember = self.Package.GuidDeclarations\r
389         elif Type == TAB_PROTOCOLS:\r
390             ListMember = self.Package.ProtocolDeclarations\r
391         elif Type == TAB_PPIS:\r
392             ListMember = self.Package.PpiDeclarations\r
393         \r
394         for Key in Lists.keys():\r
395             ListClass = GuidProtocolPpiCommonClass()\r
396             ListClass.CName = Key[0]\r
397             ListClass.Guid = Key[1]\r
398             ListClass.SupArchList = Lists[Key]\r
399             ListMember.append(ListClass)\r
400             \r
401     \r
402     ## GenLibraryClasses\r
403     #\r
404     # Gen LibraryClasses of Dec\r
405     # <CName>=<GuidValue>\r
406     #\r
407     # @param ContainerFile: The Dec file full path \r
408     #\r
409     def GenLibraryClasses(self, ContainerFile):\r
410         EdkLogger.debug(2, "Generate %s ..." % TAB_LIBRARY_CLASSES)\r
411         LibraryClasses = {}\r
412         #\r
413         # Get all Guids\r
414         #\r
415         RecordSet = self.RecordSet[MODEL_EFI_LIBRARY_CLASS]\r
416         \r
417         #\r
418         # Go through each arch\r
419         #\r
420         for Arch in self.SupArchList:\r
421             for Record in RecordSet:\r
422                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
423                     List = GetSplitValueList(Record[0], DataType.TAB_VALUE_SPLIT)\r
424                     if len(List) != 2:\r
425                         RaiseParserError(Record[0], 'LibraryClasses', ContainerFile, '<LibraryClassName>|<LibraryClassInstanceFilename>', Record[2])\r
426                     else:\r
427                         CheckFileExist(self.Identification.FileRelativePath, List[1], ContainerFile, 'LibraryClasses', Record[0])\r
428                     MergeArches(LibraryClasses, (List[0], List[1]), Arch)\r
429                     if self.IsToDatabase:\r
430                         SqlCommand = """update %s set Value1 = '%s', Value2 = '%s', Value3 = '%s'\r
431                                         where ID = %s""" % (self.TblDec.Table, ConvertToSqlString2(List[0]), ConvertToSqlString2(List[1]), SUP_MODULE_LIST_STRING, Record[3])\r
432                         self.TblDec.Exec(SqlCommand)\r
433 \r
434         \r
435         for Key in LibraryClasses.keys():\r
436             LibraryClass = LibraryClassClass()\r
437             LibraryClass.LibraryClass = Key[0]\r
438             LibraryClass.RecommendedInstance = NormPath(Key[1])\r
439             LibraryClass.SupModuleList = SUP_MODULE_LIST\r
440             LibraryClass.SupArchList = LibraryClasses[Key]\r
441             self.Package.LibraryClassDeclarations.append(LibraryClass)\r
442     \r
443     ## GenPcds\r
444     #\r
445     # Gen Pcds of Dec\r
446     # <TokenSpcCName>.<TokenCName>|<Value>|<DatumType>|<Token>\r
447     #\r
448     # @param ContainerFile: The Dec file full path \r
449     #\r
450     def GenPcds(self, ContainerFile):\r
451         EdkLogger.debug(2, "Generate %s ..." % TAB_PCDS)\r
452         Pcds = {}\r
453         #\r
454         # Get all Guids\r
455         #\r
456         RecordSet1 = self.RecordSet[MODEL_PCD_FIXED_AT_BUILD]\r
457         RecordSet2 = self.RecordSet[MODEL_PCD_PATCHABLE_IN_MODULE]\r
458         RecordSet3 = self.RecordSet[MODEL_PCD_FEATURE_FLAG]\r
459         RecordSet4 = self.RecordSet[MODEL_PCD_DYNAMIC_EX]\r
460         RecordSet5 = self.RecordSet[MODEL_PCD_DYNAMIC]\r
461         \r
462         #\r
463         # Go through each arch\r
464         #\r
465         for Arch in self.SupArchList:\r
466             for Record in RecordSet1:\r
467                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
468                     MergeArches(Pcds, GetPcdOfDec(Record[0], TAB_PCDS_FIXED_AT_BUILD, ContainerFile, Record[2]), Arch)\r
469             for Record in RecordSet2:\r
470                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
471                     MergeArches(Pcds, GetPcdOfDec(Record[0], TAB_PCDS_PATCHABLE_IN_MODULE, ContainerFile, Record[2]), Arch)\r
472             for Record in RecordSet3:\r
473                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
474                     MergeArches(Pcds, GetPcdOfDec(Record[0], TAB_PCDS_FEATURE_FLAG, ContainerFile, Record[2]), Arch)\r
475             for Record in RecordSet4:\r
476                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
477                     MergeArches(Pcds, GetPcdOfDec(Record[0], TAB_PCDS_DYNAMIC_EX, ContainerFile, Record[2]), Arch)\r
478             for Record in RecordSet5:\r
479                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
480                     MergeArches(Pcds, GetPcdOfDec(Record[0], TAB_PCDS_DYNAMIC, ContainerFile, Record[2]), Arch)                    \r
481 \r
482         for Key in Pcds.keys():\r
483             Pcd = PcdClass()\r
484             Pcd.CName = Key[1]\r
485             Pcd.Token = Key[4]\r
486             Pcd.TokenSpaceGuidCName = Key[0]\r
487             Pcd.DatumType = Key[3]\r
488             Pcd.DefaultValue = Key[2]\r
489             Pcd.ItemType = Key[5]\r
490             Pcd.SupArchList = Pcds[Key]\r
491             self.Package.PcdDeclarations.append(Pcd)\r
492     \r
493     ## Show detailed information of Package\r
494     #\r
495     # Print all members and their values of Package class\r
496     #\r
497     def ShowPackage(self):\r
498         M = self.Package\r
499         for Arch in M.Header.keys():\r
500             print '\nArch =', Arch\r
501             print 'Filename =', M.Header[Arch].FileName\r
502             print 'FullPath =', M.Header[Arch].FullPath\r
503             print 'BaseName =', M.Header[Arch].Name\r
504             print 'Guid =', M.Header[Arch].Guid\r
505             print 'Version =', M.Header[Arch].Version\r
506             print 'DecSpecification =', M.Header[Arch].DecSpecification\r
507         print '\nIncludes =', M.Includes\r
508         for Item in M.Includes:\r
509             print Item.FilePath, Item.SupArchList\r
510         print '\nGuids =', M.GuidDeclarations\r
511         for Item in M.GuidDeclarations:\r
512             print Item.CName, Item.Guid, Item.SupArchList\r
513         print '\nProtocols =', M.ProtocolDeclarations\r
514         for Item in M.ProtocolDeclarations:\r
515             print Item.CName, Item.Guid, Item.SupArchList\r
516         print '\nPpis =', M.PpiDeclarations\r
517         for Item in M.PpiDeclarations:\r
518             print Item.CName, Item.Guid, Item.SupArchList\r
519         print '\nLibraryClasses =', M.LibraryClassDeclarations\r
520         for Item in M.LibraryClassDeclarations:\r
521             print Item.LibraryClass, Item.RecommendedInstance, Item.SupModuleList, Item.SupArchList\r
522         print '\nPcds =', M.PcdDeclarations\r
523         for Item in M.PcdDeclarations:\r
524             print 'CName=', Item.CName, 'TokenSpaceGuidCName=', Item.TokenSpaceGuidCName, 'DefaultValue=', Item.DefaultValue, 'ItemType=', Item.ItemType, 'Token=', Item.Token, 'DatumType=', Item.DatumType, Item.SupArchList\r
525 \r
526 ##\r
527 #\r
528 # This acts like the main() function for the script, unless it is 'import'ed into another\r
529 # script.\r
530 #\r
531 if __name__ == '__main__':\r
532     EdkLogger.Initialize()\r
533     EdkLogger.SetLevel(EdkLogger.DEBUG_0)\r
534     \r
535     W = os.getenv('WORKSPACE')\r
536     F = os.path.join(W, 'Nt32Pkg/Nt32Pkg.dec')\r
537 \r
538     Db = Database.Database('Dec.db')\r
539     Db.InitDatabase()\r
540     \r
541     P = Dec(os.path.normpath(F), True, True, W, Db)\r
542     P.ShowPackage()\r
543     \r
544     Db.Close()\r