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