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