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