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