https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Bob Feng <bob.c.feng@intel.com>
		
			
				
	
	
		
			1003 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			1003 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
## @file
 | 
						|
# This file is used to define class objects of [Defines] section for INF file.
 | 
						|
# It will consumed by InfParser
 | 
						|
#
 | 
						|
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
 | 
						|
#
 | 
						|
# SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
 | 
						|
'''
 | 
						|
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.StringUtils 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 is not 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 is not 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 is not 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 is not 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 is not 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 is not 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 is 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 is not 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 is not 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 is not 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 is not 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 is not 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 is not 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 is not 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 is not 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 is not 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 is not 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 is 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 is not 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 is 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 is 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 ArchListString in self.Defines:
 | 
						|
                    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 is not 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 is not 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
 | 
						|
 |