]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/Common/InfClassObjectLight.py
Check In tool source code based on Build tool project revision r1655.
[mirror_edk2.git] / BaseTools / Source / Python / Common / InfClassObjectLight.py
CommitLineData
30fdf114
LG
1## @file\r
2# This file is used to define each component of INF 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
17import os\r
18import re\r
19import EdkLogger\r
20\r
21from CommonDataClass.ModuleClass import *\r
22from CommonDataClass import CommonClass\r
23from String import *\r
24from DataType import *\r
25from BuildToolError import *\r
26from Misc import sdict\r
27from Misc import GetFiles\r
28from Parsing import *\r
29\r
30# Global variable\r
31Section = {TAB_UNKNOWN.upper() : MODEL_UNKNOWN,\r
32 TAB_INF_DEFINES.upper() : MODEL_META_DATA_HEADER,\r
33 TAB_BUILD_OPTIONS.upper() : MODEL_META_DATA_BUILD_OPTION,\r
34 TAB_INCLUDES.upper() : MODEL_EFI_INCLUDE,\r
35 TAB_LIBRARIES.upper() : MODEL_EFI_LIBRARY_INSTANCE,\r
36 TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_CLASS,\r
37 TAB_PACKAGES.upper() : MODEL_META_DATA_PACKAGE,\r
38 TAB_NMAKE.upper() : MODEL_META_DATA_NMAKE,\r
39 TAB_INF_FIXED_PCD.upper() : MODEL_PCD_FIXED_AT_BUILD,\r
40 TAB_INF_PATCH_PCD.upper() : MODEL_PCD_PATCHABLE_IN_MODULE,\r
41 TAB_INF_FEATURE_PCD.upper() : MODEL_PCD_FEATURE_FLAG,\r
42 TAB_INF_PCD_EX.upper() : MODEL_PCD_DYNAMIC_EX,\r
43 TAB_INF_PCD.upper() : MODEL_PCD_DYNAMIC,\r
44 TAB_SOURCES.upper() : MODEL_EFI_SOURCE_FILE,\r
45 TAB_GUIDS.upper() : MODEL_EFI_GUID,\r
46 TAB_PROTOCOLS.upper() : MODEL_EFI_PROTOCOL,\r
47 TAB_PPIS.upper() : MODEL_EFI_PPI,\r
48 TAB_DEPEX.upper() : MODEL_EFI_DEPEX,\r
49 TAB_BINARIES.upper() : MODEL_EFI_BINARY_FILE,\r
50 TAB_USER_EXTENSIONS.upper() : MODEL_META_DATA_USER_EXTENSION\r
51 }\r
52\r
53gComponentType2ModuleType = {\r
54 "LIBRARY" : "BASE",\r
55 "SECURITY_CORE" : "SEC",\r
56 "PEI_CORE" : "PEI_CORE",\r
57 "COMBINED_PEIM_DRIVER" : "PEIM",\r
58 "PIC_PEIM" : "PEIM",\r
59 "RELOCATABLE_PEIM" : "PEIM",\r
60 "PE32_PEIM" : "PEIM",\r
61 "BS_DRIVER" : "DXE_DRIVER",\r
62 "RT_DRIVER" : "DXE_RUNTIME_DRIVER",\r
63 "SAL_RT_DRIVER" : "DXE_SAL_DRIVER",\r
64 "APPLICATION" : "UEFI_APPLICATION",\r
65 "LOGO" : "BASE",\r
66}\r
67\r
68class InfHeader(ModuleHeaderClass):\r
69 _Mapping_ = {\r
70 # Required Fields\r
71 TAB_INF_DEFINES_BASE_NAME : "Name",\r
72 TAB_INF_DEFINES_FILE_GUID : "Guid",\r
73 TAB_INF_DEFINES_MODULE_TYPE : "ModuleType",\r
74 TAB_INF_DEFINES_EFI_SPECIFICATION_VERSION : "EfiSpecificationVersion",\r
75 TAB_INF_DEFINES_EDK_RELEASE_VERSION : "EdkReleaseVersion", \r
76\r
77 # Optional Fields\r
78 TAB_INF_DEFINES_INF_VERSION : "InfVersion",\r
79 TAB_INF_DEFINES_BINARY_MODULE : "BinaryModule",\r
80 TAB_INF_DEFINES_COMPONENT_TYPE : "ComponentType",\r
81 TAB_INF_DEFINES_MAKEFILE_NAME : "MakefileName",\r
82 TAB_INF_DEFINES_BUILD_NUMBER : "BuildNumber",\r
83 TAB_INF_DEFINES_BUILD_TYPE : "BuildType",\r
84 TAB_INF_DEFINES_FFS_EXT : "FfsExt",\r
85 TAB_INF_DEFINES_FV_EXT : "FvExt",\r
86 TAB_INF_DEFINES_SOURCE_FV : "SourceFv",\r
87 TAB_INF_DEFINES_VERSION_NUMBER : "VersionNumber",\r
88 TAB_INF_DEFINES_VERSION_STRING : "VersionString",\r
89 TAB_INF_DEFINES_VERSION : "Version",\r
90 TAB_INF_DEFINES_PCD_IS_DRIVER : "PcdIsDriver",\r
91 TAB_INF_DEFINES_TIANO_R8_FLASHMAP_H : "TianoR8FlashMap_h",\r
92 TAB_INF_DEFINES_SHADOW : "Shadow",\r
93 }\r
94\r
95 def __init__(self):\r
96 ModuleHeaderClass.__init__(self)\r
97 self.VersionNumber = ''\r
98 self.VersionString = ''\r
99 #print self.__dict__\r
100 def __setitem__(self, key, value):\r
101 self.__dict__[self._Mapping_[key]] = value\r
102 def __getitem__(self, key):\r
103 return self.__dict__[self._Mapping_[key]]\r
104 ## "in" test support\r
105 def __contains__(self, key):\r
106 return key in self._Mapping_\r
107\r
108## InfObject\r
109#\r
110# This class defined basic Inf object which is used by inheriting\r
111# \r
112# @param object: Inherited from object class\r
113#\r
114class InfObject(object):\r
115 def __init__(self):\r
116 object.__init__()\r
117\r
118## Inf\r
119#\r
120# This class defined the structure used in Inf object\r
121# \r
122# @param InfObject: Inherited from InfObject class\r
123# @param Ffilename: Input value for Ffilename of Inf file, default is None\r
124# @param IsMergeAllArches: Input value for IsMergeAllArches\r
125# True is to merge all arches\r
126# Fales is not to merge all arches\r
127# default is False\r
128# @param IsToModule: Input value for IsToModule\r
129# True is to transfer to ModuleObject automatically\r
130# False is not to transfer to ModuleObject automatically\r
131# default is False\r
132# @param WorkspaceDir: Input value for current workspace directory, default is None\r
133#\r
134# @var Identification: To store value for Identification, it is a structure as Identification\r
135# @var UserExtensions: To store value for UserExtensions\r
136# @var Module: To store value for Module, it is a structure as ModuleClass\r
137# @var WorkspaceDir: To store value for WorkspaceDir\r
138# @var KeyList: To store value for KeyList, a list for all Keys used in Inf\r
139#\r
140class Inf(InfObject):\r
141 def __init__(self, Filename = None, IsToModule = False, WorkspaceDir = None, PackageDir = None, SupArchList = DataType.ARCH_LIST):\r
142 self.Identification = IdentificationClass()\r
143 self.Module = ModuleClass()\r
144 self.WorkspaceDir = WorkspaceDir\r
145 self.PackageDir = PackageDir\r
146 self.SupArchList = SupArchList\r
147 \r
148 self.KeyList = [\r
149 TAB_SOURCES, TAB_BUILD_OPTIONS, TAB_BINARIES, TAB_INCLUDES, TAB_GUIDS, \r
150 TAB_PROTOCOLS, TAB_PPIS, TAB_LIBRARY_CLASSES, TAB_PACKAGES, TAB_INF_FIXED_PCD, \r
151 TAB_INF_PATCH_PCD, TAB_INF_FEATURE_PCD, TAB_INF_PCD, TAB_INF_PCD_EX, \r
152 TAB_DEPEX, TAB_INF_DEFINES\r
153 ]\r
154 # Upper all KEYs to ignore case sensitive when parsing\r
155 self.KeyList = map(lambda c: c.upper(), self.KeyList)\r
156 \r
157 # Init RecordSet\r
158 self.RecordSet = {} \r
159 for Key in self.KeyList:\r
160 self.RecordSet[Section[Key]] = []\r
161 \r
162 # Init Comment\r
163 self.SectionHeaderCommentDict = {}\r
164 \r
165 # Load Inf file if filename is not None\r
166 if Filename != None:\r
167 self.LoadInfFile(Filename)\r
168 \r
169 # Transfer to Module Object if IsToModule is True\r
170 if IsToModule:\r
171 self.InfToModule()\r
172\r
173 ## Module Object to INF file\r
174 def ModuleToInf(self, Module):\r
175 Inf = ''\r
176 InfList = sdict()\r
177 SectionHeaderCommentDict = {}\r
178 if Module == None:\r
179 return Inf\r
180\r
181 ModuleHeader = Module.ModuleHeader\r
182 TmpList = []\r
183 # Common define items\r
184 if ModuleHeader.Name:\r
185 TmpList.append(TAB_INF_DEFINES_BASE_NAME + ' = ' + ModuleHeader.Name)\r
186 if ModuleHeader.Guid:\r
187 TmpList.append(TAB_INF_DEFINES_FILE_GUID + ' = ' + ModuleHeader.Guid)\r
188 if ModuleHeader.Version:\r
189 TmpList.append(TAB_INF_DEFINES_VERSION_STRING + ' = ' + ModuleHeader.Version)\r
190 if ModuleHeader.ModuleType:\r
191 TmpList.append(TAB_INF_DEFINES_MODULE_TYPE + ' = ' + ModuleHeader.ModuleType)\r
192 if ModuleHeader.PcdIsDriver:\r
193 TmpList.append(TAB_INF_DEFINES_PCD_IS_DRIVER + ' = ' + ModuleHeader.PcdIsDriver)\r
194 # Externs\r
195 for Item in Module.Externs:\r
196 if Item.EntryPoint:\r
197 TmpList.append(TAB_INF_DEFINES_ENTRY_POINT + ' = ' + Item.EntryPoint)\r
198 if Item.UnloadImage:\r
199 TmpList.append(TAB_INF_DEFINES_UNLOAD_IMAGE + ' = ' + Item.UnloadImage)\r
200 if Item.Constructor:\r
201 TmpList.append(TAB_INF_DEFINES_CONSTRUCTOR + ' = ' + Item.Constructor)\r
202 if Item.Destructor:\r
203 TmpList.append(TAB_INF_DEFINES_DESTRUCTOR + ' = ' + Item.Destructor)\r
204 # Other define items\r
205 if Module.UserExtensions != None:\r
206 for Item in Module.UserExtensions.Defines:\r
207 TmpList.append(Item)\r
208 InfList['Defines'] = TmpList\r
209 if ModuleHeader.Description != '':\r
210 SectionHeaderCommentDict['Defines'] = ModuleHeader.Description\r
211 \r
212 if Module.UserExtensions != None:\r
213 InfList['BuildOptions'] = Module.UserExtensions.BuildOptions\r
214 \r
215 for Item in Module.Includes:\r
216 Key = 'Includes.' + GetStringOfList(Item.SupArchList)\r
217 Value = GetHelpTextList(Item.HelpTextList)\r
218 Value.append(Item.FilePath)\r
219 GenMetaDatSectionItem(Key, Value, InfList)\r
220 \r
221 for Item in Module.LibraryClasses:\r
222 Key = 'LibraryClasses.' + GetStringOfList(Item.SupArchList)\r
223 Value = GetHelpTextList(Item.HelpTextList)\r
224 NewValue = Item.LibraryClass\r
225 if Item.RecommendedInstance:\r
226 NewValue = NewValue + '|' + Item.RecommendedInstance\r
227 if Item.FeatureFlag:\r
228 NewValue = NewValue + '|' + Item.FeatureFlag\r
229 Value.append(NewValue) \r
230 GenMetaDatSectionItem(Key, Value, InfList)\r
231 \r
232 for Item in Module.PackageDependencies:\r
233 Key = 'Packages.' + GetStringOfList(Item.SupArchList)\r
234 Value = GetHelpTextList(Item.HelpTextList)\r
235 Value.append(Item.FilePath)\r
236 GenMetaDatSectionItem(Key, Value, InfList)\r
237 \r
238 for Item in Module.PcdCodes:\r
239 Key = 'Pcds' + Item.ItemType + '.' + GetStringOfList(Item.SupArchList)\r
240 Value = GetHelpTextList(Item.HelpTextList)\r
241 NewValue = Item.TokenSpaceGuidCName + '.' + Item.CName\r
242 if Item.DefaultValue != '':\r
243 NewValue = NewValue + '|' + Item.DefaultValue\r
244 Value.append(NewValue)\r
245 GenMetaDatSectionItem(Key, Value, InfList)\r
246 \r
247 for Item in Module.Sources:\r
248 Key = 'Sources.' + GetStringOfList(Item.SupArchList)\r
249 Value = GetHelpTextList(Item.HelpTextList)\r
250 NewValue = Item.SourceFile\r
251 if Item.ToolChainFamily != '':\r
252 NewValue = NewValue + '|' + Item.ToolChainFamily\r
253 if Item.TagName != '':\r
254 NewValue = NewValue + '|' + Item.TagName\r
255 if Item.ToolCode != '':\r
256 NewValue = NewValue + '|' + Item.ToolCode\r
257 if Item.FeatureFlag != '':\r
258 NewValue = NewValue + '|' + Item.FeatureFlag\r
259 Value.append(NewValue)\r
260 if Item.HelpText != '':\r
261 SectionHeaderCommentDict[Key] = Item.HelpText\r
262 GenMetaDatSectionItem(Key, Value, InfList)\r
263 \r
264 for Item in Module.Guids:\r
265 Key = 'Guids.' + GetStringOfList(Item.SupArchList)\r
266 Value = GetHelpTextList(Item.HelpTextList)\r
267 Value.append(Item.CName)\r
268 GenMetaDatSectionItem(Key, Value, InfList)\r
269 \r
270 for Item in Module.Protocols:\r
271 Key = 'Protocols.' + GetStringOfList(Item.SupArchList)\r
272 Value = GetHelpTextList(Item.HelpTextList)\r
273 Value.append(Item.CName)\r
274 GenMetaDatSectionItem(Key, Value, InfList)\r
275 \r
276 for Item in Module.Ppis:\r
277 Key = 'Ppis.' + GetStringOfList(Item.SupArchList)\r
278 Value = GetHelpTextList(Item.HelpTextList)\r
279 Value.append(Item.CName)\r
280 GenMetaDatSectionItem(Key, Value, InfList)\r
281 \r
282 if Module.PeiDepex:\r
283 Key = 'Depex'\r
284 Value = Module.PeiDepex.Depex\r
285 GenMetaDatSectionItem(Key, Value, InfList)\r
286 \r
287 if Module.DxeDepex:\r
288 Key = 'Depex'\r
289 Value = Module.DxeDepex.Depex\r
290 GenMetaDatSectionItem(Key, Value, InfList)\r
291 \r
292 if Module.SmmDepex:\r
293 Key = 'Depex'\r
294 Value = Module.SmmDepex.Depex\r
295 GenMetaDatSectionItem(Key, Value, InfList)\r
296 \r
297 for Item in Module.Binaries:\r
298 Key = 'Binaries.' + GetStringOfList(Item.SupArchList)\r
299 Value = GetHelpTextList(Item.HelpTextList)\r
300 NewValue = Item.FileType + '|' + Item.BinaryFile + '|' + Item.Target\r
301 if Item.FeatureFlag != '':\r
302 NewValue = NewValue + '|' + Item.FeatureFlag\r
303 Value.append(NewValue)\r
304 GenMetaDatSectionItem(Key, Value, InfList)\r
305\r
306 # Transfer Module to Inf\r
307 for Key in InfList:\r
308 if Key in SectionHeaderCommentDict:\r
309 List = SectionHeaderCommentDict[Key].split('\r')\r
310 for Item in List:\r
311 Inf = Inf + Item + '\n'\r
312 Inf = Inf + '[' + Key + ']' + '\n'\r
313 for Value in InfList[Key]:\r
314 if type(Value) == type([]):\r
315 for SubValue in Value:\r
316 Inf = Inf + ' ' + SubValue + '\n'\r
317 else:\r
318 Inf = Inf + ' ' + Value + '\n'\r
319 Inf = Inf + '\n'\r
320 \r
321 return Inf\r
322 \r
323 \r
324 ## Transfer to Module Object\r
325 # \r
326 # Transfer all contents of an Inf file to a standard Module Object\r
327 #\r
328 def InfToModule(self):\r
329 # Init global information for the file\r
330 ContainerFile = self.Identification.FullPath\r
331 \r
332 # Generate Module Header\r
333 self.GenModuleHeader(ContainerFile)\r
334 \r
335 # Generate BuildOptions\r
336 self.GenBuildOptions(ContainerFile)\r
337 \r
338 # Generate Includes\r
339 self.GenIncludes(ContainerFile)\r
340 \r
341 # Generate LibraryClasses\r
342 self.GenLibraryClasses(ContainerFile)\r
343 \r
344 # Generate Packages\r
345 self.GenPackages(ContainerFile)\r
346 \r
347 # Generate Pcds\r
348 self.GenPcds(ContainerFile)\r
349 \r
350 # Generate Sources\r
351 self.GenSources(ContainerFile)\r
352 \r
353 # Generate Guids\r
354 self.GenGuidProtocolPpis(DataType.TAB_GUIDS, ContainerFile)\r
355\r
356 # Generate Protocols\r
357 self.GenGuidProtocolPpis(DataType.TAB_PROTOCOLS, ContainerFile)\r
358\r
359 # Generate Ppis\r
360 self.GenGuidProtocolPpis(DataType.TAB_PPIS, ContainerFile)\r
361 \r
362 # Generate Depexes\r
363 self.GenDepexes(ContainerFile)\r
364 \r
365 # Generate Binaries\r
366 self.GenBinaries(ContainerFile)\r
367 \r
368 # Init MiscFiles\r
369 self.GenMiscFiles(ContainerFile)\r
370\r
371 ## GenMiscFiles\r
372 #\r
373 def GenMiscFiles(self, ContainerFile):\r
374 MiscFiles = MiscFileClass()\r
375 MiscFiles.Name = 'ModuleFiles'\r
376 for Item in GetFiles(os.path.dirname(ContainerFile), ['CVS', '.svn'], False):\r
377 File = CommonClass.FileClass()\r
378 File.Filename = Item\r
379 MiscFiles.Files.append(File)\r
380 self.Module.MiscFiles = MiscFiles\r
381\r
382 ## Load Inf file\r
383 #\r
384 # Load the file if it exists\r
385 #\r
386 # @param Filename: Input value for filename of Inf file\r
387 #\r
388 def LoadInfFile(self, Filename): \r
389 # Insert a record for file\r
390 Filename = NormPath(Filename)\r
391 \r
392 self.Identification.FullPath = Filename\r
393 (self.Identification.RelaPath, self.Identification.FileName) = os.path.split(Filename)\r
394 if self.Identification.FullPath.find(self.WorkspaceDir) > -1:\r
395 self.Identification.ModulePath = os.path.dirname(self.Identification.FullPath[len(self.WorkspaceDir) + 1:]) \r
396 if self.PackageDir:\r
397 self.Identification.PackagePath = self.PackageDir\r
398 if self.Identification.ModulePath.find(self.PackageDir) == 0:\r
399 self.Identification.ModulePath = self.Identification.ModulePath[len(self.PackageDir) + 1:]\r
400 \r
401 # Init common datas\r
402 IfDefList, SectionItemList, CurrentSection, ArchList, ThirdList, IncludeFiles = \\r
403 [], [], TAB_UNKNOWN, [], [], []\r
404 LineNo = 0\r
405 \r
406 # Parse file content\r
407 IsFindBlockComment = False\r
408 ReservedLine = ''\r
409 Comment = ''\r
410 for Line in open(Filename, 'r'):\r
411 LineNo = LineNo + 1\r
412 # Remove comment block\r
413 if Line.find(TAB_COMMENT_R8_START) > -1:\r
414 ReservedLine = GetSplitValueList(Line, TAB_COMMENT_R8_START, 1)[0]\r
415 if ReservedLine.strip().startswith(TAB_COMMENT_SPLIT):\r
416 Comment = Comment + Line.strip() + '\n'\r
417 ReservedLine = ''\r
418 else:\r
419 Comment = Comment + Line[len(ReservedLine):] + '\n'\r
420 IsFindBlockComment = True\r
421 if not ReservedLine:\r
422 continue\r
423 if Line.find(TAB_COMMENT_R8_END) > -1:\r
424 Comment = Comment + Line[:Line.find(TAB_COMMENT_R8_END) + len(TAB_COMMENT_R8_END)] + '\n'\r
425 Line = ReservedLine + GetSplitValueList(Line, TAB_COMMENT_R8_END, 1)[1]\r
426 ReservedLine = ''\r
427 IsFindBlockComment = False\r
428 if IsFindBlockComment:\r
429 Comment = Comment + Line.strip() + '\n'\r
430 continue\r
431 \r
432 # Remove comments at tail and remove spaces again\r
433 if Line.strip().startswith(TAB_COMMENT_SPLIT) or Line.strip().startswith('--/'):\r
434 Comment = Comment + Line.strip() + '\n'\r
435 Line = CleanString(Line)\r
436 if Line == '':\r
437 continue\r
438 \r
439 ## Find a new section tab\r
440 # First insert previous section items\r
441 # And then parse the content of the new section\r
442 if Line.startswith(TAB_SECTION_START) and Line.endswith(TAB_SECTION_END):\r
443 if Line[1:3] == "--":\r
444 continue\r
445 Model = Section[CurrentSection.upper()]\r
446 # Insert items data of previous section\r
447 InsertSectionItems(Model, CurrentSection, SectionItemList, ArchList, ThirdList, self.RecordSet)\r
448 \r
449 # Parse the new section\r
450 SectionItemList = []\r
451 ArchList = []\r
452 ThirdList = []\r
453 \r
454 CurrentSection = ''\r
455 LineList = GetSplitValueList(Line[len(TAB_SECTION_START):len(Line) - len(TAB_SECTION_END)], TAB_COMMA_SPLIT)\r
456 for Item in LineList:\r
457 ItemList = GetSplitValueList(Item, TAB_SPLIT)\r
458 if CurrentSection == '':\r
459 CurrentSection = ItemList[0]\r
460 else:\r
461 if CurrentSection != ItemList[0]:\r
462 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
463 if CurrentSection.upper() not in self.KeyList:\r
464 RaiseParserError(Line, CurrentSection, Filename, '', LineNo)\r
465 ItemList.append('')\r
466 ItemList.append('')\r
467 if len(ItemList) > 5:\r
468 RaiseParserError(Line, CurrentSection, Filename, '', LineNo)\r
469 else:\r
470 if ItemList[1] != '' and ItemList[1].upper() not in ARCH_LIST_FULL:\r
471 EdkLogger.error("Parser", PARSER_ERROR, "Invalid Arch definition '%s' found" % ItemList[1], File=Filename, Line=LineNo, RaiseError = EdkLogger.IsRaiseError)\r
472 ArchList.append(ItemList[1].upper())\r
473 ThirdList.append(ItemList[2])\r
474\r
475 if Comment:\r
476 if Comment.endswith('\n'):\r
477 Comment = Comment[:len(Comment) - len('\n')]\r
478 self.SectionHeaderCommentDict[Section[CurrentSection.upper()]] = Comment\r
479 Comment = ''\r
480 continue\r
481 \r
482 # Not in any defined section\r
483 if CurrentSection == TAB_UNKNOWN:\r
484 ErrorMsg = "%s is not in any defined section" % Line\r
485 EdkLogger.error("Parser", PARSER_ERROR, ErrorMsg, File=Filename, Line=LineNo, RaiseError = EdkLogger.IsRaiseError)\r
486\r
487 # Add a section item\r
488 SectionItemList.append([Line, LineNo, Comment])\r
489 Comment = ''\r
490 # End of parse\r
491 #End of For\r
492 \r
493 # Insert items data of last section\r
494 Model = Section[CurrentSection.upper()]\r
495 InsertSectionItems(Model, CurrentSection, SectionItemList, ArchList, ThirdList, self.RecordSet)\r
496 if Comment != '':\r
497 self.SectionHeaderCommentDict[Model] = Comment\r
498 Comment = ''\r
499\r
500 ## Show detailed information of Module\r
501 #\r
502 # Print all members and their values of Module class\r
503 #\r
504 def ShowModule(self):\r
505 M = self.Module\r
506 print 'Filename =', M.ModuleHeader.FileName\r
507 print 'FullPath =', M.ModuleHeader.FullPath\r
508 print 'RelaPath =', M.ModuleHeader.RelaPath\r
509 print 'PackagePath =', M.ModuleHeader.PackagePath\r
510 print 'ModulePath =', M.ModuleHeader.ModulePath\r
511 print 'CombinePath =', M.ModuleHeader.CombinePath\r
512 \r
513 print 'BaseName =', M.ModuleHeader.Name\r
514 print 'Guid =', M.ModuleHeader.Guid\r
515 print 'Version =', M.ModuleHeader.Version\r
516\r
517 print '\nIncludes ='\r
518 for Item in M.Includes:\r
519 print Item.FilePath, Item.SupArchList\r
520 print '\nLibraryClasses ='\r
521 for Item in M.LibraryClasses:\r
522 print Item.LibraryClass, Item.RecommendedInstance, Item.RecommendedInstanceGuid, Item.RecommendedInstanceVersion, Item.FeatureFlag, Item.SupModuleList, Item.SupArchList, Item.Define\r
523 print '\nPackageDependencies ='\r
524 for Item in M.PackageDependencies:\r
525 print Item.FilePath, Item.SupArchList, Item.FeatureFlag\r
526 print '\nPcds ='\r
527 for Item in M.PcdCodes:\r
528 print '\tCName=',Item.CName, 'TokenSpaceGuidCName=', Item.TokenSpaceGuidCName, 'DefaultValue=', Item.DefaultValue, 'ItemType=', Item.ItemType, Item.SupArchList\r
529 print '\nSources ='\r
530 for Source in M.Sources:\r
531 print Source.SourceFile, 'Fam=', Source.ToolChainFamily, 'Pcd=', Source.FeatureFlag, 'Tag=', Source.TagName, 'ToolCode=', Source.ToolCode, Source.SupArchList\r
532 print '\nGuids ='\r
533 for Item in M.Guids:\r
534 print Item.CName, Item.SupArchList, Item.FeatureFlag\r
535 print '\nProtocols ='\r
536 for Item in M.Protocols:\r
537 print Item.CName, Item.SupArchList, Item.FeatureFlag\r
538 print '\nPpis ='\r
539 for Item in M.Ppis:\r
540 print Item.CName, Item.SupArchList, Item.FeatureFlag\r
541 print '\nDepex ='\r
542 for Item in M.Depex:\r
543 print Item.Depex, Item.SupArchList, Item.Define\r
544 print '\nBinaries ='\r
545 for Binary in M.Binaries:\r
546 print 'Type=', Binary.FileType, 'Target=', Binary.Target, 'Name=', Binary.BinaryFile, 'FeatureFlag=', Binary.FeatureFlag, 'SupArchList=', Binary.SupArchList\r
547 print '\n*** FileList ***'\r
548 for Item in M.MiscFiles.Files:\r
549 print Item.Filename\r
550 print '****************\n'\r
551\r
552 ## Convert [Defines] section content to ModuleHeaderClass\r
553 #\r
554 # Convert [Defines] section content to ModuleHeaderClass\r
555 #\r
556 # @param Defines The content under [Defines] section\r
557 # @param ModuleHeader An object of ModuleHeaderClass\r
558 # @param Arch The supported ARCH\r
559 #\r
560 def GenModuleHeader(self, ContainerFile):\r
561 EdkLogger.debug(2, "Generate ModuleHeader ...")\r
562 # Update all defines item in database\r
563 RecordSet = self.RecordSet[MODEL_META_DATA_HEADER]\r
564 \r
565 ModuleHeader = ModuleHeaderClass()\r
566 ModuleExtern = ModuleExternClass()\r
567 OtherDefines = []\r
568 for Record in RecordSet:\r
569 ValueList = GetSplitValueList(Record[0], TAB_EQUAL_SPLIT)\r
570 if len(ValueList) != 2:\r
571 OtherDefines.append(Record[0])\r
572 else:\r
573 Name = ValueList[0]\r
574 Value = ValueList[1]\r
575 if Name == TAB_INF_DEFINES_BASE_NAME:\r
576 ModuleHeader.Name = Value\r
577 ModuleHeader.BaseName = Value\r
578 elif Name == TAB_INF_DEFINES_FILE_GUID:\r
579 ModuleHeader.Guid = Value\r
580 elif Name == TAB_INF_DEFINES_VERSION_STRING:\r
581 ModuleHeader.Version = Value\r
582 elif Name == TAB_INF_DEFINES_PCD_IS_DRIVER:\r
583 ModuleHeader.PcdIsDriver = Value\r
584 elif Name == TAB_INF_DEFINES_MODULE_TYPE:\r
585 ModuleHeader.ModuleType = Value\r
586 elif Name == TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION:\r
587 ModuleHeader.UefiSpecificationVersion = Value\r
588 elif Name == TAB_INF_DEFINES_PI_SPECIFICATION_VERSION:\r
589 ModuleHeader.PiSpecificationVersion = Value\r
590 elif Name == TAB_INF_DEFINES_ENTRY_POINT:\r
591 ModuleExtern.EntryPoint = Value\r
592 elif Name == TAB_INF_DEFINES_UNLOAD_IMAGE:\r
593 ModuleExtern.UnloadImage = Value\r
594 elif Name == TAB_INF_DEFINES_CONSTRUCTOR:\r
595 ModuleExtern.Constructor = Value\r
596 elif Name == TAB_INF_DEFINES_DESTRUCTOR:\r
597 ModuleExtern.Destructor = Value\r
598 else:\r
599 OtherDefines.append(Record[0])\r
600 ModuleHeader.FileName = self.Identification.FileName\r
601 ModuleHeader.FullPath = self.Identification.FullPath\r
602 ModuleHeader.RelaPath = self.Identification.RelaPath\r
603 ModuleHeader.PackagePath = self.Identification.PackagePath\r
604 ModuleHeader.ModulePath = self.Identification.ModulePath\r
605 ModuleHeader.CombinePath = os.path.normpath(os.path.join(ModuleHeader.PackagePath, ModuleHeader.ModulePath, ModuleHeader.FileName))\r
606\r
607 if MODEL_META_DATA_HEADER in self.SectionHeaderCommentDict:\r
608 ModuleHeader.Description = self.SectionHeaderCommentDict[MODEL_META_DATA_HEADER]\r
609 self.Module.ModuleHeader = ModuleHeader\r
610 self.Module.Externs.append(ModuleExtern)\r
611 UE = self.Module.UserExtensions\r
612 if UE == None:\r
613 UE = UserExtensionsClass()\r
614 UE.Defines = OtherDefines\r
615 self.Module.UserExtensions = UE\r
616 \r
617 ## GenBuildOptions\r
618 #\r
619 # Gen BuildOptions of Inf\r
620 # [<Family>:]<ToolFlag>=Flag\r
621 #\r
622 # @param ContainerFile: The Inf file full path \r
623 #\r
624 def GenBuildOptions(self, ContainerFile):\r
625 EdkLogger.debug(2, "Generate %s ..." % TAB_BUILD_OPTIONS)\r
626 BuildOptions = {}\r
627 # Get all BuildOptions\r
628 RecordSet = self.RecordSet[MODEL_META_DATA_BUILD_OPTION]\r
629 UE = self.Module.UserExtensions\r
630 if UE == None:\r
631 UE = UserExtensionsClass()\r
632 for Record in RecordSet:\r
633 UE.BuildOptions.append(Record[0])\r
634 self.Module.UserExtensions = UE\r
635 \r
636 ## GenIncludes\r
637 #\r
638 # Gen Includes of Inf\r
639 # \r
640 # @param ContainerFile: The Inf file full path \r
641 #\r
642 def GenIncludes(self, ContainerFile):\r
643 EdkLogger.debug(2, "Generate %s ..." % TAB_INCLUDES)\r
644 Includes = sdict()\r
645 # Get all Includes\r
646 RecordSet = self.RecordSet[MODEL_EFI_INCLUDE]\r
647 for Record in RecordSet:\r
648 Include = IncludeClass()\r
649 Include.FilePath = Record[0]\r
650 Include.SupArchList = Record[1]\r
651 if GenerateHelpText(Record[5], ''):\r
652 Include.HelpTextList.append(GenerateHelpText(Record[5], ''))\r
653 self.Module.Includes.append(Include)\r
654 #self.Module.FileList.extend(GetFiles(os.path.normpath(os.path.join(self.Identification.FileRelativePath, Include.FilePath)), ['CVS', '.svn']))\r
655 \r
656 ## GenLibraryClasses\r
657 #\r
658 # Get LibraryClass of Inf\r
659 # <LibraryClassKeyWord>|<LibraryInstance>\r
660 #\r
661 # @param ContainerFile: The Inf file full path \r
662 #\r
663 def GenLibraryClasses(self, ContainerFile):\r
664 EdkLogger.debug(2, "Generate %s ..." % TAB_LIBRARY_CLASSES)\r
665 LibraryClasses = {}\r
666 # Get all LibraryClasses\r
667 RecordSet = self.RecordSet[MODEL_EFI_LIBRARY_CLASS]\r
668 for Record in RecordSet:\r
669 (LibClassName, LibClassIns, Pcd, SupModelList) = GetLibraryClassOfInf([Record[0], Record[4]], ContainerFile, self.WorkspaceDir, Record[2]) \r
670 LibraryClass = CommonClass.LibraryClassClass()\r
671 LibraryClass.LibraryClass = LibClassName\r
672 LibraryClass.RecommendedInstance = LibClassIns\r
673 LibraryClass.FeatureFlag = Pcd\r
674 LibraryClass.SupArchList = Record[1]\r
675 LibraryClass.SupModuleList = Record[4]\r
676 if GenerateHelpText(Record[5], ''):\r
677 LibraryClass.HelpTextList.append(GenerateHelpText(Record[5], ''))\r
678 self.Module.LibraryClasses.append(LibraryClass)\r
679\r
680 ## GenPackages\r
681 #\r
682 # Gen Packages of Inf\r
683 # \r
684 # @param ContainerFile: The Inf file full path \r
685 #\r
686 def GenPackages(self, ContainerFile):\r
687 EdkLogger.debug(2, "Generate %s ..." % TAB_PACKAGES)\r
688 Packages = {}\r
689 # Get all Packages\r
690 RecordSet = self.RecordSet[MODEL_META_DATA_PACKAGE]\r
691 for Record in RecordSet:\r
692 (PackagePath, Pcd) = GetPackage(Record[0], ContainerFile, self.WorkspaceDir, Record[2])\r
693 Package = ModulePackageDependencyClass()\r
694 Package.FilePath = NormPath(PackagePath)\r
695 Package.SupArchList = Record[1]\r
696 Package.FeatureFlag = Pcd\r
697 if GenerateHelpText(Record[5], ''):\r
698 Package.HelpTextList.append(GenerateHelpText(Record[5], ''))\r
699 self.Module.PackageDependencies.append(Package)\r
700 \r
701 def AddPcd(self, CName, TokenSpaceGuidCName, DefaultValue, ItemType, Arch, HelpTextList):\r
702 Pcd = PcdClass()\r
703 Pcd.CName = CName\r
704 Pcd.TokenSpaceGuidCName = TokenSpaceGuidCName\r
705 Pcd.DefaultValue = DefaultValue\r
706 Pcd.ItemType = ItemType\r
707 Pcd.SupArchList = Arch\r
708 if GenerateHelpText(HelpTextList, ''):\r
709 Pcd.HelpTextList.append(GenerateHelpText(HelpTextList, ''))\r
710 self.Module.PcdCodes.append(Pcd)\r
711 \r
712 ## GenPcds\r
713 #\r
714 # Gen Pcds of Inf\r
715 # <TokenSpaceGuidCName>.<PcdCName>[|<Value>]\r
716 #\r
717 # @param ContainerFile: The Dec file full path \r
718 #\r
719 def GenPcds(self, ContainerFile):\r
720 EdkLogger.debug(2, "Generate %s ..." % TAB_PCDS)\r
721 Pcds = {}\r
722 PcdToken = {}\r
723 \r
724 # Get all Pcds\r
725 RecordSet1 = self.RecordSet[MODEL_PCD_FIXED_AT_BUILD]\r
726 RecordSet2 = self.RecordSet[MODEL_PCD_PATCHABLE_IN_MODULE]\r
727 RecordSet3 = self.RecordSet[MODEL_PCD_FEATURE_FLAG]\r
728 RecordSet4 = self.RecordSet[MODEL_PCD_DYNAMIC_EX]\r
729 RecordSet5 = self.RecordSet[MODEL_PCD_DYNAMIC]\r
730 \r
731 # Go through each arch\r
732 for Record in RecordSet1:\r
733 (TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], TAB_PCDS_FIXED_AT_BUILD, ContainerFile, Record[2])\r
734 self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5])\r
735 for Record in RecordSet2:\r
736 (TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], TAB_PCDS_PATCHABLE_IN_MODULE, ContainerFile, Record[2])\r
737 self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5])\r
738 for Record in RecordSet3:\r
739 (TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], TAB_PCDS_FEATURE_FLAG, ContainerFile, Record[2])\r
740 self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5])\r
741 for Record in RecordSet4:\r
742 (TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], TAB_PCDS_DYNAMIC_EX, ContainerFile, Record[2])\r
743 self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5])\r
744 for Record in RecordSet5:\r
745 (TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], '', ContainerFile, Record[2])\r
746 self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5])\r
747 \r
748 ## GenSources\r
749 #\r
750 # Gen Sources of Inf\r
751 # <Filename>[|<Family>[|<TagName>[|<ToolCode>[|<PcdFeatureFlag>]]]]\r
752 #\r
753 # @param ContainerFile: The Dec file full path \r
754 #\r
755 def GenSources(self, ContainerFile):\r
756 EdkLogger.debug(2, "Generate %s ..." % TAB_SOURCES)\r
757 Sources = {}\r
758 \r
759 # Get all Sources\r
760 RecordSet = self.RecordSet[MODEL_EFI_SOURCE_FILE]\r
761 for Record in RecordSet:\r
762 (Filename, Family, TagName, ToolCode, Pcd) = GetSource(Record[0], ContainerFile, self.Identification.RelaPath, Record[2])\r
763 Source = ModuleSourceFileClass(Filename, TagName, ToolCode, Family, Pcd, Record[1])\r
764 if GenerateHelpText(Record[5], ''):\r
765 Source.HelpTextList.append(GenerateHelpText(Record[5], ''))\r
766 if MODEL_EFI_SOURCE_FILE in self.SectionHeaderCommentDict:\r
767 Source.HelpText = self.SectionHeaderCommentDict[MODEL_EFI_SOURCE_FILE]\r
768 self.Module.Sources.append(Source)\r
769 #self.Module.FileList.append(os.path.normpath(os.path.join(self.Identification.RelaPath, Filename)))\r
770\r
771 ## GenDepexes\r
772 #\r
773 # Gen Depex of Inf\r
774 #\r
775 # @param ContainerFile: The Inf file full path \r
776 #\r
777 def GenDepexes(self, ContainerFile):\r
778 EdkLogger.debug(2, "Generate %s ..." % TAB_DEPEX)\r
779 Depex = {}\r
780 # Get all Depexes\r
781 RecordSet = self.RecordSet[MODEL_EFI_DEPEX]\r
782 DepexString = ''\r
783 for Record in RecordSet:\r
784 DepexString = DepexString + Record[0] + '\n'\r
785 Dep = ModuleDepexClass()\r
786 if DepexString.endswith('\n'):\r
787 DepexString = DepexString[:len(DepexString) - len('\n')]\r
788 Dep.Depex = DepexString\r
789 if self.Module.ModuleHeader.ModuleType in ['DXE_SMM_DRIVER']:\r
790 self.Module.SmmDepex = Dep\r
791 elif self.Module.ModuleHeader.ModuleType in ['PEI_CORE', 'PEIM']:\r
792 self.Module.PeiDepex = Dep\r
793 else:\r
794 self.Module.DxeDepex = Dep\r
795# for Record in RecordSet:\r
796# \r
797# Dep = ModuleDepexClass()\r
798# Dep.Depex = Record[0]\r
799# Dep.SupArchList = Record[1]\r
800# if GenerateHelpText(Record[5], ''):\r
801# Dep.HelpTextList.append(GenerateHelpText(Record[5], ''))\r
802# DepexString = DepexString + Dep\r
803# List.append(Dep)\r
804# self.Module.Depex = List\r
805# if self.Module.ModuleHeader.ModuleType in ['DXE_SMM_DRIVER']:\r
806# self.Module.SmmDepex = List\r
807# elif self.Module.ModuleHeader.ModuleType in ['PEI_CORE', 'PEIM']:\r
808# self.Module.PeiDepex = List\r
809# else:\r
810# self.Module.DxeDepex = List\r
811\r
812 ## GenBinaries\r
813 #\r
814 # Gen Binary of Inf\r
815 # <FileType>|<Filename>|<Target>[|<TokenSpaceGuidCName>.<PcdCName>]\r
816 #\r
817 # @param ContainerFile: The Dec file full path \r
818 #\r
819 def GenBinaries(self, ContainerFile):\r
820 EdkLogger.debug(2, "Generate %s ..." % TAB_BINARIES)\r
821 Binaries = {}\r
822 \r
823 # Get all Guids\r
824 RecordSet = self.RecordSet[MODEL_EFI_BINARY_FILE]\r
825 for Record in RecordSet:\r
826 (FileType, Filename, Target, Pcd) = GetBinary(Record[0], ContainerFile, self.Identification.RelaPath, Record[2])\r
827 Binary = ModuleBinaryFileClass(Filename, FileType, Target, Pcd, Record[1])\r
828 if GenerateHelpText(Record[5], ''):\r
829 Binary.HelpTextList.append(GenerateHelpText(Record[5], ''))\r
830 self.Module.Binaries.append(Binary)\r
831 #self.Module.FileList.append(os.path.normpath(os.path.join(self.Identification.RelaPath, Filename)))\r
832 \r
833 ## GenGuids\r
834 #\r
835 # Gen Guids of Inf\r
836 # <CName>=<GuidValue>\r
837 #\r
838 # @param ContainerFile: The Inf file full path \r
839 #\r
840 def GenGuidProtocolPpis(self, Type, ContainerFile):\r
841 EdkLogger.debug(2, "Generate %s ..." % Type)\r
842 Lists = {}\r
843 # Get all Items\r
844 if Type == TAB_GUIDS:\r
845 ListMember = self.Module.Guids\r
846 elif Type == TAB_PROTOCOLS:\r
847 ListMember = self.Module.Protocols\r
848 elif Type == TAB_PPIS:\r
849 ListMember = self.Module.Ppis\r
850\r
851 RecordSet = self.RecordSet[Section[Type.upper()]]\r
852 for Record in RecordSet:\r
853 (Name, Value) = GetGuidsProtocolsPpisOfInf(Record[0], Type, ContainerFile, Record[2])\r
854 ListClass = GuidProtocolPpiCommonClass()\r
855 ListClass.CName = Name\r
856 ListClass.SupArchList = Record[1]\r
857 ListClass.FeatureFlag = Value\r
858 if GenerateHelpText(Record[5], ''):\r
859 ListClass.HelpTextList.append(GenerateHelpText(Record[5], ''))\r
860 ListMember.append(ListClass)\r
861 \r
862##\r
863#\r
864# This acts like the main() function for the script, unless it is 'import'ed into another\r
865# script.\r
866#\r
867if __name__ == '__main__':\r
868 EdkLogger.Initialize()\r
869 EdkLogger.SetLevel(EdkLogger.QUIET)\r
870 \r
871 W = os.getenv('WORKSPACE')\r
872 F = os.path.join(W, 'MdeModulePkg/Application/HelloWorld/HelloWorld.inf')\r
873 \r
874 P = Inf(os.path.normpath(F), True, W, 'MdeModulePkg')\r
875 P.ShowModule()\r
876 print P.ModuleToInf(P.Module)\r