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