]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/Object/Parser/InfDefineObject.py
MdeModulePkg: Change BootLogoEnableLogo use INTN for minus value
[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
65 if self.PciVendorId != None:\r
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
89 if self.PciDeviceId != None:\r
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
113 if self.PciClassCode != None:\r
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
138 if self.PciRevision != None:\r
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
162 if self.PciCompress != None:\r
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
218 if self.BaseName != None: \r
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
4234283c
LG
222 if not (BaseName == '' or BaseName == None):\r
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
246 if self.FileGuid != None: \r
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
277 if self.ModuleType != None: \r
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
312 if self.ModuleUniFileName != None:\r
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
330 if self.InfVersion != None: \r
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
343 \r
344 self.InfVersion = InfDefMember()\r
345 self.InfVersion.SetValue(InfVersion)\r
346 self.InfVersion.Comments = Comments \r
347 return True\r
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
353 ## GetInfVersion\r
354 # \r
355 def GetInfVersion(self):\r
356 return self.InfVersion\r
357\r
358 ## SetEdkReleaseVersion\r
359 #\r
360 # @param EdkReleaseVersion: EdkReleaseVersion\r
361 # \r
362 def SetEdkReleaseVersion(self, EdkReleaseVersion, Comments):\r
363 #\r
364 # Value has been set before.\r
365 #\r
366 if self.EdkReleaseVersion != None: \r
367 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND\\r
368 %(DT.TAB_INF_DEFINES_EDK_RELEASE_VERSION),\r
369 LineInfo=self.CurrentLine)\r
370 return False \r
371 #\r
372 # The EdkReleaseVersion should be 4 bytes hex string. \r
373 #\r
374 if IsValidHexVersion(EdkReleaseVersion) or \\r
375 IsValidDecVersionVal(EdkReleaseVersion):\r
376 self.EdkReleaseVersion = InfDefMember()\r
377 self.EdkReleaseVersion.SetValue(EdkReleaseVersion)\r
378 self.EdkReleaseVersion.Comments = Comments\r
379 return True\r
380 else:\r
381 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID\\r
382 %(EdkReleaseVersion),\r
383 LineInfo=self.CurrentLine)\r
384 return False\r
385\r
386 ## GetEdkReleaseVersion\r
387 # \r
388 def GetEdkReleaseVersion(self):\r
389 return self.EdkReleaseVersion \r
390\r
391 ## SetUefiSpecificationVersion\r
392 #\r
393 # @param UefiSpecificationVersion: UefiSpecificationVersion\r
394 # \r
395 def SetUefiSpecificationVersion(self, UefiSpecificationVersion, Comments):\r
396 #\r
397 # Value has been set before.\r
398 #\r
399 if self.UefiSpecificationVersion != None: \r
400 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND\\r
401 %(DT.TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION),\r
402 LineInfo=self.CurrentLine)\r
403 return False \r
404 #\r
405 # The EdkReleaseVersion should be 4 bytes hex string. \r
406 #\r
407 if IsValidHexVersion(UefiSpecificationVersion) or \\r
408 IsValidDecVersionVal(UefiSpecificationVersion):\r
409 self.UefiSpecificationVersion = InfDefMember()\r
410 self.UefiSpecificationVersion.SetValue(UefiSpecificationVersion)\r
411 self.UefiSpecificationVersion.Comments = Comments\r
412 return True\r
413 else:\r
414 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID\\r
415 %(UefiSpecificationVersion),\r
416 LineInfo=self.CurrentLine)\r
417 return False\r
418\r
419 ## GetUefiSpecificationVersion\r
420 # \r
421 def GetUefiSpecificationVersion(self):\r
422 return self.UefiSpecificationVersion \r
423\r
424 ## SetPiSpecificationVersion\r
425 #\r
426 # @param PiSpecificationVersion: PiSpecificationVersion\r
427 # \r
428 def SetPiSpecificationVersion(self, PiSpecificationVersion, Comments):\r
429 #\r
430 # Value has been set before.\r
431 #\r
432 if self.PiSpecificationVersion != None: \r
433 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND\\r
434 %(DT.TAB_INF_DEFINES_PI_SPECIFICATION_VERSION),\r
435 LineInfo=self.CurrentLine)\r
436 return False \r
437 #\r
438 # The EdkReleaseVersion should be 4 bytes hex string. \r
439 #\r
440 if IsValidHexVersion(PiSpecificationVersion) or \\r
441 IsValidDecVersionVal(PiSpecificationVersion):\r
442 self.PiSpecificationVersion = InfDefMember()\r
443 self.PiSpecificationVersion.SetValue(PiSpecificationVersion)\r
444 self.PiSpecificationVersion.Comments = Comments\r
445 return True\r
446 else:\r
447 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID\\r
448 %(PiSpecificationVersion),\r
449 LineInfo=self.CurrentLine) \r
450 return False\r
451\r
452 ## GetPiSpecificationVersion\r
453 # \r
454 def GetPiSpecificationVersion(self):\r
455 return self.PiSpecificationVersion\r
456\r
457 ## SetLibraryClass\r
458 #\r
459 # @param LibraryClass: LibraryClass\r
460 # \r
461 def SetLibraryClass(self, LibraryClass, Comments):\r
462 ValueList = GetSplitValueList(LibraryClass)\r
463 Name = ValueList[0] \r
464 if IsValidWord(Name):\r
465 InfDefineLibraryItemObj = InfDefineLibraryItem()\r
466 InfDefineLibraryItemObj.SetLibraryName(Name) \r
467 InfDefineLibraryItemObj.Comments = Comments\r
468 if len(ValueList) == 2:\r
469 Type = ValueList[1]\r
470 TypeList = GetSplitValueList(Type, ' ')\r
d40b2ee6 471 TypeList = [Type for Type in TypeList if Type != '']\r
4234283c
LG
472 for Item in TypeList:\r
473 if Item not in DT.MODULE_LIST:\r
474 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Item),\r
475 LineInfo=self.CurrentLine)\r
476 return False\r
477 InfDefineLibraryItemObj.SetTypes(TypeList) \r
478 self.LibraryClass.append(InfDefineLibraryItemObj) \r
479 else:\r
480 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Name),\r
481 LineInfo=self.CurrentLine)\r
482 return False\r
483 \r
484 return True\r
485 \r
486 def GetLibraryClass(self):\r
487 return self.LibraryClass\r
488 \r
489 def SetVersionString(self, VersionString, Comments):\r
490 #\r
491 # Value has been set before.\r
492 #\r
493 if self.VersionString != None: \r
494 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND\\r
495 %(DT.TAB_INF_DEFINES_VERSION_STRING),\r
496 LineInfo=self.CurrentLine)\r
497 return False\r
498 if not IsValidDecVersion(VersionString):\r
499 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID\\r
500 %(VersionString),\r
501 LineInfo=self.CurrentLine) \r
502 self.VersionString = InfDefMember()\r
503 self.VersionString.SetValue(VersionString)\r
504 self.VersionString.Comments = Comments\r
505 return True\r
506\r
507 \r
508 def GetVersionString(self):\r
509 return self.VersionString\r
510 \r
511 def SetPcdIsDriver(self, PcdIsDriver, Comments):\r
512 #\r
513 # Value has been set before.\r
514 #\r
515 if self.PcdIsDriver != None: \r
516 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND\\r
517 %(DT.TAB_INF_DEFINES_PCD_IS_DRIVER),\r
518 LineInfo=self.CurrentLine)\r
519 return False \r
520 if PcdIsDriver == 'PEI_PCD_DRIVER' or PcdIsDriver == 'DXE_PCD_DRIVER':\r
521 self.PcdIsDriver = InfDefMember()\r
522 self.PcdIsDriver.SetValue(PcdIsDriver)\r
523 self.PcdIsDriver.Comments = Comments\r
524 return True\r
525 else:\r
526 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(PcdIsDriver),\r
527 LineInfo=self.CurrentLine)\r
528 return False\r
529 \r
530 def GetPcdIsDriver(self):\r
531 return self.PcdIsDriver\r
532 \r
533 #\r
534 # SetEntryPoint\r
535 # \r
536 def SetEntryPoint(self, EntryPoint, Comments):\r
537 #\r
538 # It can be a list\r
539 #\r
540 ValueList = []\r
4234283c
LG
541 TokenList = GetSplitValueList(EntryPoint, DT.TAB_VALUE_SPLIT)\r
542 ValueList[0:len(TokenList)] = TokenList \r
4234283c
LG
543 InfDefineEntryPointItemObj = InfDefineEntryPointItem()\r
544 if not IsValidCVariableName(ValueList[0]):\r
545 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%\\r
546 (ValueList[0]),\r
547 LineInfo=self.CurrentLine)\r
548 InfDefineEntryPointItemObj.SetCName(ValueList[0])\r
549 if len(ValueList) == 2:\r
550 if ValueList[1].strip() == '':\r
551 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%\\r
552 (ValueList[1]),\r
553 LineInfo=self.CurrentLine)\r
554 #\r
555 # Validate FFE \r
556 #\r
557 FeatureFlagRtv = IsValidFeatureFlagExp(ValueList[1].strip())\r
558 if not FeatureFlagRtv[0]:\r
559 ErrorInInf(ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%\\r
560 (FeatureFlagRtv[1]),\r
421ccda3 561 LineInfo=self.CurrentLine) \r
4234283c
LG
562 InfDefineEntryPointItemObj.SetFeatureFlagExp(ValueList[1]) \r
563 if len(ValueList) > 2:\r
564 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(EntryPoint),\r
565 LineInfo=self.CurrentLine)\r
4234283c
LG
566 InfDefineEntryPointItemObj.Comments = Comments \r
567 self.EntryPoint.append(InfDefineEntryPointItemObj) \r
568 \r
569 def GetEntryPoint(self):\r
570 return self.EntryPoint\r
571\r
572 #\r
573 # SetUnloadImages\r
574 # \r
575 def SetUnloadImages(self, UnloadImages, Comments):\r
576 #\r
577 # It can be a list\r
578 #\r
579 ValueList = []\r
4234283c
LG
580 TokenList = GetSplitValueList(UnloadImages, DT.TAB_VALUE_SPLIT)\r
581 ValueList[0:len(TokenList)] = TokenList \r
4234283c
LG
582 InfDefineUnloadImageItemObj = InfDefineUnloadImageItem()\r
583 if not IsValidCVariableName(ValueList[0]):\r
584 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[0]),\r
585 LineInfo=self.CurrentLine)\r
586 InfDefineUnloadImageItemObj.SetCName(ValueList[0])\r
587 if len(ValueList) == 2:\r
588 if ValueList[1].strip() == '':\r
589 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[1]),\r
590 LineInfo=self.CurrentLine)\r
591 #\r
592 # Validate FFE \r
593 #\r
594 FeatureFlagRtv = IsValidFeatureFlagExp(ValueList[1].strip())\r
595 if not FeatureFlagRtv[0]:\r
596 ErrorInInf(ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%(FeatureFlagRtv[1]),\r
597 LineInfo=self.CurrentLine)\r
598 InfDefineUnloadImageItemObj.SetFeatureFlagExp(ValueList[1])\r
599 \r
600 if len(ValueList) > 2:\r
601 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(UnloadImages),\r
602 LineInfo=self.CurrentLine)\r
4234283c
LG
603 InfDefineUnloadImageItemObj.Comments = Comments\r
604 self.UnloadImages.append(InfDefineUnloadImageItemObj)\r
605 \r
606 def GetUnloadImages(self):\r
607 return self.UnloadImages\r
608\r
609 #\r
610 # SetConstructor\r
611 # \r
612 def SetConstructor(self, Constructor, Comments):\r
613 #\r
614 # It can be a list\r
615 #\r
616 ValueList = []\r
4234283c
LG
617 TokenList = GetSplitValueList(Constructor, DT.TAB_VALUE_SPLIT)\r
618 ValueList[0:len(TokenList)] = TokenList \r
4234283c
LG
619 InfDefineConstructorItemObj = InfDefineConstructorItem()\r
620 if not IsValidCVariableName(ValueList[0]):\r
621 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[0]),\r
622 LineInfo=self.CurrentLine)\r
623 InfDefineConstructorItemObj.SetCName(ValueList[0])\r
624 if len(ValueList) >= 2:\r
625 ModList = GetSplitValueList(ValueList[1], ' ')\r
626 if ValueList[1].strip() == '':\r
627 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[1]),\r
628 LineInfo=self.CurrentLine)\r
629 for ModItem in ModList:\r
630 if ModItem not in DT.MODULE_LIST:\r
631 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_MODULETYPE_INVALID%(ModItem),\r
632 LineInfo=self.CurrentLine)\r
633 InfDefineConstructorItemObj.SetSupModList(ModList) \r
634 if len(ValueList) == 3:\r
635 if ValueList[2].strip() == '':\r
636 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[2]),\r
637 LineInfo=self.CurrentLine)\r
638 #\r
639 # Validate FFE \r
640 #\r
641 FeatureFlagRtv = IsValidFeatureFlagExp(ValueList[2].strip())\r
642 if not FeatureFlagRtv[0]:\r
643 ErrorInInf(ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%(FeatureFlagRtv[2]),\r
644 LineInfo=self.CurrentLine)\r
645 InfDefineConstructorItemObj.SetFeatureFlagExp(ValueList[2])\r
646 \r
647 if len(ValueList) > 3:\r
648 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Constructor),\r
649 LineInfo=self.CurrentLine)\r
4234283c
LG
650 InfDefineConstructorItemObj.Comments = Comments \r
651 self.Constructor.append(InfDefineConstructorItemObj) \r
652 \r
653 def GetConstructor(self):\r
654 return self.Constructor\r
655\r
656 #\r
657 # SetDestructor\r
658 # \r
659 def SetDestructor(self, Destructor, Comments):\r
660 #\r
661 # It can be a list and only 1 set to TRUE\r
662 # \r
663 ValueList = []\r
4234283c
LG
664 TokenList = GetSplitValueList(Destructor, DT.TAB_VALUE_SPLIT)\r
665 ValueList[0:len(TokenList)] = TokenList \r
4234283c
LG
666 InfDefineDestructorItemObj = InfDefineDestructorItem()\r
667 if not IsValidCVariableName(ValueList[0]):\r
668 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[0]),\r
669 LineInfo=self.CurrentLine)\r
670 InfDefineDestructorItemObj.SetCName(ValueList[0])\r
671 if len(ValueList) >= 2:\r
672 ModList = GetSplitValueList(ValueList[1].strip(), ' ')\r
673 if ValueList[1].strip() == '':\r
674 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[1]),\r
675 LineInfo=self.CurrentLine)\r
676 for ModItem in ModList:\r
677 if ModItem not in DT.MODULE_LIST:\r
678 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_MODULETYPE_INVALID%(ModItem),\r
679 LineInfo=self.CurrentLine)\r
680 InfDefineDestructorItemObj.SetSupModList(ModList) \r
681 if len(ValueList) == 3:\r
682 if ValueList[2].strip() == '':\r
683 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[2]),\r
684 LineInfo=self.CurrentLine)\r
685 #\r
686 # Validate FFE \r
687 #\r
688 FeatureFlagRtv = IsValidFeatureFlagExp(ValueList[2].strip())\r
689 if not FeatureFlagRtv[0]:\r
690 ErrorInInf(ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%(FeatureFlagRtv[1]),\r
691 LineInfo=self.CurrentLine)\r
692 InfDefineDestructorItemObj.SetFeatureFlagExp(ValueList[2])\r
693 \r
694 if len(ValueList) > 3:\r
695 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Destructor),\r
696 LineInfo=self.CurrentLine)\r
697 \r
698 InfDefineDestructorItemObj.Comments = Comments \r
699 self.Destructor.append(InfDefineDestructorItemObj) \r
700 \r
701 def GetDestructor(self):\r
702 return self.Destructor\r
703 \r
704 def SetShadow(self, Shadow, Comments):\r
705 #\r
706 # Value has been set before.\r
707 #\r
708 if self.Shadow != None:\r
709 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND%(DT.TAB_INF_DEFINES_SHADOW),\r
710 LineInfo=self.CurrentLine)\r
711 return False \r
712 if (IsValidBoolType(Shadow)):\r
713 self.Shadow = InfDefMember()\r
714 self.Shadow.SetValue(Shadow)\r
715 self.Shadow.Comments = Comments\r
716 return True\r
717 else:\r
718 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Shadow),\r
719 LineInfo=self.CurrentLine)\r
720 return False\r
721 def GetShadow(self):\r
722 return self.Shadow\r
723\r
4234283c
LG
724 #\r
725 # <Family> ::= {"MSFT"} {"GCC"}\r
726 # <CustomMake> ::= [<Family> "|"] <Filename>\r
727 #\r
728 def SetCustomMakefile(self, CustomMakefile, Comments):\r
729 if not (CustomMakefile == '' or CustomMakefile == None):\r
730 ValueList = GetSplitValueList(CustomMakefile)\r
731 if len(ValueList) == 1:\r
732 FileName = ValueList[0]\r
733 Family = ''\r
734 else:\r
735 Family = ValueList[0]\r
736 FileName = ValueList[1]\r
737 Family = Family.strip()\r
738 if Family != '':\r
739 if not IsValidFamily(Family):\r
740 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Family),\r
741 LineInfo=self.CurrentLine)\r
742 return False\r
743 #\r
744 # The MakefileName specified file should exist\r
745 #\r
746 IsValidFileFlag = False\r
747 ModulePath = os.path.split(self.CurrentLine[0])[0]\r
748 if IsValidPath(FileName, ModulePath):\r
749 IsValidFileFlag = True \r
750 else:\r
751 ErrorInInf(ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(FileName),\r
752 LineInfo=self.CurrentLine)\r
753 return False\r
754 if IsValidFileFlag:\r
755 FileName = ConvPathFromAbsToRel(FileName, GlobalData.gINF_MODULE_DIR) \r
756 self.CustomMakefile.append((Family, FileName, Comments))\r
757 IsValidFileFlag = False\r
758 return True\r
759 else:\r
760 return False\r
761 \r
762 def GetCustomMakefile(self):\r
763 return self.CustomMakefile\r
764 \r
765 #\r
766 # ["SPEC" <Spec> <EOL>]*{0,}\r
767 # <Spec> ::= <Word> "=" <VersionVal>\r
768 # <VersionVal> ::= {<HexVersion>] {<DecVersion>}\r
769 # <HexNumber> ::= "0x" [<HexDigit>]{1,}\r
770 # <DecVersion> ::= (0-9){1,} ["." (0-9){1,2}]\r
771 #\r
772 def SetSpecification(self, Specification, Comments):\r
773 #\r
774 # Valid the value of Specification\r
775 #\r
776 __ValueList = []\r
777 TokenList = GetSplitValueList(Specification, DT.TAB_EQUAL_SPLIT, 1)\r
778 __ValueList[0:len(TokenList)] = TokenList\r
779 if len(__ValueList) != 2:\r
780 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_NO_NAME + ' Or ' + ST.ERR_INF_PARSER_DEFINE_ITEM_NO_VALUE,\r
781 LineInfo=self.CurrentLine)\r
782 Name = __ValueList[0].strip()\r
783 Version = __ValueList[1].strip() \r
784 if IsValidIdentifier(Name):\r
785 if IsValidDecVersion(Version):\r
786 self.Specification.append((Name, Version, Comments))\r
787 return True\r
788 else:\r
789 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Version),\r
790 LineInfo=self.CurrentLine)\r
791 return False\r
792 else: \r
793 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Name),\r
794 LineInfo=self.CurrentLine)\r
421ccda3 795 return False \r
4234283c
LG
796 return True\r
797\r
798 def GetSpecification(self):\r
799 return self.Specification\r
800 \r
801 #\r
802 # [<UefiHiiResource> <EOL>]{0,1}\r
803 # <UefiHiiResource> ::= "UEFI_HII_RESOURCE_SECTION" "=" <BoolType>\r
804 #\r
805 def SetUefiHiiResourceSection(self, UefiHiiResourceSection, Comments):\r
806 #\r
807 # Value has been set before.\r
808 #\r
809 if self.UefiHiiResourceSection != None:\r
810 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND\r
811 %(DT.TAB_INF_DEFINES_UEFI_HII_RESOURCE_SECTION),\r
812 LineInfo=self.CurrentLine)\r
813 return False \r
814 if not (UefiHiiResourceSection == '' or UefiHiiResourceSection == None):\r
815 if (IsValidBoolType(UefiHiiResourceSection)):\r
816 self.UefiHiiResourceSection = InfDefMember()\r
817 self.UefiHiiResourceSection.SetValue(UefiHiiResourceSection)\r
818 self.UefiHiiResourceSection.Comments = Comments \r
819 return True\r
820 else:\r
821 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(UefiHiiResourceSection),\r
822 LineInfo=self.CurrentLine)\r
823 return False\r
824 else:\r
825 return False\r
826 \r
827 def GetUefiHiiResourceSection(self):\r
828 return self.UefiHiiResourceSection\r
829 \r
830 def SetDpxSource(self, DpxSource, Comments): \r
831 #\r
832 # The MakefileName specified file should exist\r
833 #\r
834 IsValidFileFlag = False\r
835 ModulePath = os.path.split(self.CurrentLine[0])[0]\r
836 if IsValidPath(DpxSource, ModulePath):\r
837 IsValidFileFlag = True \r
838 else:\r
839 ErrorInInf(ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(DpxSource),\r
840 LineInfo=self.CurrentLine)\r
841 return False\r
842 if IsValidFileFlag:\r
843 DpxSource = ConvPathFromAbsToRel(DpxSource, \r
844 GlobalData.gINF_MODULE_DIR) \r
845 self.DpxSource.append((DpxSource, Comments))\r
846 IsValidFileFlag = False\r
847 return True \r
848\r
849 def GetDpxSource(self):\r
850 return self.DpxSource\r
851\r
852gFUNCTION_MAPPING_FOR_DEFINE_SECTION = {\r
853 #\r
854 # Required Fields\r
855 #\r
856 DT.TAB_INF_DEFINES_BASE_NAME : InfDefSection.SetBaseName,\r
857 DT.TAB_INF_DEFINES_FILE_GUID : InfDefSection.SetFileGuid,\r
858 DT.TAB_INF_DEFINES_MODULE_TYPE : InfDefSection.SetModuleType,\r
859 #\r
860 # Required by EDKII style INF file\r
861 #\r
862 DT.TAB_INF_DEFINES_INF_VERSION : InfDefSection.SetInfVersion,\r
863 #\r
864 # Optional Fields\r
865 # \r
421ccda3 866 DT.TAB_INF_DEFINES_MODULE_UNI_FILE : InfDefSection.SetModuleUniFileName,\r
4234283c
LG
867 DT.TAB_INF_DEFINES_EDK_RELEASE_VERSION : InfDefSection.SetEdkReleaseVersion,\r
868 DT.TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION : InfDefSection.SetUefiSpecificationVersion,\r
869 DT.TAB_INF_DEFINES_PI_SPECIFICATION_VERSION : InfDefSection.SetPiSpecificationVersion,\r
870 DT.TAB_INF_DEFINES_LIBRARY_CLASS : InfDefSection.SetLibraryClass,\r
871 DT.TAB_INF_DEFINES_VERSION_STRING : InfDefSection.SetVersionString,\r
872 DT.TAB_INF_DEFINES_PCD_IS_DRIVER : InfDefSection.SetPcdIsDriver,\r
873 DT.TAB_INF_DEFINES_ENTRY_POINT : InfDefSection.SetEntryPoint,\r
874 DT.TAB_INF_DEFINES_UNLOAD_IMAGE : InfDefSection.SetUnloadImages,\r
875 DT.TAB_INF_DEFINES_CONSTRUCTOR : InfDefSection.SetConstructor,\r
876 DT.TAB_INF_DEFINES_DESTRUCTOR : InfDefSection.SetDestructor,\r
877 DT.TAB_INF_DEFINES_SHADOW : InfDefSection.SetShadow,\r
878 DT.TAB_INF_DEFINES_PCI_VENDOR_ID : InfDefSection.SetPciVendorId,\r
879 DT.TAB_INF_DEFINES_PCI_DEVICE_ID : InfDefSection.SetPciDeviceId,\r
880 DT.TAB_INF_DEFINES_PCI_CLASS_CODE : InfDefSection.SetPciClassCode, \r
881 DT.TAB_INF_DEFINES_PCI_REVISION : InfDefSection.SetPciRevision,\r
882 DT.TAB_INF_DEFINES_PCI_COMPRESS : InfDefSection.SetPciCompress,\r
883 DT.TAB_INF_DEFINES_CUSTOM_MAKEFILE : InfDefSection.SetCustomMakefile, \r
884 DT.TAB_INF_DEFINES_SPEC : InfDefSection.SetSpecification,\r
885 DT.TAB_INF_DEFINES_UEFI_HII_RESOURCE_SECTION : InfDefSection.SetUefiHiiResourceSection,\r
886 DT.TAB_INF_DEFINES_DPX_SOURCE : InfDefSection.SetDpxSource\r
887}\r
888\r
889## InfDefMember\r
890#\r
891#\r
892class InfDefMember():\r
893 def __init__(self, Name='', Value=''):\r
894 self.Comments = InfLineCommentObject()\r
895 self.Name = Name\r
896 self.Value = Value\r
897 self.CurrentLine = CurrentLine()\r
4234283c
LG
898 def GetName(self):\r
899 return self.Name\r
900 def SetName(self, Name):\r
901 self.Name = Name\r
902 def GetValue(self):\r
903 return self.Value\r
904 def SetValue(self, Value):\r
905 self.Value = Value\r
906 \r
907## InfDefObject\r
908#\r
909#\r
910class InfDefObject(InfSectionCommonDef):\r
911 def __init__(self):\r
912 self.Defines = Sdict()\r
913 InfSectionCommonDef.__init__(self)\r
914 def SetDefines(self, DefineContent, Arch = None):\r
915 #\r
916 # Validate Arch\r
917 #\r
918 HasFoundInfVersionFalg = False\r
919 LineInfo = ['', -1, '']\r
421ccda3 920 ArchListString = ' '.join(Arch) \r
4234283c
LG
921 #\r
922 # Parse Define items.\r
923 #\r
924 for InfDefMemberObj in DefineContent:\r
925 ProcessFunc = None\r
926 Name = InfDefMemberObj.GetName()\r
927 Value = InfDefMemberObj.GetValue()\r
421ccda3
HC
928 if Name == DT.TAB_INF_DEFINES_MODULE_UNI_FILE:\r
929 ValidateUNIFilePath(Value)\r
930 Value = os.path.join(os.path.dirname(InfDefMemberObj.CurrentLine.FileName), Value)\r
931 if not os.path.isfile(Value) or not os.path.exists(Value):\r
932 LineInfo[0] = InfDefMemberObj.CurrentLine.GetFileName()\r
933 LineInfo[1] = InfDefMemberObj.CurrentLine.GetLineNo()\r
934 LineInfo[2] = InfDefMemberObj.CurrentLine.GetLineString()\r
935 ErrorInInf(ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(Name),\r
936 LineInfo=LineInfo)\r
4234283c
LG
937 InfLineCommentObj = InfLineCommentObject()\r
938 InfLineCommentObj.SetHeaderComments(InfDefMemberObj.Comments.GetHeaderComments())\r
939 InfLineCommentObj.SetTailComments(InfDefMemberObj.Comments.GetTailComments())\r
940 if Name == 'COMPONENT_TYPE':\r
941 ErrorInInf(ST.ERR_INF_PARSER_NOT_SUPPORT_EDKI_INF,\r
942 ErrorCode=ToolError.EDK1_INF_ERROR,\r
943 RaiseError=True)\r
944 if Name == DT.TAB_INF_DEFINES_INF_VERSION:\r
945 HasFoundInfVersionFalg = True \r
4234283c
LG
946 if not (Name == '' or Name == None):\r
947 #\r
948 # Process "SPEC" Keyword definition.\r
949 #\r
950 ReName = re.compile(r"SPEC ", re.DOTALL)\r
951 if ReName.match(Name):\r
952 SpecValue = Name[Name.find("SPEC") + len("SPEC"):].strip()\r
953 Name = "SPEC"\r
954 Value = SpecValue + " = " + Value\r
955 if self.Defines.has_key(ArchListString):\r
956 DefineList = self.Defines[ArchListString] \r
957 LineInfo[0] = InfDefMemberObj.CurrentLine.GetFileName()\r
958 LineInfo[1] = InfDefMemberObj.CurrentLine.GetLineNo()\r
959 LineInfo[2] = InfDefMemberObj.CurrentLine.GetLineString()\r
960 DefineList.CurrentLine = LineInfo\r
961 #\r
962 # Found the process function from mapping table.\r
963 #\r
964 if Name not in gFUNCTION_MAPPING_FOR_DEFINE_SECTION.keys():\r
965 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_SECTION_KEYWORD_INVALID%(Name),\r
421ccda3 966 LineInfo=LineInfo) \r
4234283c
LG
967 else:\r
968 ProcessFunc = gFUNCTION_MAPPING_FOR_DEFINE_SECTION[Name]\r
969 if (ProcessFunc != None):\r
970 ProcessFunc(DefineList, Value, InfLineCommentObj)\r
971 self.Defines[ArchListString] = DefineList\r
972 else:\r
973 DefineList = InfDefSection()\r
974 LineInfo[0] = InfDefMemberObj.CurrentLine.GetFileName()\r
975 LineInfo[1] = InfDefMemberObj.CurrentLine.GetLineNo()\r
976 LineInfo[2] = InfDefMemberObj.CurrentLine.GetLineString()\r
977 DefineList.CurrentLine = LineInfo\r
978 #\r
979 # Found the process function from mapping table.\r
980 #\r
981 if Name not in gFUNCTION_MAPPING_FOR_DEFINE_SECTION.keys():\r
982 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_SECTION_KEYWORD_INVALID%(Name),\r
983 LineInfo=LineInfo)\r
984 #\r
985 # Found the process function from mapping table.\r
986 # \r
987 else:\r
988 ProcessFunc = gFUNCTION_MAPPING_FOR_DEFINE_SECTION[Name]\r
989 if (ProcessFunc != None):\r
990 ProcessFunc(DefineList, Value, InfLineCommentObj)\r
991 self.Defines[ArchListString] = DefineList\r
4234283c
LG
992 #\r
993 # After set, check whether INF_VERSION defined.\r
994 #\r
995 if not HasFoundInfVersionFalg:\r
996 ErrorInInf(ST.ERR_INF_PARSER_NOT_SUPPORT_EDKI_INF,\r
997 ErrorCode=ToolError.EDK1_INF_ERROR,\r
998 RaiseError=True) \r
999 return True\r
1000 \r
1001 def GetDefines(self):\r
1002 return self.Defines \r
1003