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