## @file | |
# This file is used to define class objects of [Defines] section for INF file. | |
# It will consumed by InfParser | |
# | |
# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR> | |
# | |
# This program and the accompanying materials are licensed and made available | |
# under the terms and conditions of the BSD License which accompanies this | |
# distribution. The full text of the license may be found at | |
# http://opensource.org/licenses/bsd-license.php | |
# | |
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
''' | |
InfDefineObject | |
''' | |
import os | |
import re | |
from Logger import StringTable as ST | |
from Logger import ToolError | |
from Library import GlobalData | |
from Library import DataType as DT | |
from Library.String import GetSplitValueList | |
from Library.Misc import CheckGuidRegFormat | |
from Library.Misc import Sdict | |
from Library.Misc import ConvPathFromAbsToRel | |
from Library.Misc import ValidateUNIFilePath | |
from Library.ExpressionValidate import IsValidFeatureFlagExp | |
from Library.ParserValidate import IsValidWord | |
from Library.ParserValidate import IsValidInfMoudleType | |
from Library.ParserValidate import IsValidHex | |
from Library.ParserValidate import IsValidHexVersion | |
from Library.ParserValidate import IsValidDecVersion | |
from Library.ParserValidate import IsValidCVariableName | |
from Library.ParserValidate import IsValidBoolType | |
from Library.ParserValidate import IsValidPath | |
from Library.ParserValidate import IsValidFamily | |
from Library.ParserValidate import IsValidIdentifier | |
from Library.ParserValidate import IsValidDecVersionVal | |
from Object.Parser.InfCommonObject import InfLineCommentObject | |
from Object.Parser.InfCommonObject import CurrentLine | |
from Object.Parser.InfCommonObject import InfSectionCommonDef | |
from Object.Parser.InfMisc import ErrorInInf | |
from Object.Parser.InfDefineCommonObject import InfDefineLibraryItem | |
from Object.Parser.InfDefineCommonObject import InfDefineEntryPointItem | |
from Object.Parser.InfDefineCommonObject import InfDefineUnloadImageItem | |
from Object.Parser.InfDefineCommonObject import InfDefineConstructorItem | |
from Object.Parser.InfDefineCommonObject import InfDefineDestructorItem | |
class InfDefSectionOptionRomInfo(): | |
def __init__(self): | |
self.PciVendorId = None | |
self.PciDeviceId = None | |
self.PciClassCode = None | |
self.PciRevision = None | |
self.PciCompress = None | |
self.CurrentLine = ['', -1, ''] | |
def SetPciVendorId(self, PciVendorId, Comments): | |
# | |
# Value has been set before. | |
# | |
if self.PciVendorId != None: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND%(DT.TAB_INF_DEFINES_PCI_VENDOR_ID), | |
LineInfo=self.CurrentLine) | |
return False | |
# | |
# The PciVendorId should be hex string. | |
# | |
if (IsValidHex(PciVendorId)): | |
self.PciVendorId = InfDefMember() | |
self.PciVendorId.SetValue(PciVendorId) | |
self.PciVendorId.Comments = Comments | |
return True | |
else: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(PciVendorId), | |
LineInfo=self.CurrentLine) | |
return False | |
def GetPciVendorId(self): | |
return self.PciVendorId | |
def SetPciDeviceId(self, PciDeviceId, Comments): | |
# | |
# Value has been set before. | |
# | |
if self.PciDeviceId != None: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND%(DT.TAB_INF_DEFINES_PCI_DEVICE_ID), | |
LineInfo=self.CurrentLine) | |
return False | |
# | |
# The PciDeviceId should be hex string. | |
# | |
if (IsValidHex(PciDeviceId)): | |
self.PciDeviceId = InfDefMember() | |
self.PciDeviceId.SetValue(PciDeviceId) | |
self.PciDeviceId.Comments = Comments | |
return True | |
else: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(PciDeviceId), | |
LineInfo=self.CurrentLine) | |
return False | |
def GetPciDeviceId(self): | |
return self.PciDeviceId | |
def SetPciClassCode(self, PciClassCode, Comments): | |
# | |
# Value has been set before. | |
# | |
if self.PciClassCode != None: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND%(DT.TAB_INF_DEFINES_PCI_CLASS_CODE), | |
LineInfo=self.CurrentLine) | |
return False | |
# | |
# The PciClassCode should be 4 bytes hex string. | |
# | |
if (IsValidHex(PciClassCode)): | |
self.PciClassCode = InfDefMember() | |
self.PciClassCode.SetValue(PciClassCode) | |
self.PciClassCode.Comments = Comments | |
return True | |
else: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%\ | |
(PciClassCode), | |
LineInfo=self.CurrentLine) | |
return False | |
def GetPciClassCode(self): | |
return self.PciClassCode | |
def SetPciRevision(self, PciRevision, Comments): | |
# | |
# Value has been set before. | |
# | |
if self.PciRevision != None: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND%(DT.TAB_INF_DEFINES_PCI_REVISION), | |
LineInfo=self.CurrentLine) | |
return False | |
# | |
# The PciRevision should be 4 bytes hex string. | |
# | |
if (IsValidHex(PciRevision)): | |
self.PciRevision = InfDefMember() | |
self.PciRevision.SetValue(PciRevision) | |
self.PciRevision.Comments = Comments | |
return True | |
else: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(PciRevision), | |
LineInfo=self.CurrentLine) | |
return False | |
def GetPciRevision(self): | |
return self.PciRevision | |
def SetPciCompress(self, PciCompress, Comments): | |
# | |
# Value has been set before. | |
# | |
if self.PciCompress != None: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND%(DT.TAB_INF_DEFINES_PCI_COMPRESS), | |
LineInfo=self.CurrentLine) | |
return False | |
# | |
# The PciCompress should be 'TRUE' or 'FALSE'. | |
# | |
if (PciCompress == 'TRUE' or PciCompress == 'FALSE'): | |
self.PciCompress = InfDefMember() | |
self.PciCompress.SetValue(PciCompress) | |
self.PciCompress.Comments = Comments | |
return True | |
else: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(PciCompress), | |
LineInfo=self.CurrentLine) | |
return False | |
def GetPciCompress(self): | |
return self.PciCompress | |
## | |
# INF [Define] section Object | |
# | |
class InfDefSection(InfDefSectionOptionRomInfo): | |
def __init__(self): | |
self.BaseName = None | |
self.FileGuid = None | |
self.ModuleType = None | |
self.ModuleUniFileName = None | |
self.InfVersion = None | |
self.EdkReleaseVersion = None | |
self.UefiSpecificationVersion = None | |
self.PiSpecificationVersion = None | |
self.LibraryClass = [] | |
self.Package = None | |
self.VersionString = None | |
self.PcdIsDriver = None | |
self.EntryPoint = [] | |
self.UnloadImages = [] | |
self.Constructor = [] | |
self.Destructor = [] | |
self.Shadow = None | |
self.CustomMakefile = [] | |
self.Specification = [] | |
self.UefiHiiResourceSection = None | |
self.DpxSource = [] | |
self.CurrentLine = ['', -1, ''] | |
InfDefSectionOptionRomInfo.__init__(self) | |
## SetHeadComment | |
# | |
# @param BaseName: BaseName | |
# | |
def SetBaseName(self, BaseName, Comments): | |
# | |
# Value has been set before. | |
# | |
if self.BaseName != None: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND%(DT.TAB_INF_DEFINES_BASE_NAME), | |
LineInfo=self.CurrentLine) | |
return False | |
if not (BaseName == '' or BaseName == None): | |
if IsValidWord(BaseName) and not BaseName.startswith("_"): | |
self.BaseName = InfDefMember() | |
self.BaseName.SetValue(BaseName) | |
self.BaseName.Comments = Comments | |
return True | |
else: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_NAME_INVALID%(BaseName), | |
LineInfo=self.CurrentLine) | |
return False | |
## GetBaseName | |
# | |
def GetBaseName(self): | |
return self.BaseName | |
## SetFileGuid | |
# | |
# @param FileGuid: FileGuid | |
# | |
def SetFileGuid(self, FileGuid, Comments): | |
# | |
# Value has been set before. | |
# | |
if self.FileGuid != None: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND\ | |
%(DT.TAB_INF_DEFINES_FILE_GUID), | |
LineInfo=self.CurrentLine) | |
return False | |
# | |
# Do verification of GUID content/format | |
# | |
if (CheckGuidRegFormat(FileGuid)): | |
self.FileGuid = InfDefMember() | |
self.FileGuid.SetValue(FileGuid) | |
self.FileGuid.Comments = Comments | |
return True | |
else: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_GUID_INVALID%(FileGuid), | |
LineInfo=self.CurrentLine) | |
return False | |
## GetFileGuid | |
# | |
def GetFileGuid(self): | |
return self.FileGuid | |
## SetModuleType | |
# | |
# @param ModuleType: ModuleType | |
# | |
def SetModuleType(self, ModuleType, Comments): | |
# | |
# Value has been set before. | |
# | |
if self.ModuleType != None: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND\ | |
%(DT.TAB_INF_DEFINES_MODULE_TYPE), | |
LineInfo=self.CurrentLine) | |
return False | |
# | |
# Valid Module Type or not | |
# | |
if (IsValidInfMoudleType(ModuleType)): | |
self.ModuleType = InfDefMember() | |
self.ModuleType.SetValue(ModuleType) | |
self.ModuleType.CurrentLine = CurrentLine() | |
self.ModuleType.CurrentLine.SetLineNo(self.CurrentLine[1]) | |
self.ModuleType.CurrentLine.SetLineString(self.CurrentLine[2]) | |
self.ModuleType.CurrentLine.SetFileName(self.CurrentLine[0]) | |
self.ModuleType.Comments = Comments | |
return True | |
else: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_MODULETYPE_INVALID%\ | |
(ModuleType), | |
LineInfo=self.CurrentLine) | |
return False | |
## GetModuleType | |
# | |
def GetModuleType(self): | |
return self.ModuleType | |
## SetModuleUniFileName | |
# | |
# @param ModuleUniFileName: ModuleUniFileName | |
# | |
def SetModuleUniFileName(self, ModuleUniFileName, Comments): | |
if Comments: | |
pass | |
if self.ModuleUniFileName != None: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND%(DT.TAB_INF_DEFINES_MODULE_UNI_FILE), | |
LineInfo=self.CurrentLine) | |
self.ModuleUniFileName = ModuleUniFileName | |
## GetModuleType | |
# | |
def GetModuleUniFileName(self): | |
return self.ModuleUniFileName | |
## SetInfVersion | |
# | |
# @param InfVersion: InfVersion | |
# | |
def SetInfVersion(self, InfVersion, Comments): | |
# | |
# Value has been set before. | |
# | |
if self.InfVersion != None: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND\ | |
%(DT.TAB_INF_DEFINES_INF_VERSION), | |
LineInfo=self.CurrentLine) | |
return False | |
# | |
# The InfVersion should be 4 bytes hex string. | |
# | |
if (IsValidHex(InfVersion)): | |
if (InfVersion < '0x00010005'): | |
ErrorInInf(ST.ERR_INF_PARSER_NOT_SUPPORT_EDKI_INF, | |
ErrorCode=ToolError.EDK1_INF_ERROR, | |
LineInfo=self.CurrentLine) | |
elif IsValidDecVersionVal(InfVersion): | |
if (InfVersion < 65541): | |
ErrorInInf(ST.ERR_INF_PARSER_NOT_SUPPORT_EDKI_INF, | |
ErrorCode=ToolError.EDK1_INF_ERROR, | |
LineInfo=self.CurrentLine) | |
else: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(InfVersion), | |
LineInfo=self.CurrentLine) | |
return False | |
self.InfVersion = InfDefMember() | |
self.InfVersion.SetValue(InfVersion) | |
self.InfVersion.Comments = Comments | |
return True | |
## GetInfVersion | |
# | |
def GetInfVersion(self): | |
return self.InfVersion | |
## SetEdkReleaseVersion | |
# | |
# @param EdkReleaseVersion: EdkReleaseVersion | |
# | |
def SetEdkReleaseVersion(self, EdkReleaseVersion, Comments): | |
# | |
# Value has been set before. | |
# | |
if self.EdkReleaseVersion != None: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND\ | |
%(DT.TAB_INF_DEFINES_EDK_RELEASE_VERSION), | |
LineInfo=self.CurrentLine) | |
return False | |
# | |
# The EdkReleaseVersion should be 4 bytes hex string. | |
# | |
if IsValidHexVersion(EdkReleaseVersion) or \ | |
IsValidDecVersionVal(EdkReleaseVersion): | |
self.EdkReleaseVersion = InfDefMember() | |
self.EdkReleaseVersion.SetValue(EdkReleaseVersion) | |
self.EdkReleaseVersion.Comments = Comments | |
return True | |
else: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID\ | |
%(EdkReleaseVersion), | |
LineInfo=self.CurrentLine) | |
return False | |
## GetEdkReleaseVersion | |
# | |
def GetEdkReleaseVersion(self): | |
return self.EdkReleaseVersion | |
## SetUefiSpecificationVersion | |
# | |
# @param UefiSpecificationVersion: UefiSpecificationVersion | |
# | |
def SetUefiSpecificationVersion(self, UefiSpecificationVersion, Comments): | |
# | |
# Value has been set before. | |
# | |
if self.UefiSpecificationVersion != None: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND\ | |
%(DT.TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION), | |
LineInfo=self.CurrentLine) | |
return False | |
# | |
# The EdkReleaseVersion should be 4 bytes hex string. | |
# | |
if IsValidHexVersion(UefiSpecificationVersion) or \ | |
IsValidDecVersionVal(UefiSpecificationVersion): | |
self.UefiSpecificationVersion = InfDefMember() | |
self.UefiSpecificationVersion.SetValue(UefiSpecificationVersion) | |
self.UefiSpecificationVersion.Comments = Comments | |
return True | |
else: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID\ | |
%(UefiSpecificationVersion), | |
LineInfo=self.CurrentLine) | |
return False | |
## GetUefiSpecificationVersion | |
# | |
def GetUefiSpecificationVersion(self): | |
return self.UefiSpecificationVersion | |
## SetPiSpecificationVersion | |
# | |
# @param PiSpecificationVersion: PiSpecificationVersion | |
# | |
def SetPiSpecificationVersion(self, PiSpecificationVersion, Comments): | |
# | |
# Value has been set before. | |
# | |
if self.PiSpecificationVersion != None: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND\ | |
%(DT.TAB_INF_DEFINES_PI_SPECIFICATION_VERSION), | |
LineInfo=self.CurrentLine) | |
return False | |
# | |
# The EdkReleaseVersion should be 4 bytes hex string. | |
# | |
if IsValidHexVersion(PiSpecificationVersion) or \ | |
IsValidDecVersionVal(PiSpecificationVersion): | |
self.PiSpecificationVersion = InfDefMember() | |
self.PiSpecificationVersion.SetValue(PiSpecificationVersion) | |
self.PiSpecificationVersion.Comments = Comments | |
return True | |
else: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID\ | |
%(PiSpecificationVersion), | |
LineInfo=self.CurrentLine) | |
return False | |
## GetPiSpecificationVersion | |
# | |
def GetPiSpecificationVersion(self): | |
return self.PiSpecificationVersion | |
## SetLibraryClass | |
# | |
# @param LibraryClass: LibraryClass | |
# | |
def SetLibraryClass(self, LibraryClass, Comments): | |
ValueList = GetSplitValueList(LibraryClass) | |
Name = ValueList[0] | |
if IsValidWord(Name): | |
InfDefineLibraryItemObj = InfDefineLibraryItem() | |
InfDefineLibraryItemObj.SetLibraryName(Name) | |
InfDefineLibraryItemObj.Comments = Comments | |
if len(ValueList) == 2: | |
Type = ValueList[1] | |
TypeList = GetSplitValueList(Type, ' ') | |
TypeList = [Type for Type in TypeList if Type != ''] | |
for Item in TypeList: | |
if Item not in DT.MODULE_LIST: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Item), | |
LineInfo=self.CurrentLine) | |
return False | |
InfDefineLibraryItemObj.SetTypes(TypeList) | |
self.LibraryClass.append(InfDefineLibraryItemObj) | |
else: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Name), | |
LineInfo=self.CurrentLine) | |
return False | |
return True | |
def GetLibraryClass(self): | |
return self.LibraryClass | |
def SetVersionString(self, VersionString, Comments): | |
# | |
# Value has been set before. | |
# | |
if self.VersionString != None: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND\ | |
%(DT.TAB_INF_DEFINES_VERSION_STRING), | |
LineInfo=self.CurrentLine) | |
return False | |
if not IsValidDecVersion(VersionString): | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID\ | |
%(VersionString), | |
LineInfo=self.CurrentLine) | |
self.VersionString = InfDefMember() | |
self.VersionString.SetValue(VersionString) | |
self.VersionString.Comments = Comments | |
return True | |
def GetVersionString(self): | |
return self.VersionString | |
def SetPcdIsDriver(self, PcdIsDriver, Comments): | |
# | |
# Value has been set before. | |
# | |
if self.PcdIsDriver != None: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND\ | |
%(DT.TAB_INF_DEFINES_PCD_IS_DRIVER), | |
LineInfo=self.CurrentLine) | |
return False | |
if PcdIsDriver == 'PEI_PCD_DRIVER' or PcdIsDriver == 'DXE_PCD_DRIVER': | |
self.PcdIsDriver = InfDefMember() | |
self.PcdIsDriver.SetValue(PcdIsDriver) | |
self.PcdIsDriver.Comments = Comments | |
return True | |
else: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(PcdIsDriver), | |
LineInfo=self.CurrentLine) | |
return False | |
def GetPcdIsDriver(self): | |
return self.PcdIsDriver | |
# | |
# SetEntryPoint | |
# | |
def SetEntryPoint(self, EntryPoint, Comments): | |
# | |
# It can be a list | |
# | |
ValueList = [] | |
TokenList = GetSplitValueList(EntryPoint, DT.TAB_VALUE_SPLIT) | |
ValueList[0:len(TokenList)] = TokenList | |
InfDefineEntryPointItemObj = InfDefineEntryPointItem() | |
if not IsValidCVariableName(ValueList[0]): | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%\ | |
(ValueList[0]), | |
LineInfo=self.CurrentLine) | |
InfDefineEntryPointItemObj.SetCName(ValueList[0]) | |
if len(ValueList) == 2: | |
if ValueList[1].strip() == '': | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%\ | |
(ValueList[1]), | |
LineInfo=self.CurrentLine) | |
# | |
# Validate FFE | |
# | |
FeatureFlagRtv = IsValidFeatureFlagExp(ValueList[1].strip()) | |
if not FeatureFlagRtv[0]: | |
ErrorInInf(ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%\ | |
(FeatureFlagRtv[1]), | |
LineInfo=self.CurrentLine) | |
InfDefineEntryPointItemObj.SetFeatureFlagExp(ValueList[1]) | |
if len(ValueList) > 2: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(EntryPoint), | |
LineInfo=self.CurrentLine) | |
InfDefineEntryPointItemObj.Comments = Comments | |
self.EntryPoint.append(InfDefineEntryPointItemObj) | |
def GetEntryPoint(self): | |
return self.EntryPoint | |
# | |
# SetUnloadImages | |
# | |
def SetUnloadImages(self, UnloadImages, Comments): | |
# | |
# It can be a list | |
# | |
ValueList = [] | |
TokenList = GetSplitValueList(UnloadImages, DT.TAB_VALUE_SPLIT) | |
ValueList[0:len(TokenList)] = TokenList | |
InfDefineUnloadImageItemObj = InfDefineUnloadImageItem() | |
if not IsValidCVariableName(ValueList[0]): | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[0]), | |
LineInfo=self.CurrentLine) | |
InfDefineUnloadImageItemObj.SetCName(ValueList[0]) | |
if len(ValueList) == 2: | |
if ValueList[1].strip() == '': | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[1]), | |
LineInfo=self.CurrentLine) | |
# | |
# Validate FFE | |
# | |
FeatureFlagRtv = IsValidFeatureFlagExp(ValueList[1].strip()) | |
if not FeatureFlagRtv[0]: | |
ErrorInInf(ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%(FeatureFlagRtv[1]), | |
LineInfo=self.CurrentLine) | |
InfDefineUnloadImageItemObj.SetFeatureFlagExp(ValueList[1]) | |
if len(ValueList) > 2: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(UnloadImages), | |
LineInfo=self.CurrentLine) | |
InfDefineUnloadImageItemObj.Comments = Comments | |
self.UnloadImages.append(InfDefineUnloadImageItemObj) | |
def GetUnloadImages(self): | |
return self.UnloadImages | |
# | |
# SetConstructor | |
# | |
def SetConstructor(self, Constructor, Comments): | |
# | |
# It can be a list | |
# | |
ValueList = [] | |
TokenList = GetSplitValueList(Constructor, DT.TAB_VALUE_SPLIT) | |
ValueList[0:len(TokenList)] = TokenList | |
InfDefineConstructorItemObj = InfDefineConstructorItem() | |
if not IsValidCVariableName(ValueList[0]): | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[0]), | |
LineInfo=self.CurrentLine) | |
InfDefineConstructorItemObj.SetCName(ValueList[0]) | |
if len(ValueList) >= 2: | |
ModList = GetSplitValueList(ValueList[1], ' ') | |
if ValueList[1].strip() == '': | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[1]), | |
LineInfo=self.CurrentLine) | |
for ModItem in ModList: | |
if ModItem not in DT.MODULE_LIST: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_MODULETYPE_INVALID%(ModItem), | |
LineInfo=self.CurrentLine) | |
InfDefineConstructorItemObj.SetSupModList(ModList) | |
if len(ValueList) == 3: | |
if ValueList[2].strip() == '': | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[2]), | |
LineInfo=self.CurrentLine) | |
# | |
# Validate FFE | |
# | |
FeatureFlagRtv = IsValidFeatureFlagExp(ValueList[2].strip()) | |
if not FeatureFlagRtv[0]: | |
ErrorInInf(ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%(FeatureFlagRtv[2]), | |
LineInfo=self.CurrentLine) | |
InfDefineConstructorItemObj.SetFeatureFlagExp(ValueList[2]) | |
if len(ValueList) > 3: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Constructor), | |
LineInfo=self.CurrentLine) | |
InfDefineConstructorItemObj.Comments = Comments | |
self.Constructor.append(InfDefineConstructorItemObj) | |
def GetConstructor(self): | |
return self.Constructor | |
# | |
# SetDestructor | |
# | |
def SetDestructor(self, Destructor, Comments): | |
# | |
# It can be a list and only 1 set to TRUE | |
# | |
ValueList = [] | |
TokenList = GetSplitValueList(Destructor, DT.TAB_VALUE_SPLIT) | |
ValueList[0:len(TokenList)] = TokenList | |
InfDefineDestructorItemObj = InfDefineDestructorItem() | |
if not IsValidCVariableName(ValueList[0]): | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[0]), | |
LineInfo=self.CurrentLine) | |
InfDefineDestructorItemObj.SetCName(ValueList[0]) | |
if len(ValueList) >= 2: | |
ModList = GetSplitValueList(ValueList[1].strip(), ' ') | |
if ValueList[1].strip() == '': | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[1]), | |
LineInfo=self.CurrentLine) | |
for ModItem in ModList: | |
if ModItem not in DT.MODULE_LIST: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_MODULETYPE_INVALID%(ModItem), | |
LineInfo=self.CurrentLine) | |
InfDefineDestructorItemObj.SetSupModList(ModList) | |
if len(ValueList) == 3: | |
if ValueList[2].strip() == '': | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[2]), | |
LineInfo=self.CurrentLine) | |
# | |
# Validate FFE | |
# | |
FeatureFlagRtv = IsValidFeatureFlagExp(ValueList[2].strip()) | |
if not FeatureFlagRtv[0]: | |
ErrorInInf(ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%(FeatureFlagRtv[1]), | |
LineInfo=self.CurrentLine) | |
InfDefineDestructorItemObj.SetFeatureFlagExp(ValueList[2]) | |
if len(ValueList) > 3: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Destructor), | |
LineInfo=self.CurrentLine) | |
InfDefineDestructorItemObj.Comments = Comments | |
self.Destructor.append(InfDefineDestructorItemObj) | |
def GetDestructor(self): | |
return self.Destructor | |
def SetShadow(self, Shadow, Comments): | |
# | |
# Value has been set before. | |
# | |
if self.Shadow != None: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND%(DT.TAB_INF_DEFINES_SHADOW), | |
LineInfo=self.CurrentLine) | |
return False | |
if (IsValidBoolType(Shadow)): | |
self.Shadow = InfDefMember() | |
self.Shadow.SetValue(Shadow) | |
self.Shadow.Comments = Comments | |
return True | |
else: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Shadow), | |
LineInfo=self.CurrentLine) | |
return False | |
def GetShadow(self): | |
return self.Shadow | |
# | |
# <Family> ::= {"MSFT"} {"GCC"} | |
# <CustomMake> ::= [<Family> "|"] <Filename> | |
# | |
def SetCustomMakefile(self, CustomMakefile, Comments): | |
if not (CustomMakefile == '' or CustomMakefile == None): | |
ValueList = GetSplitValueList(CustomMakefile) | |
if len(ValueList) == 1: | |
FileName = ValueList[0] | |
Family = '' | |
else: | |
Family = ValueList[0] | |
FileName = ValueList[1] | |
Family = Family.strip() | |
if Family != '': | |
if not IsValidFamily(Family): | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Family), | |
LineInfo=self.CurrentLine) | |
return False | |
# | |
# The MakefileName specified file should exist | |
# | |
IsValidFileFlag = False | |
ModulePath = os.path.split(self.CurrentLine[0])[0] | |
if IsValidPath(FileName, ModulePath): | |
IsValidFileFlag = True | |
else: | |
ErrorInInf(ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(FileName), | |
LineInfo=self.CurrentLine) | |
return False | |
if IsValidFileFlag: | |
FileName = ConvPathFromAbsToRel(FileName, GlobalData.gINF_MODULE_DIR) | |
self.CustomMakefile.append((Family, FileName, Comments)) | |
IsValidFileFlag = False | |
return True | |
else: | |
return False | |
def GetCustomMakefile(self): | |
return self.CustomMakefile | |
# | |
# ["SPEC" <Spec> <EOL>]*{0,} | |
# <Spec> ::= <Word> "=" <VersionVal> | |
# <VersionVal> ::= {<HexVersion>] {<DecVersion>} | |
# <HexNumber> ::= "0x" [<HexDigit>]{1,} | |
# <DecVersion> ::= (0-9){1,} ["." (0-9){1,2}] | |
# | |
def SetSpecification(self, Specification, Comments): | |
# | |
# Valid the value of Specification | |
# | |
__ValueList = [] | |
TokenList = GetSplitValueList(Specification, DT.TAB_EQUAL_SPLIT, 1) | |
__ValueList[0:len(TokenList)] = TokenList | |
if len(__ValueList) != 2: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_NO_NAME + ' Or ' + ST.ERR_INF_PARSER_DEFINE_ITEM_NO_VALUE, | |
LineInfo=self.CurrentLine) | |
Name = __ValueList[0].strip() | |
Version = __ValueList[1].strip() | |
if IsValidIdentifier(Name): | |
if IsValidDecVersion(Version): | |
self.Specification.append((Name, Version, Comments)) | |
return True | |
else: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Version), | |
LineInfo=self.CurrentLine) | |
return False | |
else: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Name), | |
LineInfo=self.CurrentLine) | |
return False | |
return True | |
def GetSpecification(self): | |
return self.Specification | |
# | |
# [<UefiHiiResource> <EOL>]{0,1} | |
# <UefiHiiResource> ::= "UEFI_HII_RESOURCE_SECTION" "=" <BoolType> | |
# | |
def SetUefiHiiResourceSection(self, UefiHiiResourceSection, Comments): | |
# | |
# Value has been set before. | |
# | |
if self.UefiHiiResourceSection != None: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND | |
%(DT.TAB_INF_DEFINES_UEFI_HII_RESOURCE_SECTION), | |
LineInfo=self.CurrentLine) | |
return False | |
if not (UefiHiiResourceSection == '' or UefiHiiResourceSection == None): | |
if (IsValidBoolType(UefiHiiResourceSection)): | |
self.UefiHiiResourceSection = InfDefMember() | |
self.UefiHiiResourceSection.SetValue(UefiHiiResourceSection) | |
self.UefiHiiResourceSection.Comments = Comments | |
return True | |
else: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(UefiHiiResourceSection), | |
LineInfo=self.CurrentLine) | |
return False | |
else: | |
return False | |
def GetUefiHiiResourceSection(self): | |
return self.UefiHiiResourceSection | |
def SetDpxSource(self, DpxSource, Comments): | |
# | |
# The MakefileName specified file should exist | |
# | |
IsValidFileFlag = False | |
ModulePath = os.path.split(self.CurrentLine[0])[0] | |
if IsValidPath(DpxSource, ModulePath): | |
IsValidFileFlag = True | |
else: | |
ErrorInInf(ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(DpxSource), | |
LineInfo=self.CurrentLine) | |
return False | |
if IsValidFileFlag: | |
DpxSource = ConvPathFromAbsToRel(DpxSource, | |
GlobalData.gINF_MODULE_DIR) | |
self.DpxSource.append((DpxSource, Comments)) | |
IsValidFileFlag = False | |
return True | |
def GetDpxSource(self): | |
return self.DpxSource | |
gFUNCTION_MAPPING_FOR_DEFINE_SECTION = { | |
# | |
# Required Fields | |
# | |
DT.TAB_INF_DEFINES_BASE_NAME : InfDefSection.SetBaseName, | |
DT.TAB_INF_DEFINES_FILE_GUID : InfDefSection.SetFileGuid, | |
DT.TAB_INF_DEFINES_MODULE_TYPE : InfDefSection.SetModuleType, | |
# | |
# Required by EDKII style INF file | |
# | |
DT.TAB_INF_DEFINES_INF_VERSION : InfDefSection.SetInfVersion, | |
# | |
# Optional Fields | |
# | |
DT.TAB_INF_DEFINES_MODULE_UNI_FILE : InfDefSection.SetModuleUniFileName, | |
DT.TAB_INF_DEFINES_EDK_RELEASE_VERSION : InfDefSection.SetEdkReleaseVersion, | |
DT.TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION : InfDefSection.SetUefiSpecificationVersion, | |
DT.TAB_INF_DEFINES_PI_SPECIFICATION_VERSION : InfDefSection.SetPiSpecificationVersion, | |
DT.TAB_INF_DEFINES_LIBRARY_CLASS : InfDefSection.SetLibraryClass, | |
DT.TAB_INF_DEFINES_VERSION_STRING : InfDefSection.SetVersionString, | |
DT.TAB_INF_DEFINES_PCD_IS_DRIVER : InfDefSection.SetPcdIsDriver, | |
DT.TAB_INF_DEFINES_ENTRY_POINT : InfDefSection.SetEntryPoint, | |
DT.TAB_INF_DEFINES_UNLOAD_IMAGE : InfDefSection.SetUnloadImages, | |
DT.TAB_INF_DEFINES_CONSTRUCTOR : InfDefSection.SetConstructor, | |
DT.TAB_INF_DEFINES_DESTRUCTOR : InfDefSection.SetDestructor, | |
DT.TAB_INF_DEFINES_SHADOW : InfDefSection.SetShadow, | |
DT.TAB_INF_DEFINES_PCI_VENDOR_ID : InfDefSection.SetPciVendorId, | |
DT.TAB_INF_DEFINES_PCI_DEVICE_ID : InfDefSection.SetPciDeviceId, | |
DT.TAB_INF_DEFINES_PCI_CLASS_CODE : InfDefSection.SetPciClassCode, | |
DT.TAB_INF_DEFINES_PCI_REVISION : InfDefSection.SetPciRevision, | |
DT.TAB_INF_DEFINES_PCI_COMPRESS : InfDefSection.SetPciCompress, | |
DT.TAB_INF_DEFINES_CUSTOM_MAKEFILE : InfDefSection.SetCustomMakefile, | |
DT.TAB_INF_DEFINES_SPEC : InfDefSection.SetSpecification, | |
DT.TAB_INF_DEFINES_UEFI_HII_RESOURCE_SECTION : InfDefSection.SetUefiHiiResourceSection, | |
DT.TAB_INF_DEFINES_DPX_SOURCE : InfDefSection.SetDpxSource | |
} | |
## InfDefMember | |
# | |
# | |
class InfDefMember(): | |
def __init__(self, Name='', Value=''): | |
self.Comments = InfLineCommentObject() | |
self.Name = Name | |
self.Value = Value | |
self.CurrentLine = CurrentLine() | |
def GetName(self): | |
return self.Name | |
def SetName(self, Name): | |
self.Name = Name | |
def GetValue(self): | |
return self.Value | |
def SetValue(self, Value): | |
self.Value = Value | |
## InfDefObject | |
# | |
# | |
class InfDefObject(InfSectionCommonDef): | |
def __init__(self): | |
self.Defines = Sdict() | |
InfSectionCommonDef.__init__(self) | |
def SetDefines(self, DefineContent, Arch = None): | |
# | |
# Validate Arch | |
# | |
HasFoundInfVersionFalg = False | |
LineInfo = ['', -1, ''] | |
ArchListString = ' '.join(Arch) | |
# | |
# Parse Define items. | |
# | |
for InfDefMemberObj in DefineContent: | |
ProcessFunc = None | |
Name = InfDefMemberObj.GetName() | |
Value = InfDefMemberObj.GetValue() | |
if Name == DT.TAB_INF_DEFINES_MODULE_UNI_FILE: | |
ValidateUNIFilePath(Value) | |
Value = os.path.join(os.path.dirname(InfDefMemberObj.CurrentLine.FileName), Value) | |
if not os.path.isfile(Value) or not os.path.exists(Value): | |
LineInfo[0] = InfDefMemberObj.CurrentLine.GetFileName() | |
LineInfo[1] = InfDefMemberObj.CurrentLine.GetLineNo() | |
LineInfo[2] = InfDefMemberObj.CurrentLine.GetLineString() | |
ErrorInInf(ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(Name), | |
LineInfo=LineInfo) | |
InfLineCommentObj = InfLineCommentObject() | |
InfLineCommentObj.SetHeaderComments(InfDefMemberObj.Comments.GetHeaderComments()) | |
InfLineCommentObj.SetTailComments(InfDefMemberObj.Comments.GetTailComments()) | |
if Name == 'COMPONENT_TYPE': | |
ErrorInInf(ST.ERR_INF_PARSER_NOT_SUPPORT_EDKI_INF, | |
ErrorCode=ToolError.EDK1_INF_ERROR, | |
RaiseError=True) | |
if Name == DT.TAB_INF_DEFINES_INF_VERSION: | |
HasFoundInfVersionFalg = True | |
if not (Name == '' or Name == None): | |
# | |
# Process "SPEC" Keyword definition. | |
# | |
ReName = re.compile(r"SPEC ", re.DOTALL) | |
if ReName.match(Name): | |
SpecValue = Name[Name.find("SPEC") + len("SPEC"):].strip() | |
Name = "SPEC" | |
Value = SpecValue + " = " + Value | |
if self.Defines.has_key(ArchListString): | |
DefineList = self.Defines[ArchListString] | |
LineInfo[0] = InfDefMemberObj.CurrentLine.GetFileName() | |
LineInfo[1] = InfDefMemberObj.CurrentLine.GetLineNo() | |
LineInfo[2] = InfDefMemberObj.CurrentLine.GetLineString() | |
DefineList.CurrentLine = LineInfo | |
# | |
# Found the process function from mapping table. | |
# | |
if Name not in gFUNCTION_MAPPING_FOR_DEFINE_SECTION.keys(): | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_SECTION_KEYWORD_INVALID%(Name), | |
LineInfo=LineInfo) | |
else: | |
ProcessFunc = gFUNCTION_MAPPING_FOR_DEFINE_SECTION[Name] | |
if (ProcessFunc != None): | |
ProcessFunc(DefineList, Value, InfLineCommentObj) | |
self.Defines[ArchListString] = DefineList | |
else: | |
DefineList = InfDefSection() | |
LineInfo[0] = InfDefMemberObj.CurrentLine.GetFileName() | |
LineInfo[1] = InfDefMemberObj.CurrentLine.GetLineNo() | |
LineInfo[2] = InfDefMemberObj.CurrentLine.GetLineString() | |
DefineList.CurrentLine = LineInfo | |
# | |
# Found the process function from mapping table. | |
# | |
if Name not in gFUNCTION_MAPPING_FOR_DEFINE_SECTION.keys(): | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_SECTION_KEYWORD_INVALID%(Name), | |
LineInfo=LineInfo) | |
# | |
# Found the process function from mapping table. | |
# | |
else: | |
ProcessFunc = gFUNCTION_MAPPING_FOR_DEFINE_SECTION[Name] | |
if (ProcessFunc != None): | |
ProcessFunc(DefineList, Value, InfLineCommentObj) | |
self.Defines[ArchListString] = DefineList | |
# | |
# After set, check whether INF_VERSION defined. | |
# | |
if not HasFoundInfVersionFalg: | |
ErrorInInf(ST.ERR_INF_PARSER_NOT_SUPPORT_EDKI_INF, | |
ErrorCode=ToolError.EDK1_INF_ERROR, | |
RaiseError=True) | |
return True | |
def GetDefines(self): | |
return self.Defines | |