]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/Object/Parser/InfDefineObject.py
BaseTools: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Object / Parser / InfDefineObject.py
CommitLineData
4234283c 1## @file\r
f7496d71 2# This file is used to define class objects of [Defines] section for INF file.\r
4234283c
LG
3# It will consumed by InfParser\r
4#\r
64285f15 5# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
4234283c 6#\r
2e351cbe 7# SPDX-License-Identifier: BSD-2-Clause-Patent\r
4234283c
LG
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
f7496d71 18from Library import GlobalData\r
4234283c 19from Library import DataType as DT\r
64285f15 20from Library.StringUtils import GetSplitValueList\r
4234283c
LG
21from Library.Misc import CheckGuidRegFormat\r
22from Library.Misc import Sdict\r
23from Library.Misc import ConvPathFromAbsToRel\r
421ccda3 24from Library.Misc import ValidateUNIFilePath\r
f7496d71 25from Library.ExpressionValidate import IsValidFeatureFlagExp\r
4234283c 26from Library.ParserValidate import IsValidWord\r
f7496d71
LG
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
4234283c
LG
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
f7496d71 44from Object.Parser.InfDefineCommonObject import InfDefineConstructorItem\r
4234283c
LG
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
4231a819 59 if self.PciVendorId is not None:\r
4234283c
LG
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
f7496d71 62 return False\r
4234283c 63 #\r
f7496d71 64 # The PciVendorId should be hex string.\r
4234283c
LG
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
f7496d71 75\r
4234283c
LG
76 def GetPciVendorId(self):\r
77 return self.PciVendorId\r
f7496d71 78\r
4234283c
LG
79 def SetPciDeviceId(self, PciDeviceId, Comments):\r
80 #\r
81 # Value has been set before.\r
82 #\r
4231a819 83 if self.PciDeviceId is not None:\r
4234283c
LG
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
f7496d71 86 return False\r
4234283c 87 #\r
f7496d71 88 # The PciDeviceId should be hex string.\r
4234283c
LG
89 #\r
90 if (IsValidHex(PciDeviceId)):\r
91 self.PciDeviceId = InfDefMember()\r
92 self.PciDeviceId.SetValue(PciDeviceId)\r
f7496d71 93 self.PciDeviceId.Comments = Comments\r
4234283c
LG
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
f7496d71 99\r
4234283c
LG
100 def GetPciDeviceId(self):\r
101 return self.PciDeviceId\r
f7496d71 102\r
4234283c
LG
103 def SetPciClassCode(self, PciClassCode, Comments):\r
104 #\r
105 # Value has been set before.\r
106 #\r
4231a819 107 if self.PciClassCode is not None:\r
4234283c
LG
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
f7496d71 110 return False\r
4234283c 111 #\r
f7496d71 112 # The PciClassCode should be 4 bytes hex string.\r
4234283c
LG
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
f7496d71 124\r
4234283c
LG
125 def GetPciClassCode(self):\r
126 return self.PciClassCode\r
f7496d71 127\r
4234283c
LG
128 def SetPciRevision(self, PciRevision, Comments):\r
129 #\r
130 # Value has been set before.\r
131 #\r
4231a819 132 if self.PciRevision is not None:\r
4234283c
LG
133 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND%(DT.TAB_INF_DEFINES_PCI_REVISION),\r
134 LineInfo=self.CurrentLine)\r
f7496d71 135 return False\r
4234283c 136 #\r
f7496d71 137 # The PciRevision should be 4 bytes hex string.\r
4234283c
LG
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
f7496d71 148\r
4234283c
LG
149 def GetPciRevision(self):\r
150 return self.PciRevision\r
f7496d71 151\r
4234283c
LG
152 def SetPciCompress(self, PciCompress, Comments):\r
153 #\r
154 # Value has been set before.\r
155 #\r
4231a819 156 if self.PciCompress is not None:\r
4234283c
LG
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
f7496d71 160\r
4234283c 161 #\r
f7496d71 162 # The PciCompress should be 'TRUE' or 'FALSE'.\r
4234283c
LG
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
f7496d71 172 return False\r
4234283c 173 def GetPciCompress(self):\r
f7496d71 174 return self.PciCompress\r
4234283c
LG
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
421ccda3 183 self.ModuleUniFileName = None\r
4234283c
LG
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
f7496d71 207 #\r
4234283c
LG
208 def SetBaseName(self, BaseName, Comments):\r
209 #\r
210 # Value has been set before.\r
211 #\r
f7496d71 212 if self.BaseName is not None:\r
4234283c
LG
213 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND%(DT.TAB_INF_DEFINES_BASE_NAME),\r
214 LineInfo=self.CurrentLine)\r
f7496d71 215 return False\r
4231a819 216 if not (BaseName == '' or BaseName is None):\r
4234283c
LG
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
f7496d71 228 #\r
4234283c
LG
229 def GetBaseName(self):\r
230 return self.BaseName\r
231\r
232 ## SetFileGuid\r
233 #\r
234 # @param FileGuid: FileGuid\r
f7496d71 235 #\r
4234283c
LG
236 def SetFileGuid(self, FileGuid, Comments):\r
237 #\r
238 # Value has been set before.\r
239 #\r
f7496d71 240 if self.FileGuid is not None:\r
4234283c
LG
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
f7496d71 244 return False\r
4234283c
LG
245 #\r
246 # Do verification of GUID content/format\r
f7496d71 247 #\r
4234283c
LG
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
f7496d71 259 #\r
4234283c
LG
260 def GetFileGuid(self):\r
261 return self.FileGuid\r
262\r
263 ## SetModuleType\r
264 #\r
265 # @param ModuleType: ModuleType\r
f7496d71 266 #\r
4234283c
LG
267 def SetModuleType(self, ModuleType, Comments):\r
268 #\r
269 # Value has been set before.\r
270 #\r
f7496d71 271 if self.ModuleType is not None:\r
4234283c
LG
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
f7496d71 275 return False\r
4234283c
LG
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
f7496d71 286 self.ModuleType.Comments = Comments\r
4234283c
LG
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
f7496d71 295 #\r
4234283c
LG
296 def GetModuleType(self):\r
297 return self.ModuleType\r
f7496d71 298\r
421ccda3
HC
299 ## SetModuleUniFileName\r
300 #\r
301 # @param ModuleUniFileName: ModuleUniFileName\r
f7496d71 302 #\r
421ccda3
HC
303 def SetModuleUniFileName(self, ModuleUniFileName, Comments):\r
304 if Comments:\r
305 pass\r
4231a819 306 if self.ModuleUniFileName is not None:\r
421ccda3
HC
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
f7496d71 312 #\r
421ccda3
HC
313 def GetModuleUniFileName(self):\r
314 return self.ModuleUniFileName\r
f7496d71 315\r
4234283c
LG
316 ## SetInfVersion\r
317 #\r
318 # @param InfVersion: InfVersion\r
f7496d71 319 #\r
4234283c
LG
320 def SetInfVersion(self, InfVersion, Comments):\r
321 #\r
322 # Value has been set before.\r
323 #\r
f7496d71 324 if self.InfVersion is not None:\r
4234283c
LG
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
f7496d71 328 return False\r
4234283c 329 #\r
f7496d71 330 # The InfVersion should be 4 bytes hex string.\r
4234283c
LG
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
48b77f5e
HC
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
4234283c
LG
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
48b77f5e
HC
347 self.InfVersion = InfDefMember()\r
348 self.InfVersion.SetValue(InfVersion)\r
349 self.InfVersion.Comments = Comments\r
350 return True\r
351\r
4234283c 352 ## GetInfVersion\r
f7496d71 353 #\r
4234283c
LG
354 def GetInfVersion(self):\r
355 return self.InfVersion\r
356\r
357 ## SetEdkReleaseVersion\r
358 #\r
359 # @param EdkReleaseVersion: EdkReleaseVersion\r
f7496d71 360 #\r
4234283c
LG
361 def SetEdkReleaseVersion(self, EdkReleaseVersion, Comments):\r
362 #\r
363 # Value has been set before.\r
364 #\r
f7496d71 365 if self.EdkReleaseVersion is not None:\r
4234283c
LG
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
f7496d71 369 return False\r
4234283c 370 #\r
f7496d71 371 # The EdkReleaseVersion should be 4 bytes hex string.\r
4234283c
LG
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
f7496d71 386 #\r
4234283c 387 def GetEdkReleaseVersion(self):\r
f7496d71 388 return self.EdkReleaseVersion\r
4234283c
LG
389\r
390 ## SetUefiSpecificationVersion\r
391 #\r
392 # @param UefiSpecificationVersion: UefiSpecificationVersion\r
f7496d71 393 #\r
4234283c
LG
394 def SetUefiSpecificationVersion(self, UefiSpecificationVersion, Comments):\r
395 #\r
396 # Value has been set before.\r
397 #\r
f7496d71 398 if self.UefiSpecificationVersion is not None:\r
4234283c
LG
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
f7496d71 402 return False\r
4234283c 403 #\r
f7496d71 404 # The EdkReleaseVersion should be 4 bytes hex string.\r
4234283c
LG
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
f7496d71 419 #\r
4234283c 420 def GetUefiSpecificationVersion(self):\r
f7496d71 421 return self.UefiSpecificationVersion\r
4234283c
LG
422\r
423 ## SetPiSpecificationVersion\r
424 #\r
425 # @param PiSpecificationVersion: PiSpecificationVersion\r
f7496d71 426 #\r
4234283c
LG
427 def SetPiSpecificationVersion(self, PiSpecificationVersion, Comments):\r
428 #\r
429 # Value has been set before.\r
430 #\r
f7496d71 431 if self.PiSpecificationVersion is not None:\r
4234283c
LG
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
f7496d71 435 return False\r
4234283c 436 #\r
f7496d71 437 # The EdkReleaseVersion should be 4 bytes hex string.\r
4234283c
LG
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
f7496d71 448 LineInfo=self.CurrentLine)\r
4234283c
LG
449 return False\r
450\r
451 ## GetPiSpecificationVersion\r
f7496d71 452 #\r
4234283c
LG
453 def GetPiSpecificationVersion(self):\r
454 return self.PiSpecificationVersion\r
455\r
456 ## SetLibraryClass\r
457 #\r
458 # @param LibraryClass: LibraryClass\r
f7496d71 459 #\r
4234283c
LG
460 def SetLibraryClass(self, LibraryClass, Comments):\r
461 ValueList = GetSplitValueList(LibraryClass)\r
f7496d71 462 Name = ValueList[0]\r
4234283c
LG
463 if IsValidWord(Name):\r
464 InfDefineLibraryItemObj = InfDefineLibraryItem()\r
f7496d71 465 InfDefineLibraryItemObj.SetLibraryName(Name)\r
4234283c
LG
466 InfDefineLibraryItemObj.Comments = Comments\r
467 if len(ValueList) == 2:\r
468 Type = ValueList[1]\r
469 TypeList = GetSplitValueList(Type, ' ')\r
d40b2ee6 470 TypeList = [Type for Type in TypeList if Type != '']\r
4234283c
LG
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
f7496d71
LG
476 InfDefineLibraryItemObj.SetTypes(TypeList)\r
477 self.LibraryClass.append(InfDefineLibraryItemObj)\r
4234283c
LG
478 else:\r
479 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Name),\r
480 LineInfo=self.CurrentLine)\r
481 return False\r
f7496d71 482\r
4234283c 483 return True\r
f7496d71 484\r
4234283c
LG
485 def GetLibraryClass(self):\r
486 return self.LibraryClass\r
f7496d71 487\r
4234283c
LG
488 def SetVersionString(self, VersionString, Comments):\r
489 #\r
490 # Value has been set before.\r
491 #\r
f7496d71 492 if self.VersionString is not None:\r
4234283c
LG
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
f7496d71 500 LineInfo=self.CurrentLine)\r
4234283c
LG
501 self.VersionString = InfDefMember()\r
502 self.VersionString.SetValue(VersionString)\r
503 self.VersionString.Comments = Comments\r
504 return True\r
505\r
f7496d71 506\r
4234283c
LG
507 def GetVersionString(self):\r
508 return self.VersionString\r
f7496d71 509\r
4234283c
LG
510 def SetPcdIsDriver(self, PcdIsDriver, Comments):\r
511 #\r
512 # Value has been set before.\r
513 #\r
f7496d71 514 if self.PcdIsDriver is not None:\r
4234283c
LG
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
f7496d71 518 return False\r
4234283c
LG
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
f7496d71 528\r
4234283c
LG
529 def GetPcdIsDriver(self):\r
530 return self.PcdIsDriver\r
f7496d71 531\r
4234283c
LG
532 #\r
533 # SetEntryPoint\r
f7496d71 534 #\r
4234283c
LG
535 def SetEntryPoint(self, EntryPoint, Comments):\r
536 #\r
537 # It can be a list\r
538 #\r
539 ValueList = []\r
4234283c 540 TokenList = GetSplitValueList(EntryPoint, DT.TAB_VALUE_SPLIT)\r
f7496d71 541 ValueList[0:len(TokenList)] = TokenList\r
4234283c
LG
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
f7496d71 554 # Validate FFE\r
4234283c
LG
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
f7496d71
LG
560 LineInfo=self.CurrentLine)\r
561 InfDefineEntryPointItemObj.SetFeatureFlagExp(ValueList[1])\r
4234283c
LG
562 if len(ValueList) > 2:\r
563 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(EntryPoint),\r
564 LineInfo=self.CurrentLine)\r
f7496d71
LG
565 InfDefineEntryPointItemObj.Comments = Comments\r
566 self.EntryPoint.append(InfDefineEntryPointItemObj)\r
567\r
4234283c
LG
568 def GetEntryPoint(self):\r
569 return self.EntryPoint\r
570\r
571 #\r
572 # SetUnloadImages\r
f7496d71 573 #\r
4234283c
LG
574 def SetUnloadImages(self, UnloadImages, Comments):\r
575 #\r
576 # It can be a list\r
577 #\r
578 ValueList = []\r
4234283c 579 TokenList = GetSplitValueList(UnloadImages, DT.TAB_VALUE_SPLIT)\r
f7496d71 580 ValueList[0:len(TokenList)] = TokenList\r
4234283c
LG
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
f7496d71 591 # Validate FFE\r
4234283c
LG
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
f7496d71 598\r
4234283c
LG
599 if len(ValueList) > 2:\r
600 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(UnloadImages),\r
601 LineInfo=self.CurrentLine)\r
4234283c
LG
602 InfDefineUnloadImageItemObj.Comments = Comments\r
603 self.UnloadImages.append(InfDefineUnloadImageItemObj)\r
f7496d71 604\r
4234283c
LG
605 def GetUnloadImages(self):\r
606 return self.UnloadImages\r
607\r
608 #\r
609 # SetConstructor\r
f7496d71 610 #\r
4234283c
LG
611 def SetConstructor(self, Constructor, Comments):\r
612 #\r
613 # It can be a list\r
614 #\r
615 ValueList = []\r
4234283c 616 TokenList = GetSplitValueList(Constructor, DT.TAB_VALUE_SPLIT)\r
f7496d71 617 ValueList[0:len(TokenList)] = TokenList\r
4234283c
LG
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
f7496d71 632 InfDefineConstructorItemObj.SetSupModList(ModList)\r
4234283c
LG
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
f7496d71 638 # Validate FFE\r
4234283c
LG
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
f7496d71 645\r
4234283c
LG
646 if len(ValueList) > 3:\r
647 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Constructor),\r
648 LineInfo=self.CurrentLine)\r
f7496d71
LG
649 InfDefineConstructorItemObj.Comments = Comments\r
650 self.Constructor.append(InfDefineConstructorItemObj)\r
651\r
4234283c
LG
652 def GetConstructor(self):\r
653 return self.Constructor\r
654\r
655 #\r
656 # SetDestructor\r
f7496d71 657 #\r
4234283c
LG
658 def SetDestructor(self, Destructor, Comments):\r
659 #\r
660 # It can be a list and only 1 set to TRUE\r
f7496d71 661 #\r
4234283c 662 ValueList = []\r
4234283c 663 TokenList = GetSplitValueList(Destructor, DT.TAB_VALUE_SPLIT)\r
f7496d71 664 ValueList[0:len(TokenList)] = TokenList\r
4234283c
LG
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
f7496d71 679 InfDefineDestructorItemObj.SetSupModList(ModList)\r
4234283c
LG
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
f7496d71 685 # Validate FFE\r
4234283c
LG
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
f7496d71 692\r
4234283c
LG
693 if len(ValueList) > 3:\r
694 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Destructor),\r
695 LineInfo=self.CurrentLine)\r
f7496d71
LG
696\r
697 InfDefineDestructorItemObj.Comments = Comments\r
698 self.Destructor.append(InfDefineDestructorItemObj)\r
699\r
4234283c
LG
700 def GetDestructor(self):\r
701 return self.Destructor\r
f7496d71 702\r
4234283c
LG
703 def SetShadow(self, Shadow, Comments):\r
704 #\r
705 # Value has been set before.\r
706 #\r
4231a819 707 if self.Shadow is not None:\r
4234283c
LG
708 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND%(DT.TAB_INF_DEFINES_SHADOW),\r
709 LineInfo=self.CurrentLine)\r
f7496d71 710 return False\r
4234283c
LG
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
4234283c
LG
723 #\r
724 # <Family> ::= {"MSFT"} {"GCC"}\r
725 # <CustomMake> ::= [<Family> "|"] <Filename>\r
726 #\r
727 def SetCustomMakefile(self, CustomMakefile, Comments):\r
4231a819 728 if not (CustomMakefile == '' or CustomMakefile is None):\r
4234283c
LG
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
f7496d71 748 IsValidFileFlag = True\r
4234283c
LG
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
f7496d71 754 FileName = ConvPathFromAbsToRel(FileName, GlobalData.gINF_MODULE_DIR)\r
4234283c
LG
755 self.CustomMakefile.append((Family, FileName, Comments))\r
756 IsValidFileFlag = False\r
757 return True\r
758 else:\r
759 return False\r
f7496d71 760\r
4234283c
LG
761 def GetCustomMakefile(self):\r
762 return self.CustomMakefile\r
f7496d71 763\r
4234283c
LG
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
f7496d71 782 Version = __ValueList[1].strip()\r
4234283c
LG
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
f7496d71 791 else:\r
4234283c
LG
792 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Name),\r
793 LineInfo=self.CurrentLine)\r
f7496d71 794 return False\r
4234283c
LG
795 return True\r
796\r
797 def GetSpecification(self):\r
798 return self.Specification\r
f7496d71 799\r
4234283c
LG
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
4231a819 808 if self.UefiHiiResourceSection is not None:\r
4234283c
LG
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
f7496d71 812 return False\r
4231a819 813 if not (UefiHiiResourceSection == '' or UefiHiiResourceSection is None):\r
4234283c
LG
814 if (IsValidBoolType(UefiHiiResourceSection)):\r
815 self.UefiHiiResourceSection = InfDefMember()\r
816 self.UefiHiiResourceSection.SetValue(UefiHiiResourceSection)\r
f7496d71 817 self.UefiHiiResourceSection.Comments = Comments\r
4234283c
LG
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
f7496d71 825\r
4234283c
LG
826 def GetUefiHiiResourceSection(self):\r
827 return self.UefiHiiResourceSection\r
f7496d71
LG
828\r
829 def SetDpxSource(self, DpxSource, Comments):\r
4234283c
LG
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
f7496d71 836 IsValidFileFlag = True\r
4234283c
LG
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
f7496d71
LG
842 DpxSource = ConvPathFromAbsToRel(DpxSource,\r
843 GlobalData.gINF_MODULE_DIR)\r
4234283c
LG
844 self.DpxSource.append((DpxSource, Comments))\r
845 IsValidFileFlag = False\r
f7496d71 846 return True\r
4234283c
LG
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
f7496d71 864 #\r
421ccda3 865 DT.TAB_INF_DEFINES_MODULE_UNI_FILE : InfDefSection.SetModuleUniFileName,\r
4234283c
LG
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
f7496d71 879 DT.TAB_INF_DEFINES_PCI_CLASS_CODE : InfDefSection.SetPciClassCode,\r
4234283c
LG
880 DT.TAB_INF_DEFINES_PCI_REVISION : InfDefSection.SetPciRevision,\r
881 DT.TAB_INF_DEFINES_PCI_COMPRESS : InfDefSection.SetPciCompress,\r
f7496d71 882 DT.TAB_INF_DEFINES_CUSTOM_MAKEFILE : InfDefSection.SetCustomMakefile,\r
4234283c
LG
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
4234283c
LG
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
f7496d71 905\r
4234283c
LG
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
f7496d71 919 ArchListString = ' '.join(Arch)\r
4234283c
LG
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
421ccda3
HC
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
4234283c
LG
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
f7496d71 944 HasFoundInfVersionFalg = True\r
4231a819 945 if not (Name == '' or Name is None):\r
4234283c
LG
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
27c4ceb4 954 if ArchListString in self.Defines:\r
f7496d71 955 DefineList = self.Defines[ArchListString]\r
4234283c
LG
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
f7496d71 965 LineInfo=LineInfo)\r
4234283c
LG
966 else:\r
967 ProcessFunc = gFUNCTION_MAPPING_FOR_DEFINE_SECTION[Name]\r
4231a819 968 if (ProcessFunc is not None):\r
4234283c
LG
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
f7496d71 985 #\r
4234283c
LG
986 else:\r
987 ProcessFunc = gFUNCTION_MAPPING_FOR_DEFINE_SECTION[Name]\r
4231a819 988 if (ProcessFunc is not None):\r
4234283c
LG
989 ProcessFunc(DefineList, Value, InfLineCommentObj)\r
990 self.Defines[ArchListString] = DefineList\r
4234283c
LG
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
f7496d71 997 RaiseError=True)\r
4234283c 998 return True\r
f7496d71 999\r
4234283c 1000 def GetDefines(self):\r
f7496d71
LG
1001 return self.Defines\r
1002\r