]>
Commit | Line | Data |
---|---|---|
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 | |
17 | import os\r | |
18 | import re\r | |
19 | import EdkLogger\r | |
20 | \r | |
21 | from CommonDataClass.ModuleClass import *\r | |
22 | from CommonDataClass import CommonClass\r | |
23 | from String import *\r | |
24 | from DataType import *\r | |
25 | from BuildToolError import *\r | |
26 | from Misc import sdict\r | |
27 | from Misc import GetFiles\r | |
28 | from Parsing import *\r | |
29 | \r | |
30 | # Global variable\r | |
31 | Section = {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 | |
53 | gComponentType2ModuleType = {\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 | |
68 | class 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 | |
114 | class 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 | |
140 | class 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 | |
867 | if __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 |