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