]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - BaseTools/Source/Python/UPT/Object/Parser/InfDefineObject.py
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Object / Parser / InfDefineObject.py
... / ...
CommitLineData
1## @file\r
2# This file is used to define class objects of [Defines] section for INF file.\r
3# It will consumed by InfParser\r
4#\r
5# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
6#\r
7# SPDX-License-Identifier: BSD-2-Clause-Patent\r
8\r
9'''\r
10InfDefineObject\r
11'''\r
12\r
13import os\r
14import re\r
15\r
16from Logger import StringTable as ST\r
17from Logger import ToolError\r
18from Library import GlobalData\r
19from Library import DataType as DT\r
20from Library.StringUtils import GetSplitValueList\r
21from Library.Misc import CheckGuidRegFormat\r
22from Library.Misc import Sdict\r
23from Library.Misc import ConvPathFromAbsToRel\r
24from Library.Misc import ValidateUNIFilePath\r
25from Library.ExpressionValidate import IsValidFeatureFlagExp\r
26from Library.ParserValidate import IsValidWord\r
27from Library.ParserValidate import IsValidInfMoudleType\r
28from Library.ParserValidate import IsValidHex\r
29from Library.ParserValidate import IsValidHexVersion\r
30from Library.ParserValidate import IsValidDecVersion\r
31from Library.ParserValidate import IsValidCVariableName\r
32from Library.ParserValidate import IsValidBoolType\r
33from Library.ParserValidate import IsValidPath\r
34from Library.ParserValidate import IsValidFamily\r
35from Library.ParserValidate import IsValidIdentifier\r
36from Library.ParserValidate import IsValidDecVersionVal\r
37from Object.Parser.InfCommonObject import InfLineCommentObject\r
38from Object.Parser.InfCommonObject import CurrentLine\r
39from Object.Parser.InfCommonObject import InfSectionCommonDef\r
40from Object.Parser.InfMisc import ErrorInInf\r
41from Object.Parser.InfDefineCommonObject import InfDefineLibraryItem\r
42from Object.Parser.InfDefineCommonObject import InfDefineEntryPointItem\r
43from Object.Parser.InfDefineCommonObject import InfDefineUnloadImageItem\r
44from Object.Parser.InfDefineCommonObject import InfDefineConstructorItem\r
45from Object.Parser.InfDefineCommonObject import InfDefineDestructorItem\r
46\r
47class InfDefSectionOptionRomInfo():\r
48 def __init__(self):\r
49 self.PciVendorId = None\r
50 self.PciDeviceId = None\r
51 self.PciClassCode = None\r
52 self.PciRevision = None\r
53 self.PciCompress = None\r
54 self.CurrentLine = ['', -1, '']\r
55 def SetPciVendorId(self, PciVendorId, Comments):\r
56 #\r
57 # Value has been set before.\r
58 #\r
59 if self.PciVendorId is not None:\r
60 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND%(DT.TAB_INF_DEFINES_PCI_VENDOR_ID),\r
61 LineInfo=self.CurrentLine)\r
62 return False\r
63 #\r
64 # The PciVendorId should be hex string.\r
65 #\r
66 if (IsValidHex(PciVendorId)):\r
67 self.PciVendorId = InfDefMember()\r
68 self.PciVendorId.SetValue(PciVendorId)\r
69 self.PciVendorId.Comments = Comments\r
70 return True\r
71 else:\r
72 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(PciVendorId),\r
73 LineInfo=self.CurrentLine)\r
74 return False\r
75\r
76 def GetPciVendorId(self):\r
77 return self.PciVendorId\r
78\r
79 def SetPciDeviceId(self, PciDeviceId, Comments):\r
80 #\r
81 # Value has been set before.\r
82 #\r
83 if self.PciDeviceId is not None:\r
84 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND%(DT.TAB_INF_DEFINES_PCI_DEVICE_ID),\r
85 LineInfo=self.CurrentLine)\r
86 return False\r
87 #\r
88 # The PciDeviceId should be hex string.\r
89 #\r
90 if (IsValidHex(PciDeviceId)):\r
91 self.PciDeviceId = InfDefMember()\r
92 self.PciDeviceId.SetValue(PciDeviceId)\r
93 self.PciDeviceId.Comments = Comments\r
94 return True\r
95 else:\r
96 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(PciDeviceId),\r
97 LineInfo=self.CurrentLine)\r
98 return False\r
99\r
100 def GetPciDeviceId(self):\r
101 return self.PciDeviceId\r
102\r
103 def SetPciClassCode(self, PciClassCode, Comments):\r
104 #\r
105 # Value has been set before.\r
106 #\r
107 if self.PciClassCode is not None:\r
108 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND%(DT.TAB_INF_DEFINES_PCI_CLASS_CODE),\r
109 LineInfo=self.CurrentLine)\r
110 return False\r
111 #\r
112 # The PciClassCode should be 4 bytes hex string.\r
113 #\r
114 if (IsValidHex(PciClassCode)):\r
115 self.PciClassCode = InfDefMember()\r
116 self.PciClassCode.SetValue(PciClassCode)\r
117 self.PciClassCode.Comments = Comments\r
118 return True\r
119 else:\r
120 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%\\r
121 (PciClassCode),\r
122 LineInfo=self.CurrentLine)\r
123 return False\r
124\r
125 def GetPciClassCode(self):\r
126 return self.PciClassCode\r
127\r
128 def SetPciRevision(self, PciRevision, Comments):\r
129 #\r
130 # Value has been set before.\r
131 #\r
132 if self.PciRevision is not None:\r
133 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND%(DT.TAB_INF_DEFINES_PCI_REVISION),\r
134 LineInfo=self.CurrentLine)\r
135 return False\r
136 #\r
137 # The PciRevision should be 4 bytes hex string.\r
138 #\r
139 if (IsValidHex(PciRevision)):\r
140 self.PciRevision = InfDefMember()\r
141 self.PciRevision.SetValue(PciRevision)\r
142 self.PciRevision.Comments = Comments\r
143 return True\r
144 else:\r
145 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(PciRevision),\r
146 LineInfo=self.CurrentLine)\r
147 return False\r
148\r
149 def GetPciRevision(self):\r
150 return self.PciRevision\r
151\r
152 def SetPciCompress(self, PciCompress, Comments):\r
153 #\r
154 # Value has been set before.\r
155 #\r
156 if self.PciCompress is not None:\r
157 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND%(DT.TAB_INF_DEFINES_PCI_COMPRESS),\r
158 LineInfo=self.CurrentLine)\r
159 return False\r
160\r
161 #\r
162 # The PciCompress should be 'TRUE' or 'FALSE'.\r
163 #\r
164 if (PciCompress == 'TRUE' or PciCompress == 'FALSE'):\r
165 self.PciCompress = InfDefMember()\r
166 self.PciCompress.SetValue(PciCompress)\r
167 self.PciCompress.Comments = Comments\r
168 return True\r
169 else:\r
170 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(PciCompress),\r
171 LineInfo=self.CurrentLine)\r
172 return False\r
173 def GetPciCompress(self):\r
174 return self.PciCompress\r
175##\r
176# INF [Define] section Object\r
177#\r
178class InfDefSection(InfDefSectionOptionRomInfo):\r
179 def __init__(self):\r
180 self.BaseName = None\r
181 self.FileGuid = None\r
182 self.ModuleType = None\r
183 self.ModuleUniFileName = None\r
184 self.InfVersion = None\r
185 self.EdkReleaseVersion = None\r
186 self.UefiSpecificationVersion = None\r
187 self.PiSpecificationVersion = None\r
188 self.LibraryClass = []\r
189 self.Package = None\r
190 self.VersionString = None\r
191 self.PcdIsDriver = None\r
192 self.EntryPoint = []\r
193 self.UnloadImages = []\r
194 self.Constructor = []\r
195 self.Destructor = []\r
196 self.Shadow = None\r
197 self.CustomMakefile = []\r
198 self.Specification = []\r
199 self.UefiHiiResourceSection = None\r
200 self.DpxSource = []\r
201 self.CurrentLine = ['', -1, '']\r
202 InfDefSectionOptionRomInfo.__init__(self)\r
203\r
204 ## SetHeadComment\r
205 #\r
206 # @param BaseName: BaseName\r
207 #\r
208 def SetBaseName(self, BaseName, Comments):\r
209 #\r
210 # Value has been set before.\r
211 #\r
212 if self.BaseName is not None:\r
213 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND%(DT.TAB_INF_DEFINES_BASE_NAME),\r
214 LineInfo=self.CurrentLine)\r
215 return False\r
216 if not (BaseName == '' or BaseName is None):\r
217 if IsValidWord(BaseName) and not BaseName.startswith("_"):\r
218 self.BaseName = InfDefMember()\r
219 self.BaseName.SetValue(BaseName)\r
220 self.BaseName.Comments = Comments\r
221 return True\r
222 else:\r
223 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_NAME_INVALID%(BaseName),\r
224 LineInfo=self.CurrentLine)\r
225 return False\r
226\r
227 ## GetBaseName\r
228 #\r
229 def GetBaseName(self):\r
230 return self.BaseName\r
231\r
232 ## SetFileGuid\r
233 #\r
234 # @param FileGuid: FileGuid\r
235 #\r
236 def SetFileGuid(self, FileGuid, Comments):\r
237 #\r
238 # Value has been set before.\r
239 #\r
240 if self.FileGuid is not None:\r
241 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND\\r
242 %(DT.TAB_INF_DEFINES_FILE_GUID),\r
243 LineInfo=self.CurrentLine)\r
244 return False\r
245 #\r
246 # Do verification of GUID content/format\r
247 #\r
248 if (CheckGuidRegFormat(FileGuid)):\r
249 self.FileGuid = InfDefMember()\r
250 self.FileGuid.SetValue(FileGuid)\r
251 self.FileGuid.Comments = Comments\r
252 return True\r
253 else:\r
254 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_GUID_INVALID%(FileGuid),\r
255 LineInfo=self.CurrentLine)\r
256 return False\r
257\r
258 ## GetFileGuid\r
259 #\r
260 def GetFileGuid(self):\r
261 return self.FileGuid\r
262\r
263 ## SetModuleType\r
264 #\r
265 # @param ModuleType: ModuleType\r
266 #\r
267 def SetModuleType(self, ModuleType, Comments):\r
268 #\r
269 # Value has been set before.\r
270 #\r
271 if self.ModuleType is not None:\r
272 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND\\r
273 %(DT.TAB_INF_DEFINES_MODULE_TYPE),\r
274 LineInfo=self.CurrentLine)\r
275 return False\r
276 #\r
277 # Valid Module Type or not\r
278 #\r
279 if (IsValidInfMoudleType(ModuleType)):\r
280 self.ModuleType = InfDefMember()\r
281 self.ModuleType.SetValue(ModuleType)\r
282 self.ModuleType.CurrentLine = CurrentLine()\r
283 self.ModuleType.CurrentLine.SetLineNo(self.CurrentLine[1])\r
284 self.ModuleType.CurrentLine.SetLineString(self.CurrentLine[2])\r
285 self.ModuleType.CurrentLine.SetFileName(self.CurrentLine[0])\r
286 self.ModuleType.Comments = Comments\r
287 return True\r
288 else:\r
289 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_MODULETYPE_INVALID%\\r
290 (ModuleType),\r
291 LineInfo=self.CurrentLine)\r
292 return False\r
293\r
294 ## GetModuleType\r
295 #\r
296 def GetModuleType(self):\r
297 return self.ModuleType\r
298\r
299 ## SetModuleUniFileName\r
300 #\r
301 # @param ModuleUniFileName: ModuleUniFileName\r
302 #\r
303 def SetModuleUniFileName(self, ModuleUniFileName, Comments):\r
304 if Comments:\r
305 pass\r
306 if self.ModuleUniFileName is not None:\r
307 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND%(DT.TAB_INF_DEFINES_MODULE_UNI_FILE),\r
308 LineInfo=self.CurrentLine)\r
309 self.ModuleUniFileName = ModuleUniFileName\r
310\r
311 ## GetModuleType\r
312 #\r
313 def GetModuleUniFileName(self):\r
314 return self.ModuleUniFileName\r
315\r
316 ## SetInfVersion\r
317 #\r
318 # @param InfVersion: InfVersion\r
319 #\r
320 def SetInfVersion(self, InfVersion, Comments):\r
321 #\r
322 # Value has been set before.\r
323 #\r
324 if self.InfVersion is not None:\r
325 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND\\r
326 %(DT.TAB_INF_DEFINES_INF_VERSION),\r
327 LineInfo=self.CurrentLine)\r
328 return False\r
329 #\r
330 # The InfVersion should be 4 bytes hex string.\r
331 #\r
332 if (IsValidHex(InfVersion)):\r
333 if (InfVersion < '0x00010005'):\r
334 ErrorInInf(ST.ERR_INF_PARSER_NOT_SUPPORT_EDKI_INF,\r
335 ErrorCode=ToolError.EDK1_INF_ERROR,\r
336 LineInfo=self.CurrentLine)\r
337 elif IsValidDecVersionVal(InfVersion):\r
338 if (InfVersion < 65541):\r
339 ErrorInInf(ST.ERR_INF_PARSER_NOT_SUPPORT_EDKI_INF,\r
340 ErrorCode=ToolError.EDK1_INF_ERROR,\r
341 LineInfo=self.CurrentLine)\r
342 else:\r
343 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(InfVersion),\r
344 LineInfo=self.CurrentLine)\r
345 return False\r
346\r
347 self.InfVersion = InfDefMember()\r
348 self.InfVersion.SetValue(InfVersion)\r
349 self.InfVersion.Comments = Comments\r
350 return True\r
351\r
352 ## GetInfVersion\r
353 #\r
354 def GetInfVersion(self):\r
355 return self.InfVersion\r
356\r
357 ## SetEdkReleaseVersion\r
358 #\r
359 # @param EdkReleaseVersion: EdkReleaseVersion\r
360 #\r
361 def SetEdkReleaseVersion(self, EdkReleaseVersion, Comments):\r
362 #\r
363 # Value has been set before.\r
364 #\r
365 if self.EdkReleaseVersion is not None:\r
366 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND\\r
367 %(DT.TAB_INF_DEFINES_EDK_RELEASE_VERSION),\r
368 LineInfo=self.CurrentLine)\r
369 return False\r
370 #\r
371 # The EdkReleaseVersion should be 4 bytes hex string.\r
372 #\r
373 if IsValidHexVersion(EdkReleaseVersion) or \\r
374 IsValidDecVersionVal(EdkReleaseVersion):\r
375 self.EdkReleaseVersion = InfDefMember()\r
376 self.EdkReleaseVersion.SetValue(EdkReleaseVersion)\r
377 self.EdkReleaseVersion.Comments = Comments\r
378 return True\r
379 else:\r
380 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID\\r
381 %(EdkReleaseVersion),\r
382 LineInfo=self.CurrentLine)\r
383 return False\r
384\r
385 ## GetEdkReleaseVersion\r
386 #\r
387 def GetEdkReleaseVersion(self):\r
388 return self.EdkReleaseVersion\r
389\r
390 ## SetUefiSpecificationVersion\r
391 #\r
392 # @param UefiSpecificationVersion: UefiSpecificationVersion\r
393 #\r
394 def SetUefiSpecificationVersion(self, UefiSpecificationVersion, Comments):\r
395 #\r
396 # Value has been set before.\r
397 #\r
398 if self.UefiSpecificationVersion is not None:\r
399 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND\\r
400 %(DT.TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION),\r
401 LineInfo=self.CurrentLine)\r
402 return False\r
403 #\r
404 # The EdkReleaseVersion should be 4 bytes hex string.\r
405 #\r
406 if IsValidHexVersion(UefiSpecificationVersion) or \\r
407 IsValidDecVersionVal(UefiSpecificationVersion):\r
408 self.UefiSpecificationVersion = InfDefMember()\r
409 self.UefiSpecificationVersion.SetValue(UefiSpecificationVersion)\r
410 self.UefiSpecificationVersion.Comments = Comments\r
411 return True\r
412 else:\r
413 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID\\r
414 %(UefiSpecificationVersion),\r
415 LineInfo=self.CurrentLine)\r
416 return False\r
417\r
418 ## GetUefiSpecificationVersion\r
419 #\r
420 def GetUefiSpecificationVersion(self):\r
421 return self.UefiSpecificationVersion\r
422\r
423 ## SetPiSpecificationVersion\r
424 #\r
425 # @param PiSpecificationVersion: PiSpecificationVersion\r
426 #\r
427 def SetPiSpecificationVersion(self, PiSpecificationVersion, Comments):\r
428 #\r
429 # Value has been set before.\r
430 #\r
431 if self.PiSpecificationVersion is not None:\r
432 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND\\r
433 %(DT.TAB_INF_DEFINES_PI_SPECIFICATION_VERSION),\r
434 LineInfo=self.CurrentLine)\r
435 return False\r
436 #\r
437 # The EdkReleaseVersion should be 4 bytes hex string.\r
438 #\r
439 if IsValidHexVersion(PiSpecificationVersion) or \\r
440 IsValidDecVersionVal(PiSpecificationVersion):\r
441 self.PiSpecificationVersion = InfDefMember()\r
442 self.PiSpecificationVersion.SetValue(PiSpecificationVersion)\r
443 self.PiSpecificationVersion.Comments = Comments\r
444 return True\r
445 else:\r
446 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID\\r
447 %(PiSpecificationVersion),\r
448 LineInfo=self.CurrentLine)\r
449 return False\r
450\r
451 ## GetPiSpecificationVersion\r
452 #\r
453 def GetPiSpecificationVersion(self):\r
454 return self.PiSpecificationVersion\r
455\r
456 ## SetLibraryClass\r
457 #\r
458 # @param LibraryClass: LibraryClass\r
459 #\r
460 def SetLibraryClass(self, LibraryClass, Comments):\r
461 ValueList = GetSplitValueList(LibraryClass)\r
462 Name = ValueList[0]\r
463 if IsValidWord(Name):\r
464 InfDefineLibraryItemObj = InfDefineLibraryItem()\r
465 InfDefineLibraryItemObj.SetLibraryName(Name)\r
466 InfDefineLibraryItemObj.Comments = Comments\r
467 if len(ValueList) == 2:\r
468 Type = ValueList[1]\r
469 TypeList = GetSplitValueList(Type, ' ')\r
470 TypeList = [Type for Type in TypeList if Type != '']\r
471 for Item in TypeList:\r
472 if Item not in DT.MODULE_LIST:\r
473 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Item),\r
474 LineInfo=self.CurrentLine)\r
475 return False\r
476 InfDefineLibraryItemObj.SetTypes(TypeList)\r
477 self.LibraryClass.append(InfDefineLibraryItemObj)\r
478 else:\r
479 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Name),\r
480 LineInfo=self.CurrentLine)\r
481 return False\r
482\r
483 return True\r
484\r
485 def GetLibraryClass(self):\r
486 return self.LibraryClass\r
487\r
488 def SetVersionString(self, VersionString, Comments):\r
489 #\r
490 # Value has been set before.\r
491 #\r
492 if self.VersionString is not None:\r
493 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND\\r
494 %(DT.TAB_INF_DEFINES_VERSION_STRING),\r
495 LineInfo=self.CurrentLine)\r
496 return False\r
497 if not IsValidDecVersion(VersionString):\r
498 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID\\r
499 %(VersionString),\r
500 LineInfo=self.CurrentLine)\r
501 self.VersionString = InfDefMember()\r
502 self.VersionString.SetValue(VersionString)\r
503 self.VersionString.Comments = Comments\r
504 return True\r
505\r
506\r
507 def GetVersionString(self):\r
508 return self.VersionString\r
509\r
510 def SetPcdIsDriver(self, PcdIsDriver, Comments):\r
511 #\r
512 # Value has been set before.\r
513 #\r
514 if self.PcdIsDriver is not None:\r
515 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND\\r
516 %(DT.TAB_INF_DEFINES_PCD_IS_DRIVER),\r
517 LineInfo=self.CurrentLine)\r
518 return False\r
519 if PcdIsDriver == 'PEI_PCD_DRIVER' or PcdIsDriver == 'DXE_PCD_DRIVER':\r
520 self.PcdIsDriver = InfDefMember()\r
521 self.PcdIsDriver.SetValue(PcdIsDriver)\r
522 self.PcdIsDriver.Comments = Comments\r
523 return True\r
524 else:\r
525 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(PcdIsDriver),\r
526 LineInfo=self.CurrentLine)\r
527 return False\r
528\r
529 def GetPcdIsDriver(self):\r
530 return self.PcdIsDriver\r
531\r
532 #\r
533 # SetEntryPoint\r
534 #\r
535 def SetEntryPoint(self, EntryPoint, Comments):\r
536 #\r
537 # It can be a list\r
538 #\r
539 ValueList = []\r
540 TokenList = GetSplitValueList(EntryPoint, DT.TAB_VALUE_SPLIT)\r
541 ValueList[0:len(TokenList)] = TokenList\r
542 InfDefineEntryPointItemObj = InfDefineEntryPointItem()\r
543 if not IsValidCVariableName(ValueList[0]):\r
544 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%\\r
545 (ValueList[0]),\r
546 LineInfo=self.CurrentLine)\r
547 InfDefineEntryPointItemObj.SetCName(ValueList[0])\r
548 if len(ValueList) == 2:\r
549 if ValueList[1].strip() == '':\r
550 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%\\r
551 (ValueList[1]),\r
552 LineInfo=self.CurrentLine)\r
553 #\r
554 # Validate FFE\r
555 #\r
556 FeatureFlagRtv = IsValidFeatureFlagExp(ValueList[1].strip())\r
557 if not FeatureFlagRtv[0]:\r
558 ErrorInInf(ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%\\r
559 (FeatureFlagRtv[1]),\r
560 LineInfo=self.CurrentLine)\r
561 InfDefineEntryPointItemObj.SetFeatureFlagExp(ValueList[1])\r
562 if len(ValueList) > 2:\r
563 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(EntryPoint),\r
564 LineInfo=self.CurrentLine)\r
565 InfDefineEntryPointItemObj.Comments = Comments\r
566 self.EntryPoint.append(InfDefineEntryPointItemObj)\r
567\r
568 def GetEntryPoint(self):\r
569 return self.EntryPoint\r
570\r
571 #\r
572 # SetUnloadImages\r
573 #\r
574 def SetUnloadImages(self, UnloadImages, Comments):\r
575 #\r
576 # It can be a list\r
577 #\r
578 ValueList = []\r
579 TokenList = GetSplitValueList(UnloadImages, DT.TAB_VALUE_SPLIT)\r
580 ValueList[0:len(TokenList)] = TokenList\r
581 InfDefineUnloadImageItemObj = InfDefineUnloadImageItem()\r
582 if not IsValidCVariableName(ValueList[0]):\r
583 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[0]),\r
584 LineInfo=self.CurrentLine)\r
585 InfDefineUnloadImageItemObj.SetCName(ValueList[0])\r
586 if len(ValueList) == 2:\r
587 if ValueList[1].strip() == '':\r
588 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[1]),\r
589 LineInfo=self.CurrentLine)\r
590 #\r
591 # Validate FFE\r
592 #\r
593 FeatureFlagRtv = IsValidFeatureFlagExp(ValueList[1].strip())\r
594 if not FeatureFlagRtv[0]:\r
595 ErrorInInf(ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%(FeatureFlagRtv[1]),\r
596 LineInfo=self.CurrentLine)\r
597 InfDefineUnloadImageItemObj.SetFeatureFlagExp(ValueList[1])\r
598\r
599 if len(ValueList) > 2:\r
600 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(UnloadImages),\r
601 LineInfo=self.CurrentLine)\r
602 InfDefineUnloadImageItemObj.Comments = Comments\r
603 self.UnloadImages.append(InfDefineUnloadImageItemObj)\r
604\r
605 def GetUnloadImages(self):\r
606 return self.UnloadImages\r
607\r
608 #\r
609 # SetConstructor\r
610 #\r
611 def SetConstructor(self, Constructor, Comments):\r
612 #\r
613 # It can be a list\r
614 #\r
615 ValueList = []\r
616 TokenList = GetSplitValueList(Constructor, DT.TAB_VALUE_SPLIT)\r
617 ValueList[0:len(TokenList)] = TokenList\r
618 InfDefineConstructorItemObj = InfDefineConstructorItem()\r
619 if not IsValidCVariableName(ValueList[0]):\r
620 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[0]),\r
621 LineInfo=self.CurrentLine)\r
622 InfDefineConstructorItemObj.SetCName(ValueList[0])\r
623 if len(ValueList) >= 2:\r
624 ModList = GetSplitValueList(ValueList[1], ' ')\r
625 if ValueList[1].strip() == '':\r
626 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[1]),\r
627 LineInfo=self.CurrentLine)\r
628 for ModItem in ModList:\r
629 if ModItem not in DT.MODULE_LIST:\r
630 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_MODULETYPE_INVALID%(ModItem),\r
631 LineInfo=self.CurrentLine)\r
632 InfDefineConstructorItemObj.SetSupModList(ModList)\r
633 if len(ValueList) == 3:\r
634 if ValueList[2].strip() == '':\r
635 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[2]),\r
636 LineInfo=self.CurrentLine)\r
637 #\r
638 # Validate FFE\r
639 #\r
640 FeatureFlagRtv = IsValidFeatureFlagExp(ValueList[2].strip())\r
641 if not FeatureFlagRtv[0]:\r
642 ErrorInInf(ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%(FeatureFlagRtv[2]),\r
643 LineInfo=self.CurrentLine)\r
644 InfDefineConstructorItemObj.SetFeatureFlagExp(ValueList[2])\r
645\r
646 if len(ValueList) > 3:\r
647 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Constructor),\r
648 LineInfo=self.CurrentLine)\r
649 InfDefineConstructorItemObj.Comments = Comments\r
650 self.Constructor.append(InfDefineConstructorItemObj)\r
651\r
652 def GetConstructor(self):\r
653 return self.Constructor\r
654\r
655 #\r
656 # SetDestructor\r
657 #\r
658 def SetDestructor(self, Destructor, Comments):\r
659 #\r
660 # It can be a list and only 1 set to TRUE\r
661 #\r
662 ValueList = []\r
663 TokenList = GetSplitValueList(Destructor, DT.TAB_VALUE_SPLIT)\r
664 ValueList[0:len(TokenList)] = TokenList\r
665 InfDefineDestructorItemObj = InfDefineDestructorItem()\r
666 if not IsValidCVariableName(ValueList[0]):\r
667 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[0]),\r
668 LineInfo=self.CurrentLine)\r
669 InfDefineDestructorItemObj.SetCName(ValueList[0])\r
670 if len(ValueList) >= 2:\r
671 ModList = GetSplitValueList(ValueList[1].strip(), ' ')\r
672 if ValueList[1].strip() == '':\r
673 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[1]),\r
674 LineInfo=self.CurrentLine)\r
675 for ModItem in ModList:\r
676 if ModItem not in DT.MODULE_LIST:\r
677 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_MODULETYPE_INVALID%(ModItem),\r
678 LineInfo=self.CurrentLine)\r
679 InfDefineDestructorItemObj.SetSupModList(ModList)\r
680 if len(ValueList) == 3:\r
681 if ValueList[2].strip() == '':\r
682 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[2]),\r
683 LineInfo=self.CurrentLine)\r
684 #\r
685 # Validate FFE\r
686 #\r
687 FeatureFlagRtv = IsValidFeatureFlagExp(ValueList[2].strip())\r
688 if not FeatureFlagRtv[0]:\r
689 ErrorInInf(ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%(FeatureFlagRtv[1]),\r
690 LineInfo=self.CurrentLine)\r
691 InfDefineDestructorItemObj.SetFeatureFlagExp(ValueList[2])\r
692\r
693 if len(ValueList) > 3:\r
694 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Destructor),\r
695 LineInfo=self.CurrentLine)\r
696\r
697 InfDefineDestructorItemObj.Comments = Comments\r
698 self.Destructor.append(InfDefineDestructorItemObj)\r
699\r
700 def GetDestructor(self):\r
701 return self.Destructor\r
702\r
703 def SetShadow(self, Shadow, Comments):\r
704 #\r
705 # Value has been set before.\r
706 #\r
707 if self.Shadow is not None:\r
708 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND%(DT.TAB_INF_DEFINES_SHADOW),\r
709 LineInfo=self.CurrentLine)\r
710 return False\r
711 if (IsValidBoolType(Shadow)):\r
712 self.Shadow = InfDefMember()\r
713 self.Shadow.SetValue(Shadow)\r
714 self.Shadow.Comments = Comments\r
715 return True\r
716 else:\r
717 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Shadow),\r
718 LineInfo=self.CurrentLine)\r
719 return False\r
720 def GetShadow(self):\r
721 return self.Shadow\r
722\r
723 #\r
724 # <Family> ::= {"MSFT"} {"GCC"}\r
725 # <CustomMake> ::= [<Family> "|"] <Filename>\r
726 #\r
727 def SetCustomMakefile(self, CustomMakefile, Comments):\r
728 if not (CustomMakefile == '' or CustomMakefile is None):\r
729 ValueList = GetSplitValueList(CustomMakefile)\r
730 if len(ValueList) == 1:\r
731 FileName = ValueList[0]\r
732 Family = ''\r
733 else:\r
734 Family = ValueList[0]\r
735 FileName = ValueList[1]\r
736 Family = Family.strip()\r
737 if Family != '':\r
738 if not IsValidFamily(Family):\r
739 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Family),\r
740 LineInfo=self.CurrentLine)\r
741 return False\r
742 #\r
743 # The MakefileName specified file should exist\r
744 #\r
745 IsValidFileFlag = False\r
746 ModulePath = os.path.split(self.CurrentLine[0])[0]\r
747 if IsValidPath(FileName, ModulePath):\r
748 IsValidFileFlag = True\r
749 else:\r
750 ErrorInInf(ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(FileName),\r
751 LineInfo=self.CurrentLine)\r
752 return False\r
753 if IsValidFileFlag:\r
754 FileName = ConvPathFromAbsToRel(FileName, GlobalData.gINF_MODULE_DIR)\r
755 self.CustomMakefile.append((Family, FileName, Comments))\r
756 IsValidFileFlag = False\r
757 return True\r
758 else:\r
759 return False\r
760\r
761 def GetCustomMakefile(self):\r
762 return self.CustomMakefile\r
763\r
764 #\r
765 # ["SPEC" <Spec> <EOL>]*{0,}\r
766 # <Spec> ::= <Word> "=" <VersionVal>\r
767 # <VersionVal> ::= {<HexVersion>] {<DecVersion>}\r
768 # <HexNumber> ::= "0x" [<HexDigit>]{1,}\r
769 # <DecVersion> ::= (0-9){1,} ["." (0-9){1,2}]\r
770 #\r
771 def SetSpecification(self, Specification, Comments):\r
772 #\r
773 # Valid the value of Specification\r
774 #\r
775 __ValueList = []\r
776 TokenList = GetSplitValueList(Specification, DT.TAB_EQUAL_SPLIT, 1)\r
777 __ValueList[0:len(TokenList)] = TokenList\r
778 if len(__ValueList) != 2:\r
779 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_NO_NAME + ' Or ' + ST.ERR_INF_PARSER_DEFINE_ITEM_NO_VALUE,\r
780 LineInfo=self.CurrentLine)\r
781 Name = __ValueList[0].strip()\r
782 Version = __ValueList[1].strip()\r
783 if IsValidIdentifier(Name):\r
784 if IsValidDecVersion(Version):\r
785 self.Specification.append((Name, Version, Comments))\r
786 return True\r
787 else:\r
788 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Version),\r
789 LineInfo=self.CurrentLine)\r
790 return False\r
791 else:\r
792 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Name),\r
793 LineInfo=self.CurrentLine)\r
794 return False\r
795 return True\r
796\r
797 def GetSpecification(self):\r
798 return self.Specification\r
799\r
800 #\r
801 # [<UefiHiiResource> <EOL>]{0,1}\r
802 # <UefiHiiResource> ::= "UEFI_HII_RESOURCE_SECTION" "=" <BoolType>\r
803 #\r
804 def SetUefiHiiResourceSection(self, UefiHiiResourceSection, Comments):\r
805 #\r
806 # Value has been set before.\r
807 #\r
808 if self.UefiHiiResourceSection is not None:\r
809 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND\r
810 %(DT.TAB_INF_DEFINES_UEFI_HII_RESOURCE_SECTION),\r
811 LineInfo=self.CurrentLine)\r
812 return False\r
813 if not (UefiHiiResourceSection == '' or UefiHiiResourceSection is None):\r
814 if (IsValidBoolType(UefiHiiResourceSection)):\r
815 self.UefiHiiResourceSection = InfDefMember()\r
816 self.UefiHiiResourceSection.SetValue(UefiHiiResourceSection)\r
817 self.UefiHiiResourceSection.Comments = Comments\r
818 return True\r
819 else:\r
820 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(UefiHiiResourceSection),\r
821 LineInfo=self.CurrentLine)\r
822 return False\r
823 else:\r
824 return False\r
825\r
826 def GetUefiHiiResourceSection(self):\r
827 return self.UefiHiiResourceSection\r
828\r
829 def SetDpxSource(self, DpxSource, Comments):\r
830 #\r
831 # The MakefileName specified file should exist\r
832 #\r
833 IsValidFileFlag = False\r
834 ModulePath = os.path.split(self.CurrentLine[0])[0]\r
835 if IsValidPath(DpxSource, ModulePath):\r
836 IsValidFileFlag = True\r
837 else:\r
838 ErrorInInf(ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(DpxSource),\r
839 LineInfo=self.CurrentLine)\r
840 return False\r
841 if IsValidFileFlag:\r
842 DpxSource = ConvPathFromAbsToRel(DpxSource,\r
843 GlobalData.gINF_MODULE_DIR)\r
844 self.DpxSource.append((DpxSource, Comments))\r
845 IsValidFileFlag = False\r
846 return True\r
847\r
848 def GetDpxSource(self):\r
849 return self.DpxSource\r
850\r
851gFUNCTION_MAPPING_FOR_DEFINE_SECTION = {\r
852 #\r
853 # Required Fields\r
854 #\r
855 DT.TAB_INF_DEFINES_BASE_NAME : InfDefSection.SetBaseName,\r
856 DT.TAB_INF_DEFINES_FILE_GUID : InfDefSection.SetFileGuid,\r
857 DT.TAB_INF_DEFINES_MODULE_TYPE : InfDefSection.SetModuleType,\r
858 #\r
859 # Required by EDKII style INF file\r
860 #\r
861 DT.TAB_INF_DEFINES_INF_VERSION : InfDefSection.SetInfVersion,\r
862 #\r
863 # Optional Fields\r
864 #\r
865 DT.TAB_INF_DEFINES_MODULE_UNI_FILE : InfDefSection.SetModuleUniFileName,\r
866 DT.TAB_INF_DEFINES_EDK_RELEASE_VERSION : InfDefSection.SetEdkReleaseVersion,\r
867 DT.TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION : InfDefSection.SetUefiSpecificationVersion,\r
868 DT.TAB_INF_DEFINES_PI_SPECIFICATION_VERSION : InfDefSection.SetPiSpecificationVersion,\r
869 DT.TAB_INF_DEFINES_LIBRARY_CLASS : InfDefSection.SetLibraryClass,\r
870 DT.TAB_INF_DEFINES_VERSION_STRING : InfDefSection.SetVersionString,\r
871 DT.TAB_INF_DEFINES_PCD_IS_DRIVER : InfDefSection.SetPcdIsDriver,\r
872 DT.TAB_INF_DEFINES_ENTRY_POINT : InfDefSection.SetEntryPoint,\r
873 DT.TAB_INF_DEFINES_UNLOAD_IMAGE : InfDefSection.SetUnloadImages,\r
874 DT.TAB_INF_DEFINES_CONSTRUCTOR : InfDefSection.SetConstructor,\r
875 DT.TAB_INF_DEFINES_DESTRUCTOR : InfDefSection.SetDestructor,\r
876 DT.TAB_INF_DEFINES_SHADOW : InfDefSection.SetShadow,\r
877 DT.TAB_INF_DEFINES_PCI_VENDOR_ID : InfDefSection.SetPciVendorId,\r
878 DT.TAB_INF_DEFINES_PCI_DEVICE_ID : InfDefSection.SetPciDeviceId,\r
879 DT.TAB_INF_DEFINES_PCI_CLASS_CODE : InfDefSection.SetPciClassCode,\r
880 DT.TAB_INF_DEFINES_PCI_REVISION : InfDefSection.SetPciRevision,\r
881 DT.TAB_INF_DEFINES_PCI_COMPRESS : InfDefSection.SetPciCompress,\r
882 DT.TAB_INF_DEFINES_CUSTOM_MAKEFILE : InfDefSection.SetCustomMakefile,\r
883 DT.TAB_INF_DEFINES_SPEC : InfDefSection.SetSpecification,\r
884 DT.TAB_INF_DEFINES_UEFI_HII_RESOURCE_SECTION : InfDefSection.SetUefiHiiResourceSection,\r
885 DT.TAB_INF_DEFINES_DPX_SOURCE : InfDefSection.SetDpxSource\r
886}\r
887\r
888## InfDefMember\r
889#\r
890#\r
891class InfDefMember():\r
892 def __init__(self, Name='', Value=''):\r
893 self.Comments = InfLineCommentObject()\r
894 self.Name = Name\r
895 self.Value = Value\r
896 self.CurrentLine = CurrentLine()\r
897 def GetName(self):\r
898 return self.Name\r
899 def SetName(self, Name):\r
900 self.Name = Name\r
901 def GetValue(self):\r
902 return self.Value\r
903 def SetValue(self, Value):\r
904 self.Value = Value\r
905\r
906## InfDefObject\r
907#\r
908#\r
909class InfDefObject(InfSectionCommonDef):\r
910 def __init__(self):\r
911 self.Defines = Sdict()\r
912 InfSectionCommonDef.__init__(self)\r
913 def SetDefines(self, DefineContent, Arch = None):\r
914 #\r
915 # Validate Arch\r
916 #\r
917 HasFoundInfVersionFalg = False\r
918 LineInfo = ['', -1, '']\r
919 ArchListString = ' '.join(Arch)\r
920 #\r
921 # Parse Define items.\r
922 #\r
923 for InfDefMemberObj in DefineContent:\r
924 ProcessFunc = None\r
925 Name = InfDefMemberObj.GetName()\r
926 Value = InfDefMemberObj.GetValue()\r
927 if Name == DT.TAB_INF_DEFINES_MODULE_UNI_FILE:\r
928 ValidateUNIFilePath(Value)\r
929 Value = os.path.join(os.path.dirname(InfDefMemberObj.CurrentLine.FileName), Value)\r
930 if not os.path.isfile(Value) or not os.path.exists(Value):\r
931 LineInfo[0] = InfDefMemberObj.CurrentLine.GetFileName()\r
932 LineInfo[1] = InfDefMemberObj.CurrentLine.GetLineNo()\r
933 LineInfo[2] = InfDefMemberObj.CurrentLine.GetLineString()\r
934 ErrorInInf(ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(Name),\r
935 LineInfo=LineInfo)\r
936 InfLineCommentObj = InfLineCommentObject()\r
937 InfLineCommentObj.SetHeaderComments(InfDefMemberObj.Comments.GetHeaderComments())\r
938 InfLineCommentObj.SetTailComments(InfDefMemberObj.Comments.GetTailComments())\r
939 if Name == 'COMPONENT_TYPE':\r
940 ErrorInInf(ST.ERR_INF_PARSER_NOT_SUPPORT_EDKI_INF,\r
941 ErrorCode=ToolError.EDK1_INF_ERROR,\r
942 RaiseError=True)\r
943 if Name == DT.TAB_INF_DEFINES_INF_VERSION:\r
944 HasFoundInfVersionFalg = True\r
945 if not (Name == '' or Name is None):\r
946 #\r
947 # Process "SPEC" Keyword definition.\r
948 #\r
949 ReName = re.compile(r"SPEC ", re.DOTALL)\r
950 if ReName.match(Name):\r
951 SpecValue = Name[Name.find("SPEC") + len("SPEC"):].strip()\r
952 Name = "SPEC"\r
953 Value = SpecValue + " = " + Value\r
954 if ArchListString in self.Defines:\r
955 DefineList = self.Defines[ArchListString]\r
956 LineInfo[0] = InfDefMemberObj.CurrentLine.GetFileName()\r
957 LineInfo[1] = InfDefMemberObj.CurrentLine.GetLineNo()\r
958 LineInfo[2] = InfDefMemberObj.CurrentLine.GetLineString()\r
959 DefineList.CurrentLine = LineInfo\r
960 #\r
961 # Found the process function from mapping table.\r
962 #\r
963 if Name not in gFUNCTION_MAPPING_FOR_DEFINE_SECTION.keys():\r
964 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_SECTION_KEYWORD_INVALID%(Name),\r
965 LineInfo=LineInfo)\r
966 else:\r
967 ProcessFunc = gFUNCTION_MAPPING_FOR_DEFINE_SECTION[Name]\r
968 if (ProcessFunc is not None):\r
969 ProcessFunc(DefineList, Value, InfLineCommentObj)\r
970 self.Defines[ArchListString] = DefineList\r
971 else:\r
972 DefineList = InfDefSection()\r
973 LineInfo[0] = InfDefMemberObj.CurrentLine.GetFileName()\r
974 LineInfo[1] = InfDefMemberObj.CurrentLine.GetLineNo()\r
975 LineInfo[2] = InfDefMemberObj.CurrentLine.GetLineString()\r
976 DefineList.CurrentLine = LineInfo\r
977 #\r
978 # Found the process function from mapping table.\r
979 #\r
980 if Name not in gFUNCTION_MAPPING_FOR_DEFINE_SECTION.keys():\r
981 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_SECTION_KEYWORD_INVALID%(Name),\r
982 LineInfo=LineInfo)\r
983 #\r
984 # Found the process function from mapping table.\r
985 #\r
986 else:\r
987 ProcessFunc = gFUNCTION_MAPPING_FOR_DEFINE_SECTION[Name]\r
988 if (ProcessFunc is not None):\r
989 ProcessFunc(DefineList, Value, InfLineCommentObj)\r
990 self.Defines[ArchListString] = DefineList\r
991 #\r
992 # After set, check whether INF_VERSION defined.\r
993 #\r
994 if not HasFoundInfVersionFalg:\r
995 ErrorInInf(ST.ERR_INF_PARSER_NOT_SUPPORT_EDKI_INF,\r
996 ErrorCode=ToolError.EDK1_INF_ERROR,\r
997 RaiseError=True)\r
998 return True\r
999\r
1000 def GetDefines(self):\r
1001 return self.Defines\r
1002\r