]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/PomAdapter/InfPomAlignment.py
CorebootPayloadPkg: Conditionally add DebugAgentLib for DXE drivers
[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
421ccda3 4# Copyright (c) 2011 - 2014, 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
4234283c
LG
23from Library.String import FORMAT_INVALID\r
24from Library.String import PARSER_ERROR\r
25from Library.String import NormPath\r
26from Library.String import GetSplitValueList\r
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
170 if DefineObj.GetUefiSpecificationVersion() != None:\r
171 __UefiVersion = DefineObj.GetUefiSpecificationVersion().GetValue()\r
172 __UefiVersion = ConvertVersionToDecimal(__UefiVersion)\r
173 self.SetUefiSpecificationVersion(str(__UefiVersion))\r
174 if DefineObj.GetPiSpecificationVersion() != None:\r
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
189 if DefineObj.GetModuleType() == None:\r
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
208 if DefineObj.GetBaseName() == None:\r
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
4234283c
LG
217 if DefineObj.GetInfVersion() == None:\r
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
222 if DefineObj.GetFileGuid() == None:\r
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
227 if DefineObj.GetVersionString() == None:\r
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
259 if DefineObj.GetPcdIsDriver() != None:\r
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
489 LibClassObj = self.Parser.InfLibraryClassSection.LibraryClasses\r
490 Keys = LibClassObj.keys()\r
4234283c
LG
491 for Key in Keys:\r
492 LibraryClassData = LibClassObj[Key]\r
493 for Item in LibraryClassData:\r
494 LibraryClass = CommonObject.LibraryClassObject()\r
495 LibraryClass.SetUsage(DT.USAGE_ITEM_CONSUMES)\r
496 LibraryClass.SetLibraryClass(Item.GetLibName())\r
497 LibraryClass.SetRecommendedInstance(None)\r
498 LibraryClass.SetFeatureFlag(Item.GetFeatureFlagExp())\r
499 LibraryClass.SetSupArchList(ConvertArchList(Item.GetSupArchList()))\r
500 LibraryClass.SetSupModuleList(Item.GetSupModuleList())\r
501 HelpStringObj = Item.GetHelpString()\r
4234283c
LG
502 if HelpStringObj != None:\r
503 CommentString = GetHelpStringByRemoveHashKey(HelpStringObj.HeaderComments +\r
504 HelpStringObj.TailComments)\r
505 HelpTextHeaderObj = CommonObject.TextObject()\r
421ccda3
HC
506 if self.UniFileClassObject:\r
507 HelpTextHeaderObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
4234283c
LG
508 HelpTextHeaderObj.SetString(CommentString)\r
509 LibraryClass.SetHelpTextList([HelpTextHeaderObj])\r
4234283c
LG
510 self.SetLibraryClassList(self.GetLibraryClassList() + [LibraryClass])\r
511\r
512 ## GenPackages\r
513 #\r
514 # Gen Packages of Inf\r
515 #\r
516 #\r
517 # @param ContainerFile: The Inf file full path\r
518 #\r
519 def _GenPackages(self, Skip):\r
520 Logger.Debug(2, "Generate %s ..." % DT.TAB_PACKAGES)\r
521 #\r
522 # Get all Packages\r
523 #\r
524 PackageObj = self.Parser.InfPackageSection.Packages\r
4234283c
LG
525 #\r
526 # Go through each arch\r
527 #\r
528 for PackageItemObj in PackageObj:\r
529 #\r
530 # Need package information for dependency check usage\r
531 #\r
532 PackageDependency = PackageDependencyObject()\r
533 PackageDependency.SetPackageFilePath(NormPath(PackageItemObj.GetPackageName()))\r
534 PackageDependency.SetSupArchList(ConvertArchList(PackageItemObj.GetSupArchList()))\r
535 PackageDependency.SetFeatureFlag(PackageItemObj.GetFeatureFlagExp())\r
536\r
fb0f8067 537 PkgInfo = GetPkgInfoFromDec(mws.join(self.WorkSpace, NormPath(PackageItemObj.GetPackageName())))\r
4234283c
LG
538 if PkgInfo[1] and PkgInfo[2]:\r
539 PackageDependency.SetGuid(PkgInfo[1])\r
540 PackageDependency.SetVersion(PkgInfo[2])\r
541 elif Skip:\r
542 continue\r
543 else:\r
544 Logger.Error("\nUPT", PARSER_ERROR,\r
545 ST.ERR_INF_GET_PKG_DEPENDENCY_FAIL % PackageItemObj.GetPackageName(), File=self.FullPath)\r
546\r
547 PackageDependencyList = self.GetPackageDependencyList()\r
548 PackageDependencyList.append(PackageDependency)\r
549 self.SetPackageDependencyList(PackageDependencyList)\r
550\r
551 ## GenPcds\r
552 #\r
553 # Gen Pcds of Inf\r
554 # <TokenSpaceGuidCName>.<PcdCName>[|<Value> [|<FFE>]]\r
555 #\r
556 # @param ContainerFile: The Inf file full path\r
557 #\r
558 def _GenPcds(self):\r
559 if not GlobalData.gIS_BINARY_INF:\r
560 Logger.Debug(2, "Generate %s ..." % DT.TAB_PCDS)\r
4234283c
LG
561 #\r
562 # Get all Pcds\r
563 #\r
564 PcdObj = self.Parser.InfPcdSection.Pcds\r
565 KeysList = PcdObj.keys()\r
4234283c
LG
566 #\r
567 # Go through each arch\r
568 #\r
569 for (PcdType, PcdKey) in KeysList:\r
570 PcdData = PcdObj[PcdType, PcdKey]\r
571 for PcdItemObj in PcdData:\r
572 CommentList = PcdItemObj.GetHelpStringList()\r
573 if CommentList:\r
574 for CommentItem in CommentList:\r
575 Pcd = CommonObject.PcdObject()\r
576 Pcd.SetCName(PcdItemObj.GetCName())\r
577 Pcd.SetTokenSpaceGuidCName(PcdItemObj.GetTokenSpaceGuidCName())\r
578 Pcd.SetDefaultValue(PcdItemObj.GetDefaultValue())\r
579 Pcd.SetItemType(PcdType)\r
580 Pcd.SetValidUsage(CommentItem.GetUsageItem())\r
581 Pcd.SetFeatureFlag(PcdItemObj.GetFeatureFlagExp())\r
582 Pcd.SetSupArchList(ConvertArchList(PcdItemObj.GetSupportArchList()))\r
583 HelpTextObj = CommonObject.TextObject()\r
421ccda3
HC
584 if self.UniFileClassObject:\r
585 HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
4234283c
LG
586 HelpTextObj.SetString(CommentItem.GetHelpStringItem())\r
587 Pcd.SetHelpTextList([HelpTextObj])\r
588 PcdList = self.GetPcdList()\r
589 PcdList.append(Pcd)\r
590 self.SetPcdList(PcdList)\r
591\r
592 ## GenSources\r
593 #\r
594 # Gen Sources of Inf\r
595 # <Filename>[|<Family>[|<TagName>[|<ToolCode>[|<PcdFeatureFlag>]]]]\r
596 #\r
597 # @param ContainerFile: The Inf file full path\r
598 #\r
599 def _GenSources(self):\r
600 Logger.Debug(2, "Generate %s ..." % DT.TAB_SOURCES)\r
601\r
602 #\r
603 # Get all SourceFiles\r
604 #\r
605 SourceObj = self.Parser.InfSourcesSection.Sources\r
606 DataList = SourceObj.keys()\r
607 #\r
608 # Go through each arch\r
609 #\r
610 SourceList = []\r
611 for Key in DataList:\r
612 SourceData = SourceObj[Key]\r
613 for Item in SourceData:\r
614 SourceFile = Item.GetSourceFileName()\r
615 Family = Item.GetFamily()\r
616 FeatureFlag = Item.GetFeatureFlagExp()\r
617 SupArchList = ConvertArchList(Item.GetSupArchList())\r
618 SupArchList.sort()\r
619 Source = SourceFileObject()\r
620 Source.SetSourceFile(SourceFile)\r
621 Source.SetFamily(Family)\r
622 Source.SetFeatureFlag(FeatureFlag)\r
623 Source.SetSupArchList(SupArchList)\r
624 SourceList.append(Source)\r
625\r
626 self.SetSourceFileList(self.GetSourceFileList() + SourceList)\r
627\r
628\r
629 ## GenUserExtensions\r
630 #\r
631 # Gen UserExtensions of Inf\r
632 #\r
633 def _GenUserExtensions(self):\r
634 #\r
635 # UserExtensions\r
636 #\r
637 UserExtensionObj = self.Parser.InfUserExtensionSection.UserExtension\r
638 Keys = UserExtensionObj.keys()\r
639\r
640 for Key in Keys:\r
641 UserExtensionData = UserExtensionObj[Key]\r
642 for UserExtensionDataObj in UserExtensionData:\r
643 UserExtension = CommonObject.UserExtensionObject()\r
644 UserId = UserExtensionDataObj.GetUserId()\r
645 if UserId.startswith('"') and UserId.endswith('"'):\r
646 UserId = UserId[1:-1] \r
647 UserExtension.SetUserID(UserId)\r
648 Identifier = UserExtensionDataObj.GetIdString()\r
649 if Identifier.startswith('"') and Identifier.endswith('"'):\r
650 Identifier = Identifier[1:-1]\r
421ccda3
HC
651 #\r
652 # Generate miscellaneous files on INF file\r
653 #\r
654 if UserId == 'TianoCore' and Identifier == 'ExtraFiles':\r
655 self._GenMiscFiles(UserExtensionDataObj.GetContent())\r
4234283c
LG
656 UserExtension.SetIdentifier(Identifier)\r
657 UserExtension.SetStatement(UserExtensionDataObj.GetContent())\r
658 UserExtension.SetSupArchList(ConvertArchList(UserExtensionDataObj.GetSupArchList()))\r
659 self.SetUserExtensionList(self.GetUserExtensionList() + [UserExtension])\r
421ccda3
HC
660 \r
661 #\r
662 # Gen UserExtensions of TianoCore."BinaryHeader"\r
663 #\r
664 \r
665 #Get Binary header from INF file\r
666 BinaryAbstractList = self.BinaryHeaderAbstractList\r
667 BinaryDescriptionList = self.BinaryHeaderDescriptionList\r
668 BinaryCopyrightList = self.BinaryHeaderCopyrightList\r
669 BinaryLicenseList = self.BinaryHeaderLicenseList\r
670 #Get Binary header from UNI file\r
671 # Initialize UniStrDict, the top keys are language codes\r
672 UniStrDict = {}\r
673 if self.UniFileClassObject:\r
674 UniStrDict = self.UniFileClassObject.OrderedStringList\r
675 for Lang in UniStrDict:\r
676 for StringDefClassObject in UniStrDict[Lang]:\r
677 Lang = GetLanguageCode1766(Lang)\r
678 if StringDefClassObject.StringName == DT.TAB_INF_BINARY_ABSTRACT:\r
679 BinaryAbstractList.append((Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue)))\r
680 if StringDefClassObject.StringName == DT.TAB_INF_BINARY_DESCRIPTION:\r
681 BinaryDescriptionList.append((Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue)))\r
682 if BinaryAbstractList or BinaryDescriptionList or BinaryCopyrightList or BinaryLicenseList:\r
683 BinaryUserExtension = CommonObject.UserExtensionObject()\r
684 BinaryUserExtension.SetBinaryAbstract(BinaryAbstractList)\r
685 BinaryUserExtension.SetBinaryDescription(BinaryDescriptionList)\r
686 BinaryUserExtension.SetBinaryCopyright(BinaryCopyrightList)\r
687 BinaryUserExtension.SetBinaryLicense(BinaryLicenseList)\r
688 BinaryUserExtension.SetIdentifier(DT.TAB_BINARY_HEADER_IDENTIFIER)\r
689 BinaryUserExtension.SetUserID(DT.TAB_BINARY_HEADER_USERID)\r
690 self.SetUserExtensionList(self.GetUserExtensionList() + [BinaryUserExtension])\r
691 \r
4234283c
LG
692 def _GenDepexesList(self, SmmDepexList, DxeDepexList, PeiDepexList):\r
693 if SmmDepexList:\r
694 self.SetSmmDepex(SmmDepexList)\r
695 if DxeDepexList:\r
696 self.SetDxeDepex(DxeDepexList)\r
697 if PeiDepexList:\r
698 self.SetPeiDepex(PeiDepexList)\r
699\r
700 ## GenDepexes\r
701 #\r
702 # Gen Depex of Inf\r
703 #\r
704 # @param ContainerFile: The Inf file full path\r
705 #\r
706 def _GenDepexes(self):\r
707 Logger.Debug(2, "Generate %s ..." % DT.TAB_DEPEX)\r
708\r
709 PEI_LIST = [DT.SUP_MODULE_PEIM]\r
710 SMM_LIST = [DT.SUP_MODULE_DXE_SMM_DRIVER]\r
711 DXE_LIST = [DT.SUP_MODULE_DXE_DRIVER, DT.SUP_MODULE_DXE_SAL_DRIVER,\r
712 DT.SUP_MODULE_DXE_RUNTIME_DRIVER]\r
713\r
714 IsLibraryClass = self.GetIsLibrary()\r
715 #\r
716 # Get all Depexes\r
717 #\r
718 DepexData = self.Parser.InfDepexSection.GetDepex()\r
719 SmmDepexList = []\r
720 DxeDepexList = []\r
721 PeiDepexList = []\r
722 for Depex in DepexData:\r
723 ModuleType = Depex.GetModuleType()\r
724 ModuleTypeList = []\r
725 if IsLibraryClass:\r
421ccda3
HC
726 if self.GetModuleType() == 'BASE' and not ModuleType:\r
727 Logger.Error("\nMkPkg", PARSER_ERROR,\r
728 ST.ERR_INF_PARSER_DEPEX_SECTION_INVALID_FOR_BASE_LIBRARY_CLASS,\r
729 self.GetFullPath(), RaiseError=True)\r
730 if self.GetModuleType() != 'BASE' and not self.GetIsLibraryModList():\r
4234283c
LG
731 Logger.Error("\nMkPkg", PARSER_ERROR, ST.ERR_INF_PARSER_DEPEX_SECTION_INVALID_FOR_LIBRARY_CLASS,\r
732 self.GetFullPath(), RaiseError=True)\r
421ccda3 733 if self.GetModuleType() != 'BASE' and ModuleType and ModuleType not in self.GetIsLibraryModList():\r
4234283c
LG
734 Logger.Error("\nMkPkg", PARSER_ERROR, ST.ERR_INF_PARSER_DEPEX_SECTION_NOT_DETERMINED,\r
735 self.GetFullPath(), RaiseError=True)\r
736 if ModuleType:\r
737 ModuleTypeList = [ModuleType]\r
738 else:\r
739 for ModuleTypeInList in self.GetIsLibraryModList():\r
740 if ModuleTypeInList in DT.VALID_DEPEX_MODULE_TYPE_LIST:\r
741 ModuleTypeList.append(ModuleTypeInList)\r
742 if not ModuleTypeList:\r
743 Logger.Error("\nMkPkg", PARSER_ERROR, ST.ERR_INF_PARSER_DEPEX_SECTION_NOT_DETERMINED,\r
744 self.GetFullPath(), RaiseError=True)\r
745 else:\r
746 if not ModuleType:\r
747 ModuleType = self.ModuleType\r
748 if ModuleType not in DT.VALID_DEPEX_MODULE_TYPE_LIST:\r
749 Logger.Error("\nMkPkg", PARSER_ERROR,\r
750 ST.ERR_INF_PARSER_DEPEX_SECTION_MODULE_TYPE_ERROR % (ModuleType),\r
751 self.GetFullPath(), RaiseError=True)\r
752 if ModuleType != self.ModuleType:\r
753 Logger.Error("\nMkPkg", PARSER_ERROR, ST.ERR_INF_PARSER_DEPEX_SECTION_NOT_DETERMINED,\r
754 self.GetFullPath(), RaiseError=True)\r
755 ModuleTypeList = [ModuleType]\r
756 for ModuleType in ModuleTypeList:\r
757 DepexIns = DepexObject()\r
758 DepexIns.SetDepex(Depex.GetDepexContent())\r
759 if IsLibraryClass:\r
760 DepexIns.SetModuleType(ModuleType)\r
761 else:\r
762 if Depex.GetModuleType():\r
763 DepexIns.SetModuleType(Depex.GetModuleType())\r
764 DepexIns.SetSupArchList(ConvertArchList([Depex.GetSupArch()]))\r
765 DepexIns.SetFeatureFlag(Depex.GetFeatureFlagExp())\r
766 if Depex.HelpString:\r
767 HelpIns = CommonObject.TextObject()\r
421ccda3
HC
768 if self.UniFileClassObject:\r
769 HelpIns.SetLang(DT.TAB_LANGUAGE_EN_X)\r
4234283c
LG
770 HelpIns.SetString(GetHelpStringByRemoveHashKey(Depex.HelpString))\r
771 DepexIns.SetHelpText(HelpIns)\r
772\r
773 if ModuleType in SMM_LIST:\r
774 SmmDepexList.append(DepexIns)\r
775 if ModuleType in DXE_LIST:\r
776 DxeDepexList.append(DepexIns)\r
777 if ModuleType in PEI_LIST:\r
778 PeiDepexList.append(DepexIns)\r
779 if ModuleType == DT.SUP_MODULE_UEFI_DRIVER:\r
780 if IsLibraryClass:\r
781 DxeDepexList.append(DepexIns)\r
782 else:\r
783 Logger.Error("\nMkPkg", PARSER_ERROR, ST.ERR_INF_PARSER_DEPEX_SECTION_INVALID_FOR_DRIVER,\r
784 self.GetFullPath(), RaiseError=True)\r
785\r
786 #End of for ModuleType in ModuleTypeList\r
787 self._GenDepexesList(SmmDepexList, DxeDepexList, PeiDepexList)\r
788 #End of for Depex in DepexData\r
789\r
790 ## GenBinaries\r
791 #\r
792 # Gen Binary of Inf, must be called after Pcd/Library is generated\r
793 # <FileType>|<Filename>|<Target>[|<TokenSpaceGuidCName>.<PcdCName>]\r
794 #\r
795 # @param ContainerFile: The Inf file full path\r
796 #\r
797 def _GenBinaries(self):\r
798 Logger.Debug(2, "Generate %s ..." % DT.TAB_BINARIES)\r
799 BinariesDict = {}\r
800\r
801 #\r
802 # Get all Binary data\r
803 #\r
804 BinaryObj = self.Parser.InfBinariesSection.GetBinary()\r
805\r
806 BinaryData = BinaryObj.keys()\r
4234283c
LG
807\r
808 #\r
809 # If the INF file does not contain a [Sources] section, and the INF file does contain a [Binaries] section, \r
810 # then the ModuleSurfaceArea.BinaryModule attribute must be set to true. Otherwise, do not use the attribute\r
811 #\r
812 if BinaryObj and not self.Parser.InfSourcesSection.GetSources():\r
813 self.BinaryModule = True\r
814 else:\r
815 self.BinaryModule = False\r
816\r
817 BinaryFileObjectList = []\r
818 AsBuildLibraryClassList = []\r
819 AsBuildBuildOptionList = []\r
820 AsBuildIns = AsBuiltObject()\r
821 #\r
822 # Library AsBuild Info\r
823 #\r
824 for LibItem in self.Parser.InfLibraryClassSection.GetLibraryClasses():\r
825 AsBuildLibIns = AsBuildLibraryClassObject()\r
826 AsBuildLibIns.SetLibGuid(LibItem.GetFileGuid())\r
827 AsBuildLibIns.SetLibVersion(LibItem.GetVersion())\r
421ccda3 828 AsBuildLibIns.SetSupArchList(LibItem.GetSupArchList())\r
4234283c
LG
829 AsBuildLibraryClassList.append(AsBuildLibIns)\r
830 AsBuildIns.SetLibraryInstancesList(AsBuildLibraryClassList)\r
831\r
832 #\r
833 # BuildOption AsBuild Info\r
834 # \r
835 for BuildOptionItem in self.Parser.InfBuildOptionSection.GetBuildOptions():\r
421ccda3 836 AsBuildBuildOptionList.append(BuildOptionItem)\r
4234283c
LG
837 AsBuildIns.SetBuildFlagsList(AsBuildBuildOptionList)\r
838\r
839 #\r
840 # PatchPcd and PcdEx\r
841 #\r
842 AsBuildIns = self._GenAsBuiltPcds(self.Parser.InfPcdSection.GetPcds(), AsBuildIns)\r
843\r
421ccda3
HC
844 #\r
845 # Parse the DEC file that contains the GUID value of the GUID CName which is used by\r
846 # SUBTYPE_GUID type binary file in the Binaries section in the INF file\r
847 #\r
848 DecObjList = []\r
849 if not self.PackagePath:\r
850 WorkSpace = os.path.normpath(self.WorkSpace)\r
851 TempPath = ModulePath = os.path.normpath(self.ModulePath)\r
852 while ModulePath:\r
853 TempPath = ModulePath\r
854 ModulePath = os.path.dirname(ModulePath)\r
855 PackageName = TempPath\r
856 DecFilePath = os.path.normpath(os.path.join(WorkSpace, PackageName)) \r
857 if DecFilePath:\r
858 for File in os.listdir(DecFilePath):\r
859 if File.upper().endswith('.DEC'):\r
860 DecFileFullPath = os.path.normpath(os.path.join(DecFilePath, File))\r
861 DecObjList.append(DecPomAlignment(DecFileFullPath, self.WorkSpace))\r
862 \r
863 \r
4234283c
LG
864 BinariesDict, AsBuildIns, BinaryFileObjectList = GenBinaryData(BinaryData, BinaryObj,\r
865 BinariesDict,\r
866 AsBuildIns,\r
867 BinaryFileObjectList,\r
868 self.GetSupArchList(),\r
421ccda3
HC
869 self.BinaryModule,\r
870 DecObjList)\r
871 \r
4234283c
LG
872 BinariesDict2 = {}\r
873 for Key in BinariesDict:\r
874 ValueList = BinariesDict[Key]\r
875 if len(ValueList) > 1:\r
876 BinariesDict2[Key] = ValueList\r
877 else:\r
878 #\r
879 # if there is no TagName, ToolCode, HelpStr, \r
880 # then do not need to put them into userextension\r
881 #\r
882 (Target, Family, TagName, HelpStr) = ValueList[0]\r
883 if not (Target or Family or TagName or HelpStr):\r
884 continue\r
885 else:\r
886 BinariesDict2[Key] = ValueList\r
887\r
888 self.SetBinaryFileList(self.GetBinaryFileList() + BinaryFileObjectList)\r
889\r
890 if BinariesDict2:\r
891 UserExtension = CommonObject.UserExtensionObject()\r
892 UserExtension.SetBinariesDict(BinariesDict2)\r
893 UserExtension.SetIdentifier('BinaryFileModifiers')\r
894 UserExtension.SetUserID('EDK2')\r
895 self.SetUserExtensionList(self.GetUserExtensionList() + [UserExtension])\r
896\r
897 ## GenAsBuiltPcds\r
898 #\r
899 #\r
900 def _GenAsBuiltPcds(self, PcdList, AsBuildIns):\r
901 AsBuildPatchPcdList = []\r
902 AsBuildPcdExList = []\r
903 #\r
904 # Pcd AsBuild Info\r
905 #\r
906 for PcdItem in PcdList:\r
907 if PcdItem[0].upper() == DT.TAB_INF_PATCH_PCD.upper():\r
908 PcdItemObj = PcdItem[1]\r
909 Pcd = CommonObject.PcdObject()\r
910 Pcd.SetCName(PcdItemObj.GetCName())\r
911 Pcd.SetTokenSpaceGuidCName(PcdItemObj.GetTokenSpaceGuidCName())\r
912 if PcdItemObj.GetTokenSpaceGuidValue() == '' and self.BinaryModule:\r
913 Logger.Error("\nMkPkg",\r
914 PARSER_ERROR,\r
915 ST.ERR_ASBUILD_PCD_TOKENSPACE_GUID_VALUE_MISS % \\r
916 (PcdItemObj.GetTokenSpaceGuidCName()),\r
917 self.GetFullPath(), RaiseError=True)\r
918 else:\r
919 Pcd.SetTokenSpaceGuidValue(PcdItemObj.GetTokenSpaceGuidValue())\r
920 if (PcdItemObj.GetToken() == '' or PcdItemObj.GetDatumType() == '') and self.BinaryModule:\r
921 Logger.Error("\nMkPkg",\r
922 PARSER_ERROR,\r
923 ST.ERR_ASBUILD_PCD_DECLARITION_MISS % \\r
924 (PcdItemObj.GetTokenSpaceGuidCName() + '.' + PcdItemObj.GetCName()),\r
925 self.GetFullPath(), RaiseError=True)\r
926 Pcd.SetToken(PcdItemObj.GetToken())\r
927 Pcd.SetDatumType(PcdItemObj.GetDatumType())\r
928 Pcd.SetMaxDatumSize(PcdItemObj.GetMaxDatumSize())\r
929 Pcd.SetDefaultValue(PcdItemObj.GetDefaultValue())\r
930 Pcd.SetOffset(PcdItemObj.GetOffset())\r
931 Pcd.SetItemType(PcdItem[0])\r
932 Pcd.SetFeatureFlag(PcdItemObj.GetFeatureFlagExp())\r
933 Pcd.SetSupArchList(ConvertArchList(PcdItemObj.GetSupportArchList()))\r
421ccda3
HC
934 Pcd.SetValidUsage(PcdItemObj.GetValidUsage())\r
935 for CommentItem in PcdItemObj.GetHelpStringList():\r
936 HelpTextObj = CommonObject.TextObject()\r
937 if self.UniFileClassObject:\r
938 HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
939 HelpTextObj.SetString(CommentItem.GetHelpStringItem())\r
940 Pcd.SetHelpTextList(Pcd.GetHelpTextList() + [HelpTextObj])\r
4234283c 941 AsBuildPatchPcdList.append(Pcd)\r
1f0a062f 942 elif PcdItem[0].upper() == DT.TAB_INF_PCD_EX.upper():\r
4234283c
LG
943 PcdItemObj = PcdItem[1]\r
944 Pcd = CommonObject.PcdObject()\r
945 Pcd.SetTokenSpaceGuidValue(PcdItemObj.GetTokenSpaceGuidValue())\r
946 Pcd.SetToken(PcdItemObj.GetToken())\r
947 Pcd.SetDatumType(PcdItemObj.GetDatumType())\r
948 Pcd.SetMaxDatumSize(PcdItemObj.GetMaxDatumSize())\r
949 Pcd.SetDefaultValue(PcdItemObj.GetDefaultValue())\r
950 Pcd.SetItemType(PcdItem[0])\r
951 Pcd.SetFeatureFlag(PcdItemObj.GetFeatureFlagExp())\r
952 Pcd.SetSupArchList(ConvertArchList(PcdItemObj.GetSupportArchList()))\r
421ccda3
HC
953 Pcd.SetValidUsage(PcdItemObj.GetValidUsage())\r
954 for CommentItem in PcdItemObj.GetHelpStringList():\r
955 HelpTextObj = CommonObject.TextObject()\r
956 if self.UniFileClassObject:\r
957 HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
958 HelpTextObj.SetString(CommentItem.GetHelpStringItem())\r
959 Pcd.SetHelpTextList(Pcd.GetHelpTextList() + [HelpTextObj])\r
4234283c
LG
960 AsBuildPcdExList.append(Pcd)\r
961 AsBuildIns.SetPatchPcdList(AsBuildPatchPcdList)\r
962 AsBuildIns.SetPcdExList(AsBuildPcdExList)\r
963\r
964 return AsBuildIns\r
965\r
966 ## GenGuidProtocolPpis\r
967 #\r
968 # Gen Guids/Protocol/Ppis of INF\r
969 # <CName>=<GuidValue>\r
970 #\r
971 def _GenGuidProtocolPpis(self, Type):\r
972 Logger.Debug(2, "Generate %s ..." % Type)\r
973 #\r
974 # Get all Guid/Protocol/Ppis data\r
975 #\r
976 GuidObj = self.Parser.InfGuidSection.GetGuid()\r
977 ProtocolObj = self.Parser.InfProtocolSection.GetProtocol()\r
978 PpisObj = self.Parser.InfPpiSection.GetPpi()\r
979\r
980 GuidProtocolPpiList = []\r
981\r
982 if Type == DT.TAB_GUIDS:\r
983 GuidData = GuidObj.keys()\r
984 for Item in GuidData:\r
985 CommentList = Item.GetCommentList()\r
986 #\r
987 # Depend on CommentList content\r
988 # generate muti-guid-obj\r
989 #\r
990 if CommentList:\r
991 for GuidComentItem in CommentList:\r
992 ListObject = CommonObject.GuidObject()\r
993 ListObject.SetGuidTypeList([GuidComentItem.GetGuidTypeItem()])\r
994 ListObject.SetVariableName(GuidComentItem.GetVariableNameItem())\r
995 ListObject.SetUsage(GuidComentItem.GetUsageItem())\r
996 ListObject.SetName(Item.GetName())\r
997 ListObject.SetCName(Item.GetName())\r
998 ListObject.SetSupArchList(ConvertArchList(Item.GetSupArchList()))\r
999 ListObject.SetFeatureFlag(Item.GetFeatureFlagExp())\r
1000 HelpString = GuidComentItem.GetHelpStringItem()\r
421ccda3
HC
1001 if HelpString.strip():\r
1002 HelpTxtTailObj = CommonObject.TextObject()\r
1003 if self.UniFileClassObject:\r
1004 HelpTxtTailObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
1005 HelpTxtTailObj.SetString(HelpString)\r
1006 ListObject.SetHelpTextList([HelpTxtTailObj])\r
1007 \r
4234283c
LG
1008 GuidProtocolPpiList.append(ListObject)\r
1009 elif Type == DT.TAB_PROTOCOLS:\r
1010 ProtocolData = ProtocolObj.keys()\r
1011 for Item in ProtocolData:\r
1012 CommentList = Item.GetCommentList()\r
1013 for CommentItem in CommentList:\r
1014 ListObject = CommonObject.ProtocolObject()\r
1015 ListObject.SetCName(Item.GetName())\r
1016 ListObject.SetSupArchList(ConvertArchList(Item.GetSupArchList()))\r
1017 ListObject.SetFeatureFlag(Item.GetFeatureFlagExp())\r
1018 ListObject.SetNotify(CommentItem.GetNotify())\r
1019 ListObject.SetUsage(CommentItem.GetUsageItem())\r
4234283c 1020 HelpString = CommentItem.GetHelpStringItem()\r
421ccda3
HC
1021 if HelpString.strip():\r
1022 HelpTxtObj = CommonObject.TextObject()\r
1023 if self.UniFileClassObject:\r
1024 HelpTxtObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
1025 HelpTxtObj.SetString(HelpString)\r
1026 ListObject.SetHelpTextList([HelpTxtObj])\r
4234283c
LG
1027 GuidProtocolPpiList.append(ListObject)\r
1028 elif Type == DT.TAB_PPIS:\r
1029 PpiData = PpisObj.keys()\r
1030 for Item in PpiData:\r
1031 CommentList = Item.GetCommentList()\r
1032 for CommentItem in CommentList:\r
1033 ListObject = CommonObject.PpiObject()\r
1034 ListObject.SetCName(Item.GetName())\r
1035 ListObject.SetSupArchList(ConvertArchList(Item.GetSupArchList()))\r
1036 ListObject.SetFeatureFlag(Item.GetFeatureFlagExp())\r
1037 ListObject.SetNotify(CommentItem.GetNotify())\r
1038 ListObject.SetUsage(CommentItem.GetUsage())\r
4234283c 1039 HelpString = CommentItem.GetHelpStringItem()\r
421ccda3
HC
1040 if HelpString.strip():\r
1041 HelpTextObj = CommonObject.TextObject()\r
1042 if self.UniFileClassObject:\r
1043 HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
1044 HelpTextObj.SetString(HelpString)\r
1045 ListObject.SetHelpTextList([HelpTextObj])\r
4234283c
LG
1046 GuidProtocolPpiList.append(ListObject)\r
1047\r
1048 if Type == DT.TAB_GUIDS:\r
1049 self.SetGuidList(self.GetGuidList() + GuidProtocolPpiList)\r
1050 elif Type == DT.TAB_PROTOCOLS:\r
1051 self.SetProtocolList(self.GetProtocolList() + GuidProtocolPpiList)\r
1052 elif Type == DT.TAB_PPIS:\r
1053 self.SetPpiList(self.GetPpiList() + GuidProtocolPpiList)\r
1054\r
1055 ## GenMiscFiles\r
1056 #\r
1057 # Gen MiscellaneousFiles of Inf\r
1058 #\r
1059 # @param ContainerFile: The Inf file full path\r
1060 #\r
421ccda3
HC
1061 def _GenMiscFiles(self, Content):\r
1062 MiscFileObj = CommonObject.MiscFileObject()\r
1063 for Line in Content.splitlines():\r
1064 FileName = ''\r
1065 if '#' in Line:\r
1066 FileName = Line[:Line.find('#')]\r
1067 else:\r
1068 FileName = Line\r
1069 if FileName:\r
1070 if IsValidPath(FileName, GlobalData.gINF_MODULE_DIR):\r
1071 FileObj = CommonObject.FileObject()\r
1072 FileObj.SetURI(FileName)\r
1073 MiscFileObj.SetFileList(MiscFileObj.GetFileList()+[FileObj])\r
1074 else:\r
1075 Logger.Error("InfParser", \r
1076 FORMAT_INVALID,\r
1077 ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(Line),\r
1078 File=GlobalData.gINF_MODULE_NAME,\r
1079 ExtraData=Line) \r
1080 self.SetMiscFileList(self.GetMiscFileList()+[MiscFileObj]) \r
1081 \r