]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/PomAdapter/InfPomAlignment.py
BaseTools: Fix old python2 idioms
[mirror_edk2.git] / BaseTools / Source / Python / UPT / PomAdapter / InfPomAlignment.py
CommitLineData
4234283c
LG
1## @file InfPomAlignment.py\r
2# This file contained the adapter for convert INF parser object to POM Object\r
3#\r
64285f15 4# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
4234283c
LG
5#\r
6# This program and the accompanying materials are licensed and made available \r
7# under the terms and conditions of the BSD License which accompanies this \r
8# distribution. The full text of the license may be found at \r
9# http://opensource.org/licenses/bsd-license.php\r
10#\r
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13#\r
14'''\r
15InfPomAlignment\r
16'''\r
17##\r
18# Import modules\r
19#\r
20import os.path\r
4234283c
LG
21from Logger import StringTable as ST\r
22import Logger.Log as Logger\r
64285f15
YZ
23from Library.StringUtils import FORMAT_INVALID\r
24from Library.StringUtils import PARSER_ERROR\r
25from Library.StringUtils import NormPath\r
26from Library.StringUtils import GetSplitValueList\r
4234283c
LG
27from Library.Misc import ConvertVersionToDecimal\r
28from Library.Misc import GetHelpStringByRemoveHashKey\r
29from Library.Misc import ConvertArchList\r
421ccda3
HC
30from Library.Misc import GetRelativePath\r
31from Library.Misc import PathClass\r
4234283c 32from Library.Parsing import GetPkgInfoFromDec\r
421ccda3
HC
33from Library.UniClassObject import UniFileClassObject\r
34from Library.UniClassObject import ConvertSpecialUnicodes\r
35from Library.UniClassObject import GetLanguageCode1766\r
4234283c
LG
36from Library import DataType as DT\r
37from Library import GlobalData\r
421ccda3 38from Library.ParserValidate import IsValidPath\r
4234283c
LG
39from Object.POM import CommonObject\r
40from Object.POM.ModuleObject import ModuleObject\r
41from Object.POM.ModuleObject import ExternObject\r
42from Object.POM.ModuleObject import HobObject\r
43from Object.POM.ModuleObject import EventObject\r
44from Object.POM.ModuleObject import BootModeObject\r
45from Object.POM.ModuleObject import PackageDependencyObject\r
46from Object.POM.ModuleObject import SourceFileObject\r
47from Object.POM.ModuleObject import DepexObject\r
48from Object.POM.ModuleObject import AsBuildLibraryClassObject\r
49from Object.POM.ModuleObject import AsBuiltObject\r
50from PomAdapter.InfPomAlignmentMisc import GenModuleHeaderUserExt\r
51from PomAdapter.InfPomAlignmentMisc import GenBinaryData\r
52from Parser import InfParser\r
421ccda3 53from PomAdapter.DecPomAlignment import DecPomAlignment\r
fb0f8067 54from Common.MultipleWorkspace import MultipleWorkspace as mws\r
4234283c
LG
55\r
56## InfPomAlignment\r
57#\r
58# Inherit from ModuleObject\r
59#\r
60class InfPomAlignment(ModuleObject):\r
61 ## Construct of InfPomAlignment\r
62 # Skip means that UPT don't care the syntax of INF, this may be the not \r
63 # distributed INF files during creation or the INF files checked for \r
64 # dependency rule during remove.\r
65 #\r
66 def __init__(self, FileName, WorkSpace=None, PackagePath='', Skip=False):\r
67 ModuleObject.__init__(self)\r
4234283c
LG
68 self.Parser = None\r
69 self.FileName = FileName\r
70 self.WorkSpace = WorkSpace\r
71 self.CombinePath = ''\r
72 self.LibModuleTypeList = []\r
73 self.FullPath = ''\r
74 self.ModulePath = ''\r
75 self.WorkspaceDir = " "\r
76 self.CustomMakefile = []\r
421ccda3 77 self.UniFileClassObject = None\r
4234283c
LG
78 self.SetPackagePath(PackagePath)\r
79 #\r
80 # Call GenInfPomObjects function to fill POM object.\r
81 #\r
82 if Skip:\r
83 OrigConfig = Logger.SUPRESS_ERROR\r
84 Logger.SUPRESS_ERROR = True\r
421ccda3
HC
85 try:\r
86 self._GenInfPomObjects(Skip)\r
87 finally:\r
88 Logger.SUPRESS_ERROR = OrigConfig\r
4234283c
LG
89 else:\r
90 self._GenInfPomObjects(Skip)\r
91\r
92 ##\r
93 # Generate all POM objects, the original input comes \r
94 # from INF parser's output\r
95 #\r
96 def _GenInfPomObjects(self, Skip):\r
97 #\r
98 # Call INF Parser to get information from INF file \r
99 #\r
100 self.Parser = InfParser.InfParser(self.FileName, self.WorkSpace)\r
101 self.FullPath = self.Parser.FullPath\r
102 self.GetFullPath()\r
103 self._GenModuleHeader()\r
104 #\r
105 # Call GenBinaries after Module Header for Binary INF consideration.\r
106 #\r
107 self._GenBinaries()\r
108 self._GenBuildOptions()\r
109 self._GenLibraryClasses()\r
110 self._GenPackages(Skip)\r
111 self._GenPcds()\r
112 self._GenSources()\r
113 self._GenUserExtensions()\r
114 self._GenGuidProtocolPpis(DT.TAB_GUIDS)\r
115 self._GenGuidProtocolPpis(DT.TAB_PROTOCOLS)\r
116 self._GenGuidProtocolPpis(DT.TAB_PPIS)\r
117 self._GenDepexes()\r
4234283c
LG
118\r
119 ## Convert [Defines] section content to InfDefObject\r
120 #\r
121 # Convert [Defines] section content to InfDefObject\r
122 #\r
123 # @param Defines The content under [Defines] section\r
124 # @param ModuleHeader An object of ModuleHeaderClass\r
125 # @param Arch The supported ARCH\r
126 #\r
127 def _GenModuleHeader(self):\r
128 Logger.Debug(2, "Generate ModuleHeader ...")\r
129 #\r
130 # Get all defines information form InfParser Object\r
131 #\r
132 RecordSet = self.Parser.InfDefSection.Defines\r
133 #\r
134 # Should only have one ArchString Item.\r
135 #\r
136 ArchString = RecordSet.keys()[0]\r
137 ArchList = GetSplitValueList(ArchString, ' ')\r
138 ArchList = ConvertArchList(ArchList)\r
139 HasCalledFlag = False\r
4234283c
LG
140 #\r
141 # Get data from Sdict()\r
142 #\r
143 ValueList = RecordSet[ArchString]\r
144 self.SetFileName(self.FileName)\r
145 self.SetFullPath(self.FullPath)\r
146 #\r
147 # The INF's filename (without the directory path or the extension) \r
148 # must be used for the value of the \r
149 # ModuleSurfaceArea.Header.Name element\r
150 #\r
151 self.SetName(os.path.splitext(os.path.basename(self.FileName))[0])\r
4234283c
LG
152 self.WorkspaceDir = " "\r
153 #\r
154 # CombinePath and ModulePath\r
155 #\r
421ccda3 156 CombinePath = GetRelativePath(self.FullPath, self.WorkSpace)\r
4234283c 157 self.SetCombinePath(CombinePath)\r
4234283c
LG
158 ModulePath = os.path.split(CombinePath)[0]\r
159 ModuleRelativePath = ModulePath\r
160 if self.GetPackagePath() != '':\r
421ccda3 161 ModuleRelativePath = GetRelativePath(ModulePath, self.GetPackagePath())\r
4234283c 162 self.SetModulePath(ModuleRelativePath)\r
4234283c
LG
163 #\r
164 # For Define Seciton Items.\r
165 #\r
166 DefineObj = ValueList\r
4234283c
LG
167 #\r
168 # Convert UEFI/PI version to decimal number\r
169 #\r
4231a819 170 if DefineObj.GetUefiSpecificationVersion() is not None:\r
4234283c
LG
171 __UefiVersion = DefineObj.GetUefiSpecificationVersion().GetValue()\r
172 __UefiVersion = ConvertVersionToDecimal(__UefiVersion)\r
173 self.SetUefiSpecificationVersion(str(__UefiVersion))\r
4231a819 174 if DefineObj.GetPiSpecificationVersion() is not None:\r
4234283c
LG
175 __PiVersion = DefineObj.GetPiSpecificationVersion().GetValue()\r
176 __PiVersion = ConvertVersionToDecimal(__PiVersion)\r
177\r
178 self.SetPiSpecificationVersion(str(__PiVersion))\r
4234283c
LG
179 SpecList = DefineObj.GetSpecification()\r
180 NewSpecList = []\r
181 for SpecItem in SpecList:\r
182 NewSpecList.append((SpecItem[0], ConvertVersionToDecimal(SpecItem[1])))\r
183 self.SetSpecList(NewSpecList)\r
184\r
185 #\r
186 # must exist items in INF define section\r
187 # MODULE_TYPE/BASE_NAME/INF_VERSION/FILE_GUID/VERSION_STRING \r
188 #\r
4231a819 189 if DefineObj.GetModuleType() is None:\r
4234283c
LG
190 Logger.Error("InfParser", FORMAT_INVALID,\r
191 ST.ERR_INF_PARSER_DEFINE_SECTION_MUST_ITEM_NOT_EXIST % ("MODULE_TYPE"), File=self.FullPath)\r
192 else:\r
193 self.SetModuleType(DefineObj.GetModuleType().GetValue())\r
194 ModuleType = DefineObj.GetModuleType().GetValue()\r
195 if ModuleType:\r
196 #\r
197 # Drivers and applications are not allowed to have a MODULE_TYPE of "BASE". Only \r
198 # libraries are permitted to a have a MODULE_TYPE of "BASE".\r
199 #\r
200 if len(DefineObj.LibraryClass) == 0 and ModuleType == 'BASE':\r
201 Logger.Error("InfParser",\r
202 FORMAT_INVALID,\r
203 ST.ERR_INF_PARSER_MODULETYPE_INVALID,\r
204 File=self.FullPath,\r
205 Line=DefineObj.ModuleType.CurrentLine.LineNo,\r
206 ExtraData=DefineObj.ModuleType.CurrentLine.LineString)\r
207 self.LibModuleTypeList.append(ModuleType)\r
4231a819 208 if DefineObj.GetBaseName() is None:\r
4234283c
LG
209 Logger.Error("InfParser", FORMAT_INVALID,\r
210 ST.ERR_INF_PARSER_DEFINE_SECTION_MUST_ITEM_NOT_EXIST % ("BASE_NAME"), File=self.FullPath)\r
211 else:\r
212 self.SetBaseName(DefineObj.GetBaseName().GetValue())\r
421ccda3
HC
213 if DefineObj.GetModuleUniFileName():\r
214 self.UniFileClassObject = UniFileClassObject([PathClass(DefineObj.GetModuleUniFileName())])\r
215 else:\r
216 self.UniFileClassObject = None\r
4231a819 217 if DefineObj.GetInfVersion() is None:\r
4234283c
LG
218 Logger.Error("InfParser", FORMAT_INVALID,\r
219 ST.ERR_INF_PARSER_DEFINE_SECTION_MUST_ITEM_NOT_EXIST % ("INF_VERSION"), File=self.FullPath)\r
220 else:\r
221 self.SetVersion(DefineObj.GetInfVersion().GetValue())\r
4231a819 222 if DefineObj.GetFileGuid() is None:\r
4234283c
LG
223 Logger.Error("InfParser", FORMAT_INVALID,\r
224 ST.ERR_INF_PARSER_DEFINE_SECTION_MUST_ITEM_NOT_EXIST % ("FILE_GUID"), File=self.FullPath)\r
225 else:\r
226 self.SetGuid(DefineObj.GetFileGuid().GetValue())\r
4231a819 227 if DefineObj.GetVersionString() is None:\r
4234283c
LG
228 #\r
229 # VERSION_STRING is missing from the [Defines] section, tools must assume that the module's version is 0.\r
230 #\r
231 self.SetVersion('0')\r
232 else:\r
233 #\r
234 # Get version of INF\r
235 #\r
236 if DefineObj.GetVersionString().GetValue() != "":\r
237 #\r
238 # EDK2 inf\r
239 #\r
240 VersionString = DefineObj.GetVersionString().GetValue()\r
241 if len(VersionString) > 0:\r
242 VersionString = ConvertVersionToDecimal(VersionString)\r
243 self.SetVersion(VersionString)\r
244 else:\r
245 #\r
246 # EDK1 inf\r
247 #\r
248 Logger.Error("Parser", PARSER_ERROR, ST.ERR_INF_PARSER_NOT_SUPPORT_EDKI_INF, ExtraData=self.FullPath,\r
249 RaiseError=Logger.IS_RAISE_ERROR)\r
4234283c
LG
250 #\r
251 # if there is Shadow, Should judge the MODULE_TYPE in \r
252 # SEC, PEI_CORE and PEIM\r
253 #\r
254 if DefineObj.GetShadow():\r
255 ModuleTypeValue = DefineObj.GetModuleType().GetValue()\r
256 if not (ModuleTypeValue == 'SEC' or ModuleTypeValue == 'PEI_CORE' or ModuleTypeValue == 'PEIM'):\r
257 Logger.Error("InfParser", FORMAT_INVALID, ST.ERR_INF_PARSER_DEFINE_SHADOW_INVALID, File=self.FullPath)\r
258\r
4231a819 259 if DefineObj.GetPcdIsDriver() is not None:\r
4234283c 260 self.SetPcdIsDriver(DefineObj.GetPcdIsDriver().GetValue())\r
4234283c
LG
261 #\r
262 # LIBRARY_CLASS\r
263 #\r
264 self._GenModuleHeaderLibClass(DefineObj, ArchList)\r
4234283c
LG
265 #\r
266 # CUSTOM_MAKEFILE\r
267 #\r
268 self.CustomMakefile = DefineObj.GetCustomMakefile()\r
269 #\r
270 # Externs in Defines section\r
271 # Only one define section, so just call once.\r
272 #\r
273 if not HasCalledFlag:\r
274 self._GenModuleHeaderExterns(DefineObj)\r
275 HasCalledFlag = True\r
4234283c
LG
276 #\r
277 # each module has only one module header\r
278 #\r
279 self.SetSupArchList(ArchList)\r
280 #\r
281 # Get Hob/BootMode/EventList information\r
282 #\r
283 self._GenSpecialComments()\r
284 #\r
285 # put all define statement into user-extension sections\r
286 # \r
287 DefinesDictNew = GenModuleHeaderUserExt(DefineObj, ArchString)\r
4234283c
LG
288 if DefinesDictNew:\r
289 UserExtension = CommonObject.UserExtensionObject()\r
290 UserExtension.SetDefinesDict(DefinesDictNew)\r
291 UserExtension.SetIdentifier('DefineModifiers')\r
292 UserExtension.SetUserID('EDK2')\r
293 self.SetUserExtensionList(self.GetUserExtensionList() + [UserExtension])\r
4234283c
LG
294 #\r
295 # Get all meta-file header information\r
296 # the record is list of items formated: \r
297 # [LineValue, Arch, StartLine, ID, Third]\r
298 #\r
4234283c
LG
299 InfHeaderObj = self.Parser.InfHeader\r
300 #\r
301 # Put header information into POM object\r
302 #\r
421ccda3
HC
303 if self.UniFileClassObject:\r
304 Lang = DT.TAB_LANGUAGE_EN_X\r
305 else:\r
306 Lang = DT.TAB_LANGUAGE_EN_US\r
307 if InfHeaderObj.GetAbstract():\r
308 self.SetAbstract((Lang, InfHeaderObj.GetAbstract()))\r
309 if InfHeaderObj.GetDescription():\r
310 self.SetDescription((Lang, InfHeaderObj.GetDescription()))\r
311 if InfHeaderObj.GetCopyright():\r
312 self.SetCopyright(('', InfHeaderObj.GetCopyright()))\r
313 if InfHeaderObj.GetLicense():\r
314 self.SetLicense(('', InfHeaderObj.GetLicense()))\r
315 #\r
316 # Put Binary header information into POM object\r
317 #\r
318 InfBinaryHeaderObj = self.Parser.InfBinaryHeader\r
319 if InfBinaryHeaderObj.GetAbstract():\r
320 self.SetBinaryHeaderAbstract((Lang, InfBinaryHeaderObj.GetAbstract()))\r
321 if InfBinaryHeaderObj.GetDescription():\r
322 self.SetBinaryHeaderDescription((Lang, InfBinaryHeaderObj.GetDescription()))\r
323 if InfBinaryHeaderObj.GetCopyright():\r
324 self.SetBinaryHeaderCopyright(('', InfBinaryHeaderObj.GetCopyright()))\r
325 if InfBinaryHeaderObj.GetLicense():\r
326 self.SetBinaryHeaderLicense(('', InfBinaryHeaderObj.GetLicense()))\r
4234283c
LG
327\r
328 ## GenModuleHeaderLibClass\r
329 #\r
330 #\r
331 def _GenModuleHeaderLibClass(self, DefineObj, ArchList):\r
332 LibraryList = DefineObj.GetLibraryClass()\r
333 for LibraryItem in LibraryList:\r
334 Lib = CommonObject.LibraryClassObject()\r
335 Lib.SetLibraryClass(LibraryItem.GetLibraryName())\r
336 Lib.SetUsage(DT.USAGE_ITEM_PRODUCES)\r
337 SupModuleList = LibraryItem.GetTypes()\r
338 self.LibModuleTypeList += SupModuleList\r
339 Lib.SetSupModuleList(SupModuleList)\r
340 Lib.SetSupArchList(ArchList)\r
341 self.SetLibraryClassList(self.GetLibraryClassList() + [Lib])\r
342 self.SetIsLibrary(True)\r
343 self.SetIsLibraryModList(self.GetIsLibraryModList() + SupModuleList)\r
344\r
345 ## GenModuleHeaderExterns\r
346 #\r
347 #\r
348 def _GenModuleHeaderExterns(self, DefineObj):\r
349 EntryPointList = DefineObj.GetEntryPoint()\r
350 for EntryPoint in EntryPointList:\r
351 Image = ExternObject()\r
352 Image.SetEntryPoint(EntryPoint.GetCName())\r
353 #\r
354 # Future enhancement\r
355 #\r
356 self.SetExternList(self.GetExternList() + [Image])\r
357 #\r
358 # UNLOAD_IMAGE\r
359 # \r
360 UnloadImageList = DefineObj.GetUnloadImages()\r
361 for UnloadImage in UnloadImageList:\r
362 Image = ExternObject()\r
363 #\r
364 # Future enhancement\r
365 # \r
366 Image.SetUnloadImage(UnloadImage.GetCName())\r
367 self.SetExternList(self.GetExternList() + [Image])\r
368 #\r
369 # CONSTRUCTOR\r
370 #\r
371 ConstructorList = DefineObj.GetConstructor()\r
372 for ConstructorItem in ConstructorList:\r
373 Image = ExternObject()\r
374 #\r
375 # Future enhancement\r
376 # \r
377 Image.SetConstructor(ConstructorItem.GetCName())\r
378 self.SetExternList(self.GetExternList() + [Image])\r
379 #\r
380 # DESTRUCTOR\r
381 #\r
382 DestructorList = DefineObj.GetDestructor()\r
383 for DestructorItem in DestructorList:\r
384 Image = ExternObject()\r
385 #\r
386 # Future enhancement\r
387 # \r
388 Image.SetDestructor(DestructorItem.GetCName())\r
389 self.SetExternList(self.GetExternList() + [Image])\r
390\r
391 ## GenModuleHeaderExterns\r
392 # BootMode/HOB/Event\r
393 #\r
394 def _GenSpecialComments(self):\r
395 SpecialCommentsList = self.Parser.InfSpecialCommentSection.GetSpecialComments()\r
396 for Key in SpecialCommentsList:\r
397 if Key == DT.TYPE_HOB_SECTION:\r
398 HobList = []\r
399 for Item in SpecialCommentsList[Key]:\r
400 Hob = HobObject()\r
401 Hob.SetHobType(Item.GetHobType())\r
402 Hob.SetUsage(Item.GetUsage())\r
403 Hob.SetSupArchList(Item.GetSupArchList())\r
404 if Item.GetHelpString():\r
405 HelpTextObj = CommonObject.TextObject()\r
421ccda3
HC
406 if self.UniFileClassObject:\r
407 HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
4234283c
LG
408 HelpTextObj.SetString(Item.GetHelpString())\r
409 Hob.SetHelpTextList([HelpTextObj])\r
410 HobList.append(Hob)\r
411 self.SetHobList(HobList)\r
412 elif Key == DT.TYPE_EVENT_SECTION:\r
413 EventList = []\r
414 for Item in SpecialCommentsList[Key]:\r
415 Event = EventObject()\r
416 Event.SetEventType(Item.GetEventType())\r
417 Event.SetUsage(Item.GetUsage())\r
418 if Item.GetHelpString():\r
419 HelpTextObj = CommonObject.TextObject()\r
421ccda3
HC
420 if self.UniFileClassObject:\r
421 HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
4234283c
LG
422 HelpTextObj.SetString(Item.GetHelpString())\r
423 Event.SetHelpTextList([HelpTextObj])\r
424 EventList.append(Event)\r
425 self.SetEventList(EventList)\r
426 elif Key == DT.TYPE_BOOTMODE_SECTION:\r
427 BootModeList = []\r
428 for Item in SpecialCommentsList[Key]:\r
429 BootMode = BootModeObject()\r
430 BootMode.SetSupportedBootModes(Item.GetSupportedBootModes())\r
431 BootMode.SetUsage(Item.GetUsage())\r
432 if Item.GetHelpString():\r
433 HelpTextObj = CommonObject.TextObject()\r
421ccda3
HC
434 if self.UniFileClassObject:\r
435 HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
4234283c
LG
436 HelpTextObj.SetString(Item.GetHelpString())\r
437 BootMode.SetHelpTextList([HelpTextObj])\r
438 BootModeList.append(BootMode)\r
439 self.SetBootModeList(BootModeList)\r
440\r
441 ## GenBuildOptions\r
442 #\r
443 # Gen BuildOptions of Inf\r
444 # [<Family>:]<ToolFlag>=Flag\r
445 #\r
446 #\r
447 def _GenBuildOptions(self):\r
448 Logger.Debug(2, "Generate %s ..." % DT.TAB_BUILD_OPTIONS)\r
449 #\r
450 # Get all BuildOptions\r
451 #\r
452 BuildOptionsList = self.Parser.InfBuildOptionSection.GetBuildOptions()\r
453 if not GlobalData.gIS_BINARY_INF:\r
454 BuildOptionDict = {}\r
4234283c
LG
455 for BuildOptionObj in BuildOptionsList:\r
456 ArchList = BuildOptionObj.GetSupArchList()\r
457 ArchList = ConvertArchList(ArchList)\r
458 BuildOptionsContent = BuildOptionObj.GetContent()\r
459 ArchString = ' '.join(ArchList)\r
4234283c
LG
460 if not BuildOptionsContent:\r
461 continue\r
4234283c 462 BuildOptionDict[ArchString] = BuildOptionsContent\r
4234283c
LG
463 if not BuildOptionDict:\r
464 return\r
465 UserExtension = CommonObject.UserExtensionObject()\r
466 UserExtension.SetBuildOptionDict(BuildOptionDict)\r
467 UserExtension.SetIdentifier('BuildOptionModifiers')\r
468 UserExtension.SetUserID('EDK2')\r
469 self.SetUserExtensionList(self.GetUserExtensionList() + [UserExtension])\r
470 else:\r
471 #\r
472 # Not process this information, will be processed in GenBinaries()\r
473 #\r
474 pass\r
475\r
476 ## GenLibraryClasses\r
477 #\r
478 # Get LibraryClass of Inf\r
479 # <LibraryClassKeyWord>|<LibraryInstance>\r
480 #\r
481 # @param ContainerFile: The Inf file full path\r
482 #\r
483 def _GenLibraryClasses(self):\r
484 Logger.Debug(2, "Generate %s ..." % DT.TAB_LIBRARY_CLASSES)\r
485 if not GlobalData.gIS_BINARY_INF:\r
486 #\r
487 # Get all LibraryClasses\r
488 #\r
98120f5f 489 for LibraryClassData in self.Parser.InfLibraryClassSection.LibraryClasses.values():\r
4234283c
LG
490 for Item in LibraryClassData:\r
491 LibraryClass = CommonObject.LibraryClassObject()\r
492 LibraryClass.SetUsage(DT.USAGE_ITEM_CONSUMES)\r
493 LibraryClass.SetLibraryClass(Item.GetLibName())\r
494 LibraryClass.SetRecommendedInstance(None)\r
495 LibraryClass.SetFeatureFlag(Item.GetFeatureFlagExp())\r
496 LibraryClass.SetSupArchList(ConvertArchList(Item.GetSupArchList()))\r
497 LibraryClass.SetSupModuleList(Item.GetSupModuleList())\r
498 HelpStringObj = Item.GetHelpString()\r
4231a819 499 if HelpStringObj is not None:\r
4234283c
LG
500 CommentString = GetHelpStringByRemoveHashKey(HelpStringObj.HeaderComments +\r
501 HelpStringObj.TailComments)\r
502 HelpTextHeaderObj = CommonObject.TextObject()\r
421ccda3
HC
503 if self.UniFileClassObject:\r
504 HelpTextHeaderObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
4234283c
LG
505 HelpTextHeaderObj.SetString(CommentString)\r
506 LibraryClass.SetHelpTextList([HelpTextHeaderObj])\r
4234283c
LG
507 self.SetLibraryClassList(self.GetLibraryClassList() + [LibraryClass])\r
508\r
509 ## GenPackages\r
510 #\r
511 # Gen Packages of Inf\r
512 #\r
513 #\r
514 # @param ContainerFile: The Inf file full path\r
515 #\r
516 def _GenPackages(self, Skip):\r
517 Logger.Debug(2, "Generate %s ..." % DT.TAB_PACKAGES)\r
518 #\r
519 # Get all Packages\r
520 #\r
521 PackageObj = self.Parser.InfPackageSection.Packages\r
4234283c
LG
522 #\r
523 # Go through each arch\r
524 #\r
525 for PackageItemObj in PackageObj:\r
526 #\r
527 # Need package information for dependency check usage\r
528 #\r
529 PackageDependency = PackageDependencyObject()\r
530 PackageDependency.SetPackageFilePath(NormPath(PackageItemObj.GetPackageName()))\r
531 PackageDependency.SetSupArchList(ConvertArchList(PackageItemObj.GetSupArchList()))\r
532 PackageDependency.SetFeatureFlag(PackageItemObj.GetFeatureFlagExp())\r
533\r
fb0f8067 534 PkgInfo = GetPkgInfoFromDec(mws.join(self.WorkSpace, NormPath(PackageItemObj.GetPackageName())))\r
4234283c
LG
535 if PkgInfo[1] and PkgInfo[2]:\r
536 PackageDependency.SetGuid(PkgInfo[1])\r
537 PackageDependency.SetVersion(PkgInfo[2])\r
538 elif Skip:\r
539 continue\r
540 else:\r
541 Logger.Error("\nUPT", PARSER_ERROR,\r
542 ST.ERR_INF_GET_PKG_DEPENDENCY_FAIL % PackageItemObj.GetPackageName(), File=self.FullPath)\r
543\r
544 PackageDependencyList = self.GetPackageDependencyList()\r
545 PackageDependencyList.append(PackageDependency)\r
546 self.SetPackageDependencyList(PackageDependencyList)\r
547\r
548 ## GenPcds\r
549 #\r
550 # Gen Pcds of Inf\r
551 # <TokenSpaceGuidCName>.<PcdCName>[|<Value> [|<FFE>]]\r
552 #\r
553 # @param ContainerFile: The Inf file full path\r
554 #\r
555 def _GenPcds(self):\r
556 if not GlobalData.gIS_BINARY_INF:\r
557 Logger.Debug(2, "Generate %s ..." % DT.TAB_PCDS)\r
4234283c
LG
558 #\r
559 # Get all Pcds\r
560 #\r
561 PcdObj = self.Parser.InfPcdSection.Pcds\r
562 KeysList = PcdObj.keys()\r
4234283c
LG
563 #\r
564 # Go through each arch\r
565 #\r
566 for (PcdType, PcdKey) in KeysList:\r
567 PcdData = PcdObj[PcdType, PcdKey]\r
568 for PcdItemObj in PcdData:\r
569 CommentList = PcdItemObj.GetHelpStringList()\r
570 if CommentList:\r
571 for CommentItem in CommentList:\r
572 Pcd = CommonObject.PcdObject()\r
573 Pcd.SetCName(PcdItemObj.GetCName())\r
574 Pcd.SetTokenSpaceGuidCName(PcdItemObj.GetTokenSpaceGuidCName())\r
575 Pcd.SetDefaultValue(PcdItemObj.GetDefaultValue())\r
576 Pcd.SetItemType(PcdType)\r
577 Pcd.SetValidUsage(CommentItem.GetUsageItem())\r
578 Pcd.SetFeatureFlag(PcdItemObj.GetFeatureFlagExp())\r
579 Pcd.SetSupArchList(ConvertArchList(PcdItemObj.GetSupportArchList()))\r
580 HelpTextObj = CommonObject.TextObject()\r
421ccda3
HC
581 if self.UniFileClassObject:\r
582 HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
4234283c
LG
583 HelpTextObj.SetString(CommentItem.GetHelpStringItem())\r
584 Pcd.SetHelpTextList([HelpTextObj])\r
585 PcdList = self.GetPcdList()\r
586 PcdList.append(Pcd)\r
587 self.SetPcdList(PcdList)\r
588\r
589 ## GenSources\r
590 #\r
591 # Gen Sources of Inf\r
592 # <Filename>[|<Family>[|<TagName>[|<ToolCode>[|<PcdFeatureFlag>]]]]\r
593 #\r
594 # @param ContainerFile: The Inf file full path\r
595 #\r
596 def _GenSources(self):\r
597 Logger.Debug(2, "Generate %s ..." % DT.TAB_SOURCES)\r
598\r
599 #\r
600 # Get all SourceFiles\r
601 #\r
602 SourceObj = self.Parser.InfSourcesSection.Sources\r
603 DataList = SourceObj.keys()\r
604 #\r
605 # Go through each arch\r
606 #\r
607 SourceList = []\r
608 for Key in DataList:\r
609 SourceData = SourceObj[Key]\r
610 for Item in SourceData:\r
611 SourceFile = Item.GetSourceFileName()\r
612 Family = Item.GetFamily()\r
613 FeatureFlag = Item.GetFeatureFlagExp()\r
0d1f5b2b 614 SupArchList = sorted(ConvertArchList(Item.GetSupArchList()))\r
4234283c
LG
615 Source = SourceFileObject()\r
616 Source.SetSourceFile(SourceFile)\r
617 Source.SetFamily(Family)\r
618 Source.SetFeatureFlag(FeatureFlag)\r
619 Source.SetSupArchList(SupArchList)\r
620 SourceList.append(Source)\r
621\r
622 self.SetSourceFileList(self.GetSourceFileList() + SourceList)\r
623\r
624\r
625 ## GenUserExtensions\r
626 #\r
627 # Gen UserExtensions of Inf\r
628 #\r
629 def _GenUserExtensions(self):\r
630 #\r
631 # UserExtensions\r
632 #\r
633 UserExtensionObj = self.Parser.InfUserExtensionSection.UserExtension\r
634 Keys = UserExtensionObj.keys()\r
635\r
636 for Key in Keys:\r
637 UserExtensionData = UserExtensionObj[Key]\r
638 for UserExtensionDataObj in UserExtensionData:\r
639 UserExtension = CommonObject.UserExtensionObject()\r
640 UserId = UserExtensionDataObj.GetUserId()\r
641 if UserId.startswith('"') and UserId.endswith('"'):\r
642 UserId = UserId[1:-1] \r
643 UserExtension.SetUserID(UserId)\r
644 Identifier = UserExtensionDataObj.GetIdString()\r
645 if Identifier.startswith('"') and Identifier.endswith('"'):\r
646 Identifier = Identifier[1:-1]\r
421ccda3
HC
647 #\r
648 # Generate miscellaneous files on INF file\r
649 #\r
650 if UserId == 'TianoCore' and Identifier == 'ExtraFiles':\r
651 self._GenMiscFiles(UserExtensionDataObj.GetContent())\r
4234283c
LG
652 UserExtension.SetIdentifier(Identifier)\r
653 UserExtension.SetStatement(UserExtensionDataObj.GetContent())\r
654 UserExtension.SetSupArchList(ConvertArchList(UserExtensionDataObj.GetSupArchList()))\r
655 self.SetUserExtensionList(self.GetUserExtensionList() + [UserExtension])\r
421ccda3
HC
656 \r
657 #\r
658 # Gen UserExtensions of TianoCore."BinaryHeader"\r
659 #\r
660 \r
661 #Get Binary header from INF file\r
662 BinaryAbstractList = self.BinaryHeaderAbstractList\r
663 BinaryDescriptionList = self.BinaryHeaderDescriptionList\r
664 BinaryCopyrightList = self.BinaryHeaderCopyrightList\r
665 BinaryLicenseList = self.BinaryHeaderLicenseList\r
666 #Get Binary header from UNI file\r
667 # Initialize UniStrDict, the top keys are language codes\r
668 UniStrDict = {}\r
669 if self.UniFileClassObject:\r
670 UniStrDict = self.UniFileClassObject.OrderedStringList\r
671 for Lang in UniStrDict:\r
672 for StringDefClassObject in UniStrDict[Lang]:\r
673 Lang = GetLanguageCode1766(Lang)\r
674 if StringDefClassObject.StringName == DT.TAB_INF_BINARY_ABSTRACT:\r
675 BinaryAbstractList.append((Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue)))\r
676 if StringDefClassObject.StringName == DT.TAB_INF_BINARY_DESCRIPTION:\r
677 BinaryDescriptionList.append((Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue)))\r
678 if BinaryAbstractList or BinaryDescriptionList or BinaryCopyrightList or BinaryLicenseList:\r
679 BinaryUserExtension = CommonObject.UserExtensionObject()\r
680 BinaryUserExtension.SetBinaryAbstract(BinaryAbstractList)\r
681 BinaryUserExtension.SetBinaryDescription(BinaryDescriptionList)\r
682 BinaryUserExtension.SetBinaryCopyright(BinaryCopyrightList)\r
683 BinaryUserExtension.SetBinaryLicense(BinaryLicenseList)\r
684 BinaryUserExtension.SetIdentifier(DT.TAB_BINARY_HEADER_IDENTIFIER)\r
685 BinaryUserExtension.SetUserID(DT.TAB_BINARY_HEADER_USERID)\r
686 self.SetUserExtensionList(self.GetUserExtensionList() + [BinaryUserExtension])\r
687 \r
4234283c
LG
688 def _GenDepexesList(self, SmmDepexList, DxeDepexList, PeiDepexList):\r
689 if SmmDepexList:\r
690 self.SetSmmDepex(SmmDepexList)\r
691 if DxeDepexList:\r
692 self.SetDxeDepex(DxeDepexList)\r
693 if PeiDepexList:\r
694 self.SetPeiDepex(PeiDepexList)\r
695\r
696 ## GenDepexes\r
697 #\r
698 # Gen Depex of Inf\r
699 #\r
700 # @param ContainerFile: The Inf file full path\r
701 #\r
702 def _GenDepexes(self):\r
703 Logger.Debug(2, "Generate %s ..." % DT.TAB_DEPEX)\r
704\r
705 PEI_LIST = [DT.SUP_MODULE_PEIM]\r
706 SMM_LIST = [DT.SUP_MODULE_DXE_SMM_DRIVER]\r
707 DXE_LIST = [DT.SUP_MODULE_DXE_DRIVER, DT.SUP_MODULE_DXE_SAL_DRIVER,\r
708 DT.SUP_MODULE_DXE_RUNTIME_DRIVER]\r
709\r
710 IsLibraryClass = self.GetIsLibrary()\r
711 #\r
712 # Get all Depexes\r
713 #\r
714 DepexData = self.Parser.InfDepexSection.GetDepex()\r
715 SmmDepexList = []\r
716 DxeDepexList = []\r
717 PeiDepexList = []\r
718 for Depex in DepexData:\r
719 ModuleType = Depex.GetModuleType()\r
720 ModuleTypeList = []\r
721 if IsLibraryClass:\r
421ccda3
HC
722 if self.GetModuleType() == 'BASE' and not ModuleType:\r
723 Logger.Error("\nMkPkg", PARSER_ERROR,\r
724 ST.ERR_INF_PARSER_DEPEX_SECTION_INVALID_FOR_BASE_LIBRARY_CLASS,\r
725 self.GetFullPath(), RaiseError=True)\r
726 if self.GetModuleType() != 'BASE' and not self.GetIsLibraryModList():\r
4234283c
LG
727 Logger.Error("\nMkPkg", PARSER_ERROR, ST.ERR_INF_PARSER_DEPEX_SECTION_INVALID_FOR_LIBRARY_CLASS,\r
728 self.GetFullPath(), RaiseError=True)\r
421ccda3 729 if self.GetModuleType() != 'BASE' and ModuleType and ModuleType not in self.GetIsLibraryModList():\r
4234283c
LG
730 Logger.Error("\nMkPkg", PARSER_ERROR, ST.ERR_INF_PARSER_DEPEX_SECTION_NOT_DETERMINED,\r
731 self.GetFullPath(), RaiseError=True)\r
732 if ModuleType:\r
733 ModuleTypeList = [ModuleType]\r
734 else:\r
735 for ModuleTypeInList in self.GetIsLibraryModList():\r
736 if ModuleTypeInList in DT.VALID_DEPEX_MODULE_TYPE_LIST:\r
737 ModuleTypeList.append(ModuleTypeInList)\r
738 if not ModuleTypeList:\r
739 Logger.Error("\nMkPkg", PARSER_ERROR, ST.ERR_INF_PARSER_DEPEX_SECTION_NOT_DETERMINED,\r
740 self.GetFullPath(), RaiseError=True)\r
741 else:\r
742 if not ModuleType:\r
743 ModuleType = self.ModuleType\r
744 if ModuleType not in DT.VALID_DEPEX_MODULE_TYPE_LIST:\r
745 Logger.Error("\nMkPkg", PARSER_ERROR,\r
746 ST.ERR_INF_PARSER_DEPEX_SECTION_MODULE_TYPE_ERROR % (ModuleType),\r
747 self.GetFullPath(), RaiseError=True)\r
748 if ModuleType != self.ModuleType:\r
749 Logger.Error("\nMkPkg", PARSER_ERROR, ST.ERR_INF_PARSER_DEPEX_SECTION_NOT_DETERMINED,\r
750 self.GetFullPath(), RaiseError=True)\r
751 ModuleTypeList = [ModuleType]\r
752 for ModuleType in ModuleTypeList:\r
753 DepexIns = DepexObject()\r
754 DepexIns.SetDepex(Depex.GetDepexContent())\r
755 if IsLibraryClass:\r
756 DepexIns.SetModuleType(ModuleType)\r
757 else:\r
758 if Depex.GetModuleType():\r
759 DepexIns.SetModuleType(Depex.GetModuleType())\r
760 DepexIns.SetSupArchList(ConvertArchList([Depex.GetSupArch()]))\r
761 DepexIns.SetFeatureFlag(Depex.GetFeatureFlagExp())\r
762 if Depex.HelpString:\r
763 HelpIns = CommonObject.TextObject()\r
421ccda3
HC
764 if self.UniFileClassObject:\r
765 HelpIns.SetLang(DT.TAB_LANGUAGE_EN_X)\r
4234283c
LG
766 HelpIns.SetString(GetHelpStringByRemoveHashKey(Depex.HelpString))\r
767 DepexIns.SetHelpText(HelpIns)\r
768\r
769 if ModuleType in SMM_LIST:\r
770 SmmDepexList.append(DepexIns)\r
771 if ModuleType in DXE_LIST:\r
772 DxeDepexList.append(DepexIns)\r
773 if ModuleType in PEI_LIST:\r
774 PeiDepexList.append(DepexIns)\r
775 if ModuleType == DT.SUP_MODULE_UEFI_DRIVER:\r
776 if IsLibraryClass:\r
777 DxeDepexList.append(DepexIns)\r
778 else:\r
779 Logger.Error("\nMkPkg", PARSER_ERROR, ST.ERR_INF_PARSER_DEPEX_SECTION_INVALID_FOR_DRIVER,\r
780 self.GetFullPath(), RaiseError=True)\r
781\r
782 #End of for ModuleType in ModuleTypeList\r
783 self._GenDepexesList(SmmDepexList, DxeDepexList, PeiDepexList)\r
784 #End of for Depex in DepexData\r
785\r
786 ## GenBinaries\r
787 #\r
788 # Gen Binary of Inf, must be called after Pcd/Library is generated\r
789 # <FileType>|<Filename>|<Target>[|<TokenSpaceGuidCName>.<PcdCName>]\r
790 #\r
791 # @param ContainerFile: The Inf file full path\r
792 #\r
793 def _GenBinaries(self):\r
794 Logger.Debug(2, "Generate %s ..." % DT.TAB_BINARIES)\r
795 BinariesDict = {}\r
796\r
797 #\r
798 # Get all Binary data\r
799 #\r
800 BinaryObj = self.Parser.InfBinariesSection.GetBinary()\r
801\r
802 BinaryData = BinaryObj.keys()\r
4234283c
LG
803\r
804 #\r
805 # If the INF file does not contain a [Sources] section, and the INF file does contain a [Binaries] section, \r
806 # then the ModuleSurfaceArea.BinaryModule attribute must be set to true. Otherwise, do not use the attribute\r
807 #\r
808 if BinaryObj and not self.Parser.InfSourcesSection.GetSources():\r
809 self.BinaryModule = True\r
810 else:\r
811 self.BinaryModule = False\r
812\r
813 BinaryFileObjectList = []\r
814 AsBuildLibraryClassList = []\r
815 AsBuildBuildOptionList = []\r
816 AsBuildIns = AsBuiltObject()\r
817 #\r
818 # Library AsBuild Info\r
819 #\r
820 for LibItem in self.Parser.InfLibraryClassSection.GetLibraryClasses():\r
821 AsBuildLibIns = AsBuildLibraryClassObject()\r
822 AsBuildLibIns.SetLibGuid(LibItem.GetFileGuid())\r
823 AsBuildLibIns.SetLibVersion(LibItem.GetVersion())\r
421ccda3 824 AsBuildLibIns.SetSupArchList(LibItem.GetSupArchList())\r
4234283c
LG
825 AsBuildLibraryClassList.append(AsBuildLibIns)\r
826 AsBuildIns.SetLibraryInstancesList(AsBuildLibraryClassList)\r
827\r
828 #\r
829 # BuildOption AsBuild Info\r
830 # \r
831 for BuildOptionItem in self.Parser.InfBuildOptionSection.GetBuildOptions():\r
421ccda3 832 AsBuildBuildOptionList.append(BuildOptionItem)\r
4234283c
LG
833 AsBuildIns.SetBuildFlagsList(AsBuildBuildOptionList)\r
834\r
835 #\r
836 # PatchPcd and PcdEx\r
837 #\r
838 AsBuildIns = self._GenAsBuiltPcds(self.Parser.InfPcdSection.GetPcds(), AsBuildIns)\r
839\r
421ccda3
HC
840 #\r
841 # Parse the DEC file that contains the GUID value of the GUID CName which is used by\r
842 # SUBTYPE_GUID type binary file in the Binaries section in the INF file\r
843 #\r
844 DecObjList = []\r
845 if not self.PackagePath:\r
846 WorkSpace = os.path.normpath(self.WorkSpace)\r
847 TempPath = ModulePath = os.path.normpath(self.ModulePath)\r
848 while ModulePath:\r
849 TempPath = ModulePath\r
850 ModulePath = os.path.dirname(ModulePath)\r
851 PackageName = TempPath\r
852 DecFilePath = os.path.normpath(os.path.join(WorkSpace, PackageName)) \r
853 if DecFilePath:\r
854 for File in os.listdir(DecFilePath):\r
855 if File.upper().endswith('.DEC'):\r
856 DecFileFullPath = os.path.normpath(os.path.join(DecFilePath, File))\r
857 DecObjList.append(DecPomAlignment(DecFileFullPath, self.WorkSpace))\r
858 \r
859 \r
4234283c
LG
860 BinariesDict, AsBuildIns, BinaryFileObjectList = GenBinaryData(BinaryData, BinaryObj,\r
861 BinariesDict,\r
862 AsBuildIns,\r
863 BinaryFileObjectList,\r
864 self.GetSupArchList(),\r
421ccda3
HC
865 self.BinaryModule,\r
866 DecObjList)\r
867 \r
4234283c
LG
868 BinariesDict2 = {}\r
869 for Key in BinariesDict:\r
870 ValueList = BinariesDict[Key]\r
871 if len(ValueList) > 1:\r
872 BinariesDict2[Key] = ValueList\r
873 else:\r
874 #\r
875 # if there is no TagName, ToolCode, HelpStr, \r
876 # then do not need to put them into userextension\r
877 #\r
878 (Target, Family, TagName, HelpStr) = ValueList[0]\r
879 if not (Target or Family or TagName or HelpStr):\r
880 continue\r
881 else:\r
882 BinariesDict2[Key] = ValueList\r
883\r
884 self.SetBinaryFileList(self.GetBinaryFileList() + BinaryFileObjectList)\r
885\r
886 if BinariesDict2:\r
887 UserExtension = CommonObject.UserExtensionObject()\r
888 UserExtension.SetBinariesDict(BinariesDict2)\r
889 UserExtension.SetIdentifier('BinaryFileModifiers')\r
890 UserExtension.SetUserID('EDK2')\r
891 self.SetUserExtensionList(self.GetUserExtensionList() + [UserExtension])\r
892\r
893 ## GenAsBuiltPcds\r
894 #\r
895 #\r
896 def _GenAsBuiltPcds(self, PcdList, AsBuildIns):\r
897 AsBuildPatchPcdList = []\r
898 AsBuildPcdExList = []\r
899 #\r
900 # Pcd AsBuild Info\r
901 #\r
902 for PcdItem in PcdList:\r
903 if PcdItem[0].upper() == DT.TAB_INF_PATCH_PCD.upper():\r
904 PcdItemObj = PcdItem[1]\r
905 Pcd = CommonObject.PcdObject()\r
906 Pcd.SetCName(PcdItemObj.GetCName())\r
907 Pcd.SetTokenSpaceGuidCName(PcdItemObj.GetTokenSpaceGuidCName())\r
908 if PcdItemObj.GetTokenSpaceGuidValue() == '' and self.BinaryModule:\r
909 Logger.Error("\nMkPkg",\r
910 PARSER_ERROR,\r
911 ST.ERR_ASBUILD_PCD_TOKENSPACE_GUID_VALUE_MISS % \\r
912 (PcdItemObj.GetTokenSpaceGuidCName()),\r
913 self.GetFullPath(), RaiseError=True)\r
914 else:\r
915 Pcd.SetTokenSpaceGuidValue(PcdItemObj.GetTokenSpaceGuidValue())\r
916 if (PcdItemObj.GetToken() == '' or PcdItemObj.GetDatumType() == '') and self.BinaryModule:\r
917 Logger.Error("\nMkPkg",\r
918 PARSER_ERROR,\r
919 ST.ERR_ASBUILD_PCD_DECLARITION_MISS % \\r
920 (PcdItemObj.GetTokenSpaceGuidCName() + '.' + PcdItemObj.GetCName()),\r
921 self.GetFullPath(), RaiseError=True)\r
922 Pcd.SetToken(PcdItemObj.GetToken())\r
923 Pcd.SetDatumType(PcdItemObj.GetDatumType())\r
924 Pcd.SetMaxDatumSize(PcdItemObj.GetMaxDatumSize())\r
925 Pcd.SetDefaultValue(PcdItemObj.GetDefaultValue())\r
926 Pcd.SetOffset(PcdItemObj.GetOffset())\r
927 Pcd.SetItemType(PcdItem[0])\r
928 Pcd.SetFeatureFlag(PcdItemObj.GetFeatureFlagExp())\r
929 Pcd.SetSupArchList(ConvertArchList(PcdItemObj.GetSupportArchList()))\r
421ccda3
HC
930 Pcd.SetValidUsage(PcdItemObj.GetValidUsage())\r
931 for CommentItem in PcdItemObj.GetHelpStringList():\r
932 HelpTextObj = CommonObject.TextObject()\r
933 if self.UniFileClassObject:\r
934 HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
935 HelpTextObj.SetString(CommentItem.GetHelpStringItem())\r
936 Pcd.SetHelpTextList(Pcd.GetHelpTextList() + [HelpTextObj])\r
4234283c 937 AsBuildPatchPcdList.append(Pcd)\r
1f0a062f 938 elif PcdItem[0].upper() == DT.TAB_INF_PCD_EX.upper():\r
4234283c
LG
939 PcdItemObj = PcdItem[1]\r
940 Pcd = CommonObject.PcdObject()\r
941 Pcd.SetTokenSpaceGuidValue(PcdItemObj.GetTokenSpaceGuidValue())\r
942 Pcd.SetToken(PcdItemObj.GetToken())\r
943 Pcd.SetDatumType(PcdItemObj.GetDatumType())\r
944 Pcd.SetMaxDatumSize(PcdItemObj.GetMaxDatumSize())\r
945 Pcd.SetDefaultValue(PcdItemObj.GetDefaultValue())\r
946 Pcd.SetItemType(PcdItem[0])\r
947 Pcd.SetFeatureFlag(PcdItemObj.GetFeatureFlagExp())\r
948 Pcd.SetSupArchList(ConvertArchList(PcdItemObj.GetSupportArchList()))\r
421ccda3
HC
949 Pcd.SetValidUsage(PcdItemObj.GetValidUsage())\r
950 for CommentItem in PcdItemObj.GetHelpStringList():\r
951 HelpTextObj = CommonObject.TextObject()\r
952 if self.UniFileClassObject:\r
953 HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
954 HelpTextObj.SetString(CommentItem.GetHelpStringItem())\r
955 Pcd.SetHelpTextList(Pcd.GetHelpTextList() + [HelpTextObj])\r
4234283c
LG
956 AsBuildPcdExList.append(Pcd)\r
957 AsBuildIns.SetPatchPcdList(AsBuildPatchPcdList)\r
958 AsBuildIns.SetPcdExList(AsBuildPcdExList)\r
959\r
960 return AsBuildIns\r
961\r
962 ## GenGuidProtocolPpis\r
963 #\r
964 # Gen Guids/Protocol/Ppis of INF\r
965 # <CName>=<GuidValue>\r
966 #\r
967 def _GenGuidProtocolPpis(self, Type):\r
968 Logger.Debug(2, "Generate %s ..." % Type)\r
969 #\r
970 # Get all Guid/Protocol/Ppis data\r
971 #\r
972 GuidObj = self.Parser.InfGuidSection.GetGuid()\r
973 ProtocolObj = self.Parser.InfProtocolSection.GetProtocol()\r
974 PpisObj = self.Parser.InfPpiSection.GetPpi()\r
975\r
976 GuidProtocolPpiList = []\r
977\r
978 if Type == DT.TAB_GUIDS:\r
979 GuidData = GuidObj.keys()\r
980 for Item in GuidData:\r
981 CommentList = Item.GetCommentList()\r
982 #\r
983 # Depend on CommentList content\r
984 # generate muti-guid-obj\r
985 #\r
986 if CommentList:\r
987 for GuidComentItem in CommentList:\r
988 ListObject = CommonObject.GuidObject()\r
989 ListObject.SetGuidTypeList([GuidComentItem.GetGuidTypeItem()])\r
990 ListObject.SetVariableName(GuidComentItem.GetVariableNameItem())\r
991 ListObject.SetUsage(GuidComentItem.GetUsageItem())\r
992 ListObject.SetName(Item.GetName())\r
993 ListObject.SetCName(Item.GetName())\r
994 ListObject.SetSupArchList(ConvertArchList(Item.GetSupArchList()))\r
995 ListObject.SetFeatureFlag(Item.GetFeatureFlagExp())\r
996 HelpString = GuidComentItem.GetHelpStringItem()\r
421ccda3
HC
997 if HelpString.strip():\r
998 HelpTxtTailObj = CommonObject.TextObject()\r
999 if self.UniFileClassObject:\r
1000 HelpTxtTailObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
1001 HelpTxtTailObj.SetString(HelpString)\r
1002 ListObject.SetHelpTextList([HelpTxtTailObj])\r
1003 \r
4234283c
LG
1004 GuidProtocolPpiList.append(ListObject)\r
1005 elif Type == DT.TAB_PROTOCOLS:\r
1006 ProtocolData = ProtocolObj.keys()\r
1007 for Item in ProtocolData:\r
1008 CommentList = Item.GetCommentList()\r
1009 for CommentItem in CommentList:\r
1010 ListObject = CommonObject.ProtocolObject()\r
1011 ListObject.SetCName(Item.GetName())\r
1012 ListObject.SetSupArchList(ConvertArchList(Item.GetSupArchList()))\r
1013 ListObject.SetFeatureFlag(Item.GetFeatureFlagExp())\r
1014 ListObject.SetNotify(CommentItem.GetNotify())\r
1015 ListObject.SetUsage(CommentItem.GetUsageItem())\r
4234283c 1016 HelpString = CommentItem.GetHelpStringItem()\r
421ccda3
HC
1017 if HelpString.strip():\r
1018 HelpTxtObj = CommonObject.TextObject()\r
1019 if self.UniFileClassObject:\r
1020 HelpTxtObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
1021 HelpTxtObj.SetString(HelpString)\r
1022 ListObject.SetHelpTextList([HelpTxtObj])\r
4234283c
LG
1023 GuidProtocolPpiList.append(ListObject)\r
1024 elif Type == DT.TAB_PPIS:\r
1025 PpiData = PpisObj.keys()\r
1026 for Item in PpiData:\r
1027 CommentList = Item.GetCommentList()\r
1028 for CommentItem in CommentList:\r
1029 ListObject = CommonObject.PpiObject()\r
1030 ListObject.SetCName(Item.GetName())\r
1031 ListObject.SetSupArchList(ConvertArchList(Item.GetSupArchList()))\r
1032 ListObject.SetFeatureFlag(Item.GetFeatureFlagExp())\r
1033 ListObject.SetNotify(CommentItem.GetNotify())\r
1034 ListObject.SetUsage(CommentItem.GetUsage())\r
4234283c 1035 HelpString = CommentItem.GetHelpStringItem()\r
421ccda3
HC
1036 if HelpString.strip():\r
1037 HelpTextObj = CommonObject.TextObject()\r
1038 if self.UniFileClassObject:\r
1039 HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
1040 HelpTextObj.SetString(HelpString)\r
1041 ListObject.SetHelpTextList([HelpTextObj])\r
4234283c
LG
1042 GuidProtocolPpiList.append(ListObject)\r
1043\r
1044 if Type == DT.TAB_GUIDS:\r
1045 self.SetGuidList(self.GetGuidList() + GuidProtocolPpiList)\r
1046 elif Type == DT.TAB_PROTOCOLS:\r
1047 self.SetProtocolList(self.GetProtocolList() + GuidProtocolPpiList)\r
1048 elif Type == DT.TAB_PPIS:\r
1049 self.SetPpiList(self.GetPpiList() + GuidProtocolPpiList)\r
1050\r
1051 ## GenMiscFiles\r
1052 #\r
1053 # Gen MiscellaneousFiles of Inf\r
1054 #\r
1055 # @param ContainerFile: The Inf file full path\r
1056 #\r
421ccda3
HC
1057 def _GenMiscFiles(self, Content):\r
1058 MiscFileObj = CommonObject.MiscFileObject()\r
1059 for Line in Content.splitlines():\r
1060 FileName = ''\r
1061 if '#' in Line:\r
1062 FileName = Line[:Line.find('#')]\r
1063 else:\r
1064 FileName = Line\r
1065 if FileName:\r
1066 if IsValidPath(FileName, GlobalData.gINF_MODULE_DIR):\r
1067 FileObj = CommonObject.FileObject()\r
1068 FileObj.SetURI(FileName)\r
1069 MiscFileObj.SetFileList(MiscFileObj.GetFileList()+[FileObj])\r
1070 else:\r
1071 Logger.Error("InfParser", \r
1072 FORMAT_INVALID,\r
1073 ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(Line),\r
1074 File=GlobalData.gINF_MODULE_NAME,\r
1075 ExtraData=Line) \r
1076 self.SetMiscFileList(self.GetMiscFileList()+[MiscFileObj]) \r
1077 \r