]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/Object/Parser/InfDefineObject.py
BaseTools: Clean up source files
[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
f7496d71
LG
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
4234283c
LG
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
f7496d71 24from Library import GlobalData\r
4234283c 25from Library import DataType as DT\r
64285f15 26from Library.StringUtils import GetSplitValueList\r
4234283c
LG
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
f7496d71 31from Library.ExpressionValidate import IsValidFeatureFlagExp\r
4234283c 32from Library.ParserValidate import IsValidWord\r
f7496d71
LG
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
4234283c
LG
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
f7496d71 50from Object.Parser.InfDefineCommonObject import InfDefineConstructorItem\r
4234283c
LG
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
f7496d71 68 return False\r
4234283c 69 #\r
f7496d71 70 # The PciVendorId should be hex string.\r
4234283c
LG
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
f7496d71 81\r
4234283c
LG
82 def GetPciVendorId(self):\r
83 return self.PciVendorId\r
f7496d71 84\r
4234283c
LG
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
f7496d71 92 return False\r
4234283c 93 #\r
f7496d71 94 # The PciDeviceId should be hex string.\r
4234283c
LG
95 #\r
96 if (IsValidHex(PciDeviceId)):\r
97 self.PciDeviceId = InfDefMember()\r
98 self.PciDeviceId.SetValue(PciDeviceId)\r
f7496d71 99 self.PciDeviceId.Comments = Comments\r
4234283c
LG
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
f7496d71 105\r
4234283c
LG
106 def GetPciDeviceId(self):\r
107 return self.PciDeviceId\r
f7496d71 108\r
4234283c
LG
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
f7496d71 116 return False\r
4234283c 117 #\r
f7496d71 118 # The PciClassCode should be 4 bytes hex string.\r
4234283c
LG
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
f7496d71 130\r
4234283c
LG
131 def GetPciClassCode(self):\r
132 return self.PciClassCode\r
f7496d71 133\r
4234283c
LG
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
f7496d71 141 return False\r
4234283c 142 #\r
f7496d71 143 # The PciRevision should be 4 bytes hex string.\r
4234283c
LG
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
f7496d71 154\r
4234283c
LG
155 def GetPciRevision(self):\r
156 return self.PciRevision\r
f7496d71 157\r
4234283c
LG
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
f7496d71 166\r
4234283c 167 #\r
f7496d71 168 # The PciCompress should be 'TRUE' or 'FALSE'.\r
4234283c
LG
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
f7496d71 178 return False\r
4234283c 179 def GetPciCompress(self):\r
f7496d71 180 return self.PciCompress\r
4234283c
LG
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
f7496d71 213 #\r
4234283c
LG
214 def SetBaseName(self, BaseName, Comments):\r
215 #\r
216 # Value has been set before.\r
217 #\r
f7496d71 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
f7496d71 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
f7496d71 234 #\r
4234283c
LG
235 def GetBaseName(self):\r
236 return self.BaseName\r
237\r
238 ## SetFileGuid\r
239 #\r
240 # @param FileGuid: FileGuid\r
f7496d71 241 #\r
4234283c
LG
242 def SetFileGuid(self, FileGuid, Comments):\r
243 #\r
244 # Value has been set before.\r
245 #\r
f7496d71 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
f7496d71 250 return False\r
4234283c
LG
251 #\r
252 # Do verification of GUID content/format\r
f7496d71 253 #\r
4234283c
LG
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
f7496d71 265 #\r
4234283c
LG
266 def GetFileGuid(self):\r
267 return self.FileGuid\r
268\r
269 ## SetModuleType\r
270 #\r
271 # @param ModuleType: ModuleType\r
f7496d71 272 #\r
4234283c
LG
273 def SetModuleType(self, ModuleType, Comments):\r
274 #\r
275 # Value has been set before.\r
276 #\r
f7496d71 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
f7496d71 281 return False\r
4234283c
LG
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
f7496d71 292 self.ModuleType.Comments = Comments\r
4234283c
LG
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
f7496d71 301 #\r
4234283c
LG
302 def GetModuleType(self):\r
303 return self.ModuleType\r
f7496d71 304\r
421ccda3
HC
305 ## SetModuleUniFileName\r
306 #\r
307 # @param ModuleUniFileName: ModuleUniFileName\r
f7496d71 308 #\r
421ccda3
HC
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
f7496d71 318 #\r
421ccda3
HC
319 def GetModuleUniFileName(self):\r
320 return self.ModuleUniFileName\r
f7496d71 321\r
4234283c
LG
322 ## SetInfVersion\r
323 #\r
324 # @param InfVersion: InfVersion\r
f7496d71 325 #\r
4234283c
LG
326 def SetInfVersion(self, InfVersion, Comments):\r
327 #\r
328 # Value has been set before.\r
329 #\r
f7496d71 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
f7496d71 334 return False\r
4234283c 335 #\r
f7496d71 336 # The InfVersion should be 4 bytes hex string.\r
4234283c
LG
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 358 ## GetInfVersion\r
f7496d71 359 #\r
4234283c
LG
360 def GetInfVersion(self):\r
361 return self.InfVersion\r
362\r
363 ## SetEdkReleaseVersion\r
364 #\r
365 # @param EdkReleaseVersion: EdkReleaseVersion\r
f7496d71 366 #\r
4234283c
LG
367 def SetEdkReleaseVersion(self, EdkReleaseVersion, Comments):\r
368 #\r
369 # Value has been set before.\r
370 #\r
f7496d71 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
f7496d71 375 return False\r
4234283c 376 #\r
f7496d71 377 # The EdkReleaseVersion should be 4 bytes hex string.\r
4234283c
LG
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
f7496d71 392 #\r
4234283c 393 def GetEdkReleaseVersion(self):\r
f7496d71 394 return self.EdkReleaseVersion\r
4234283c
LG
395\r
396 ## SetUefiSpecificationVersion\r
397 #\r
398 # @param UefiSpecificationVersion: UefiSpecificationVersion\r
f7496d71 399 #\r
4234283c
LG
400 def SetUefiSpecificationVersion(self, UefiSpecificationVersion, Comments):\r
401 #\r
402 # Value has been set before.\r
403 #\r
f7496d71 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
f7496d71 408 return False\r
4234283c 409 #\r
f7496d71 410 # The EdkReleaseVersion should be 4 bytes hex string.\r
4234283c
LG
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
f7496d71 425 #\r
4234283c 426 def GetUefiSpecificationVersion(self):\r
f7496d71 427 return self.UefiSpecificationVersion\r
4234283c
LG
428\r
429 ## SetPiSpecificationVersion\r
430 #\r
431 # @param PiSpecificationVersion: PiSpecificationVersion\r
f7496d71 432 #\r
4234283c
LG
433 def SetPiSpecificationVersion(self, PiSpecificationVersion, Comments):\r
434 #\r
435 # Value has been set before.\r
436 #\r
f7496d71 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
f7496d71 441 return False\r
4234283c 442 #\r
f7496d71 443 # The EdkReleaseVersion should be 4 bytes hex string.\r
4234283c
LG
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
f7496d71 454 LineInfo=self.CurrentLine)\r
4234283c
LG
455 return False\r
456\r
457 ## GetPiSpecificationVersion\r
f7496d71 458 #\r
4234283c
LG
459 def GetPiSpecificationVersion(self):\r
460 return self.PiSpecificationVersion\r
461\r
462 ## SetLibraryClass\r
463 #\r
464 # @param LibraryClass: LibraryClass\r
f7496d71 465 #\r
4234283c
LG
466 def SetLibraryClass(self, LibraryClass, Comments):\r
467 ValueList = GetSplitValueList(LibraryClass)\r
f7496d71 468 Name = ValueList[0]\r
4234283c
LG
469 if IsValidWord(Name):\r
470 InfDefineLibraryItemObj = InfDefineLibraryItem()\r
f7496d71 471 InfDefineLibraryItemObj.SetLibraryName(Name)\r
4234283c
LG
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
f7496d71
LG
482 InfDefineLibraryItemObj.SetTypes(TypeList)\r
483 self.LibraryClass.append(InfDefineLibraryItemObj)\r
4234283c
LG
484 else:\r
485 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Name),\r
486 LineInfo=self.CurrentLine)\r
487 return False\r
f7496d71 488\r
4234283c 489 return True\r
f7496d71 490\r
4234283c
LG
491 def GetLibraryClass(self):\r
492 return self.LibraryClass\r
f7496d71 493\r
4234283c
LG
494 def SetVersionString(self, VersionString, Comments):\r
495 #\r
496 # Value has been set before.\r
497 #\r
f7496d71 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
f7496d71 506 LineInfo=self.CurrentLine)\r
4234283c
LG
507 self.VersionString = InfDefMember()\r
508 self.VersionString.SetValue(VersionString)\r
509 self.VersionString.Comments = Comments\r
510 return True\r
511\r
f7496d71 512\r
4234283c
LG
513 def GetVersionString(self):\r
514 return self.VersionString\r
f7496d71 515\r
4234283c
LG
516 def SetPcdIsDriver(self, PcdIsDriver, Comments):\r
517 #\r
518 # Value has been set before.\r
519 #\r
f7496d71 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
f7496d71 524 return False\r
4234283c
LG
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
f7496d71 534\r
4234283c
LG
535 def GetPcdIsDriver(self):\r
536 return self.PcdIsDriver\r
f7496d71 537\r
4234283c
LG
538 #\r
539 # SetEntryPoint\r
f7496d71 540 #\r
4234283c
LG
541 def SetEntryPoint(self, EntryPoint, Comments):\r
542 #\r
543 # It can be a list\r
544 #\r
545 ValueList = []\r
4234283c 546 TokenList = GetSplitValueList(EntryPoint, DT.TAB_VALUE_SPLIT)\r
f7496d71 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
f7496d71 560 # Validate FFE\r
4234283c
LG
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
f7496d71
LG
566 LineInfo=self.CurrentLine)\r
567 InfDefineEntryPointItemObj.SetFeatureFlagExp(ValueList[1])\r
4234283c
LG
568 if len(ValueList) > 2:\r
569 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(EntryPoint),\r
570 LineInfo=self.CurrentLine)\r
f7496d71
LG
571 InfDefineEntryPointItemObj.Comments = Comments\r
572 self.EntryPoint.append(InfDefineEntryPointItemObj)\r
573\r
4234283c
LG
574 def GetEntryPoint(self):\r
575 return self.EntryPoint\r
576\r
577 #\r
578 # SetUnloadImages\r
f7496d71 579 #\r
4234283c
LG
580 def SetUnloadImages(self, UnloadImages, Comments):\r
581 #\r
582 # It can be a list\r
583 #\r
584 ValueList = []\r
4234283c 585 TokenList = GetSplitValueList(UnloadImages, DT.TAB_VALUE_SPLIT)\r
f7496d71 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
f7496d71 597 # Validate FFE\r
4234283c
LG
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
f7496d71 604\r
4234283c
LG
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
f7496d71 610\r
4234283c
LG
611 def GetUnloadImages(self):\r
612 return self.UnloadImages\r
613\r
614 #\r
615 # SetConstructor\r
f7496d71 616 #\r
4234283c
LG
617 def SetConstructor(self, Constructor, Comments):\r
618 #\r
619 # It can be a list\r
620 #\r
621 ValueList = []\r
4234283c 622 TokenList = GetSplitValueList(Constructor, DT.TAB_VALUE_SPLIT)\r
f7496d71 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
f7496d71 638 InfDefineConstructorItemObj.SetSupModList(ModList)\r
4234283c
LG
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
f7496d71 644 # Validate FFE\r
4234283c
LG
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
f7496d71 651\r
4234283c
LG
652 if len(ValueList) > 3:\r
653 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Constructor),\r
654 LineInfo=self.CurrentLine)\r
f7496d71
LG
655 InfDefineConstructorItemObj.Comments = Comments\r
656 self.Constructor.append(InfDefineConstructorItemObj)\r
657\r
4234283c
LG
658 def GetConstructor(self):\r
659 return self.Constructor\r
660\r
661 #\r
662 # SetDestructor\r
f7496d71 663 #\r
4234283c
LG
664 def SetDestructor(self, Destructor, Comments):\r
665 #\r
666 # It can be a list and only 1 set to TRUE\r
f7496d71 667 #\r
4234283c 668 ValueList = []\r
4234283c 669 TokenList = GetSplitValueList(Destructor, DT.TAB_VALUE_SPLIT)\r
f7496d71 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
f7496d71 685 InfDefineDestructorItemObj.SetSupModList(ModList)\r
4234283c
LG
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
f7496d71 691 # Validate FFE\r
4234283c
LG
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
f7496d71 698\r
4234283c
LG
699 if len(ValueList) > 3:\r
700 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Destructor),\r
701 LineInfo=self.CurrentLine)\r
f7496d71
LG
702\r
703 InfDefineDestructorItemObj.Comments = Comments\r
704 self.Destructor.append(InfDefineDestructorItemObj)\r
705\r
4234283c
LG
706 def GetDestructor(self):\r
707 return self.Destructor\r
f7496d71 708\r
4234283c
LG
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
f7496d71 716 return False\r
4234283c
LG
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
f7496d71 754 IsValidFileFlag = True\r
4234283c
LG
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
f7496d71 760 FileName = ConvPathFromAbsToRel(FileName, GlobalData.gINF_MODULE_DIR)\r
4234283c
LG
761 self.CustomMakefile.append((Family, FileName, Comments))\r
762 IsValidFileFlag = False\r
763 return True\r
764 else:\r
765 return False\r
f7496d71 766\r
4234283c
LG
767 def GetCustomMakefile(self):\r
768 return self.CustomMakefile\r
f7496d71 769\r
4234283c
LG
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
f7496d71 788 Version = __ValueList[1].strip()\r
4234283c
LG
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
f7496d71 797 else:\r
4234283c
LG
798 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Name),\r
799 LineInfo=self.CurrentLine)\r
f7496d71 800 return False\r
4234283c
LG
801 return True\r
802\r
803 def GetSpecification(self):\r
804 return self.Specification\r
f7496d71 805\r
4234283c
LG
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
f7496d71 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
f7496d71 823 self.UefiHiiResourceSection.Comments = Comments\r
4234283c
LG
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
f7496d71 831\r
4234283c
LG
832 def GetUefiHiiResourceSection(self):\r
833 return self.UefiHiiResourceSection\r
f7496d71
LG
834\r
835 def SetDpxSource(self, DpxSource, Comments):\r
4234283c
LG
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
f7496d71 842 IsValidFileFlag = True\r
4234283c
LG
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
f7496d71
LG
848 DpxSource = ConvPathFromAbsToRel(DpxSource,\r
849 GlobalData.gINF_MODULE_DIR)\r
4234283c
LG
850 self.DpxSource.append((DpxSource, Comments))\r
851 IsValidFileFlag = False\r
f7496d71 852 return True\r
4234283c
LG
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
f7496d71 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
f7496d71 885 DT.TAB_INF_DEFINES_PCI_CLASS_CODE : InfDefSection.SetPciClassCode,\r
4234283c
LG
886 DT.TAB_INF_DEFINES_PCI_REVISION : InfDefSection.SetPciRevision,\r
887 DT.TAB_INF_DEFINES_PCI_COMPRESS : InfDefSection.SetPciCompress,\r
f7496d71 888 DT.TAB_INF_DEFINES_CUSTOM_MAKEFILE : InfDefSection.SetCustomMakefile,\r
4234283c
LG
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
f7496d71 911\r
4234283c
LG
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
f7496d71 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
f7496d71 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
27c4ceb4 960 if ArchListString in self.Defines:\r
f7496d71 961 DefineList = self.Defines[ArchListString]\r
4234283c
LG
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
f7496d71 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
f7496d71 991 #\r
4234283c
LG
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
f7496d71 1003 RaiseError=True)\r
4234283c 1004 return True\r
f7496d71 1005\r
4234283c 1006 def GetDefines(self):\r
f7496d71
LG
1007 return self.Defines\r
1008\r