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