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