1. Fix tracker 200972
[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                     MergeArches(Lists, GetGuidsProtocolsPpisOfDec(Record[0], Type, ContainerFile, Record[2]), Arch)\r
380         \r
381         ListMember = None\r
382         if Type == TAB_GUIDS:\r
383             ListMember = self.Package.GuidDeclarations\r
384         elif Type == TAB_PROTOCOLS:\r
385             ListMember = self.Package.ProtocolDeclarations\r
386         elif Type == TAB_PPIS:\r
387             ListMember = self.Package.PpiDeclarations\r
388         \r
389         for Key in Lists.keys():\r
390             ListClass = GuidProtocolPpiCommonClass()\r
391             ListClass.CName = Key[0]\r
392             ListClass.Guid = Key[1]\r
393             ListClass.SupArchList = Lists[Key]\r
394             ListMember.append(ListClass)\r
395             \r
396     \r
397     ## GenLibraryClasses\r
398     #\r
399     # Gen LibraryClasses of Dec\r
400     # <CName>=<GuidValue>\r
401     #\r
402     # @param ContainerFile: The Dec file full path \r
403     #\r
404     def GenLibraryClasses(self, ContainerFile):\r
405         EdkLogger.debug(2, "Generate %s ..." % TAB_LIBRARY_CLASSES)\r
406         LibraryClasses = {}\r
407         #\r
408         # Get all Guids\r
409         #\r
410         RecordSet = self.RecordSet[MODEL_EFI_LIBRARY_CLASS]\r
411         \r
412         #\r
413         # Go through each arch\r
414         #\r
415         for Arch in self.SupArchList:\r
416             for Record in RecordSet:\r
417                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
418                     List = GetSplitValueList(Record[0], DataType.TAB_VALUE_SPLIT)\r
419                     if len(List) != 2:\r
420                         RaiseParserError(Record[0], 'LibraryClasses', ContainerFile, '<LibraryClassName>|<LibraryClassInstanceFilename>', Record[2])\r
421                     else:\r
422                         CheckFileExist(self.Identification.FileRelativePath, List[1], ContainerFile, 'LibraryClasses', Record[0])\r
423                     MergeArches(LibraryClasses, (List[0], List[1]), Arch)\r
424         \r
425         for Key in LibraryClasses.keys():\r
426             LibraryClass = LibraryClassClass()\r
427             LibraryClass.LibraryClass = Key[0]\r
428             LibraryClass.RecommendedInstance = NormPath(Key[1])\r
429             LibraryClass.SupModuleList = SUP_MODULE_LIST\r
430             LibraryClass.SupArchList = LibraryClasses[Key]\r
431             self.Package.LibraryClassDeclarations.append(LibraryClass)\r
432     \r
433     ## GenPcds\r
434     #\r
435     # Gen Pcds of Dec\r
436     # <TokenSpcCName>.<TokenCName>|<Value>|<DatumType>|<Token>\r
437     #\r
438     # @param ContainerFile: The Dec file full path \r
439     #\r
440     def GenPcds(self, ContainerFile):\r
441         EdkLogger.debug(2, "Generate %s ..." % TAB_PCDS)\r
442         Pcds = {}\r
443         #\r
444         # Get all Guids\r
445         #\r
446         RecordSet1 = self.RecordSet[MODEL_PCD_FIXED_AT_BUILD]\r
447         RecordSet2 = self.RecordSet[MODEL_PCD_PATCHABLE_IN_MODULE]\r
448         RecordSet3 = self.RecordSet[MODEL_PCD_FEATURE_FLAG]\r
449         RecordSet4 = self.RecordSet[MODEL_PCD_DYNAMIC_EX]\r
450         RecordSet5 = self.RecordSet[MODEL_PCD_DYNAMIC]\r
451         \r
452         #\r
453         # Go through each arch\r
454         #\r
455         for Arch in self.SupArchList:\r
456             for Record in RecordSet1:\r
457                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
458                     MergeArches(Pcds, GetPcdOfDec(Record[0], TAB_PCDS_FIXED_AT_BUILD, ContainerFile, Record[2]), Arch)\r
459             for Record in RecordSet2:\r
460                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
461                     MergeArches(Pcds, GetPcdOfDec(Record[0], TAB_PCDS_PATCHABLE_IN_MODULE, ContainerFile, Record[2]), Arch)\r
462             for Record in RecordSet3:\r
463                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
464                     MergeArches(Pcds, GetPcdOfDec(Record[0], TAB_PCDS_FEATURE_FLAG, ContainerFile, Record[2]), Arch)\r
465             for Record in RecordSet4:\r
466                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
467                     MergeArches(Pcds, GetPcdOfDec(Record[0], TAB_PCDS_DYNAMIC_EX, ContainerFile, Record[2]), Arch)\r
468             for Record in RecordSet5:\r
469                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
470                     MergeArches(Pcds, GetPcdOfDec(Record[0], TAB_PCDS_DYNAMIC, ContainerFile, Record[2]), Arch)                    \r
471 \r
472         for Key in Pcds.keys():\r
473             Pcd = PcdClass()\r
474             Pcd.CName = Key[1]\r
475             Pcd.Token = Key[4]\r
476             Pcd.TokenSpaceGuidCName = Key[0]\r
477             Pcd.DatumType = Key[3]\r
478             Pcd.DefaultValue = Key[2]\r
479             Pcd.ItemType = Key[5]\r
480             Pcd.SupArchList = Pcds[Key]\r
481             self.Package.PcdDeclarations.append(Pcd)\r
482     \r
483     ## Show detailed information of Package\r
484     #\r
485     # Print all members and their values of Package class\r
486     #\r
487     def ShowPackage(self):\r
488         M = self.Package\r
489         for Arch in M.Header.keys():\r
490             print '\nArch =', Arch\r
491             print 'Filename =', M.Header[Arch].FileName\r
492             print 'FullPath =', M.Header[Arch].FullPath\r
493             print 'BaseName =', M.Header[Arch].Name\r
494             print 'Guid =', M.Header[Arch].Guid\r
495             print 'Version =', M.Header[Arch].Version\r
496             print 'DecSpecification =', M.Header[Arch].DecSpecification\r
497         print '\nIncludes =', M.Includes\r
498         for Item in M.Includes:\r
499             print Item.FilePath, Item.SupArchList\r
500         print '\nGuids =', M.GuidDeclarations\r
501         for Item in M.GuidDeclarations:\r
502             print Item.CName, Item.Guid, Item.SupArchList\r
503         print '\nProtocols =', M.ProtocolDeclarations\r
504         for Item in M.ProtocolDeclarations:\r
505             print Item.CName, Item.Guid, Item.SupArchList\r
506         print '\nPpis =', M.PpiDeclarations\r
507         for Item in M.PpiDeclarations:\r
508             print Item.CName, Item.Guid, Item.SupArchList\r
509         print '\nLibraryClasses =', M.LibraryClassDeclarations\r
510         for Item in M.LibraryClassDeclarations:\r
511             print Item.LibraryClass, Item.RecommendedInstance, Item.SupModuleList, Item.SupArchList\r
512         print '\nPcds =', M.PcdDeclarations\r
513         for Item in M.PcdDeclarations:\r
514             print 'CName=', Item.CName, 'TokenSpaceGuidCName=', Item.TokenSpaceGuidCName, 'DefaultValue=', Item.DefaultValue, 'ItemType=', Item.ItemType, 'Token=', Item.Token, 'DatumType=', Item.DatumType, Item.SupArchList\r
515 \r
516 ##\r
517 #\r
518 # This acts like the main() function for the script, unless it is 'import'ed into another\r
519 # script.\r
520 #\r
521 if __name__ == '__main__':\r
522     EdkLogger.Initialize()\r
523     EdkLogger.SetLevel(EdkLogger.DEBUG_0)\r
524     \r
525     W = os.getenv('WORKSPACE')\r
526     F = os.path.join(W, 'Nt32Pkg/Nt32Pkg.dec')\r
527 \r
528     Db = Database.Database(DATABASE_PATH)\r
529     Db.InitDatabase()\r
530     \r
531     P = Dec(os.path.normpath(F), False, True, W, Db)\r
532     P.ShowPackage()\r
533     \r
534     Db.Close()\r