## @file | |
# This file contained the miscellaneous functions for INF parser | |
# | |
# 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. | |
# | |
''' | |
InfParserMisc | |
''' | |
## | |
# Import Modules | |
# | |
import re | |
from Library import DataType as DT | |
from Library.String import gMACRO_PATTERN | |
from Library.String import ReplaceMacro | |
from Object.Parser.InfMisc import ErrorInInf | |
from Logger.StringTable import ERR_MARCO_DEFINITION_MISS_ERROR | |
# | |
# Global variable | |
# | |
# | |
# Sections can exist in INF file | |
# | |
gINF_SECTION_DEF = { | |
DT.TAB_UNKNOWN.upper() : DT.MODEL_UNKNOWN, | |
DT.TAB_HEADER.upper() : DT.MODEL_META_DATA_FILE_HEADER, | |
DT.TAB_INF_DEFINES.upper() : DT.MODEL_META_DATA_DEFINE, | |
DT.TAB_BUILD_OPTIONS.upper() : DT.MODEL_META_DATA_BUILD_OPTION, | |
DT.TAB_LIBRARY_CLASSES.upper() : DT.MODEL_EFI_LIBRARY_CLASS, | |
DT.TAB_PACKAGES.upper() : DT.MODEL_META_DATA_PACKAGE, | |
DT.TAB_INF_FIXED_PCD.upper() : DT.MODEL_PCD_FIXED_AT_BUILD, | |
DT.TAB_INF_PATCH_PCD.upper() : DT.MODEL_PCD_PATCHABLE_IN_MODULE, | |
DT.TAB_INF_FEATURE_PCD.upper() : DT.MODEL_PCD_FEATURE_FLAG, | |
DT.TAB_INF_PCD_EX.upper() : DT.MODEL_PCD_DYNAMIC_EX, | |
DT.TAB_INF_PCD.upper() : DT.MODEL_PCD_DYNAMIC, | |
DT.TAB_SOURCES.upper() : DT.MODEL_EFI_SOURCE_FILE, | |
DT.TAB_GUIDS.upper() : DT.MODEL_EFI_GUID, | |
DT.TAB_PROTOCOLS.upper() : DT.MODEL_EFI_PROTOCOL, | |
DT.TAB_PPIS.upper() : DT.MODEL_EFI_PPI, | |
DT.TAB_DEPEX.upper() : DT.MODEL_EFI_DEPEX, | |
DT.TAB_BINARIES.upper() : DT.MODEL_EFI_BINARY_FILE, | |
DT.TAB_USER_EXTENSIONS.upper() : DT.MODEL_META_DATA_USER_EXTENSION | |
# | |
# EDK1 section | |
# TAB_NMAKE.upper() : MODEL_META_DATA_NMAKE | |
# | |
} | |
## InfExpandMacro | |
# | |
# Expand MACRO definition with MACROs defined in [Defines] section and specific section. | |
# The MACROs defined in specific section has high priority and will be expanded firstly. | |
# | |
# @param LineInfo Contain information of FileName, LineContent, LineNo | |
# @param GlobalMacros MACROs defined in INF [Defines] section | |
# @param SectionMacros MACROs defined in INF specific section | |
# @param Flag If the flag set to True, need to skip macros in a quoted string | |
# | |
def InfExpandMacro(Content, LineInfo, GlobalMacros=None, SectionMacros=None, Flag=False): | |
if GlobalMacros == None: | |
GlobalMacros = {} | |
if SectionMacros == None: | |
SectionMacros = {} | |
FileName = LineInfo[0] | |
LineContent = LineInfo[1] | |
LineNo = LineInfo[2] | |
# Don't expand macros in comments | |
if LineContent.strip().startswith("#"): | |
return Content | |
NewLineInfo = (FileName, LineNo, LineContent) | |
# | |
# First, replace MARCOs with value defined in specific section | |
# | |
Content = ReplaceMacro (Content, | |
SectionMacros, | |
False, | |
(LineContent, LineNo), | |
FileName, | |
Flag) | |
# | |
# Then replace MARCOs with value defined in [Defines] section | |
# | |
Content = ReplaceMacro (Content, | |
GlobalMacros, | |
False, | |
(LineContent, LineNo), | |
FileName, | |
Flag) | |
MacroUsed = gMACRO_PATTERN.findall(Content) | |
# | |
# no macro found in String, stop replacing | |
# | |
if len(MacroUsed) == 0: | |
return Content | |
else: | |
for Macro in MacroUsed: | |
gQuotedMacro = re.compile(".*\".*\$\(%s\).*\".*"%(Macro)) | |
if not gQuotedMacro.match(Content): | |
# | |
# Still have MACROs can't be expanded. | |
# | |
ErrorInInf (ERR_MARCO_DEFINITION_MISS_ERROR, | |
LineInfo=NewLineInfo) | |
return Content | |
## IsBinaryInf | |
# | |
# Judge whether the INF file is Binary INF or Common INF | |
# | |
# @param FileLineList A list contain all INF file content. | |
# | |
def IsBinaryInf(FileLineList): | |
if not FileLineList: | |
return False | |
ReIsSourcesSection = re.compile("^\s*\[Sources.*\]\s.*$", re.IGNORECASE) | |
ReIsBinarySection = re.compile("^\s*\[Binaries.*\]\s.*$", re.IGNORECASE) | |
BinarySectionFoundFlag = False | |
for Line in FileLineList: | |
if ReIsSourcesSection.match(Line): | |
return False | |
if ReIsBinarySection.match(Line): | |
BinarySectionFoundFlag = True | |
if BinarySectionFoundFlag: | |
return True | |
return False | |
## IsLibInstanceInfo | |
# | |
# Judge whether the string contain the information of ## @LIB_INSTANCES. | |
# | |
# @param String | |
# | |
# @return Flag | |
# | |
def IsLibInstanceInfo(String): | |
ReIsLibInstance = re.compile("^\s*##\s*@LIB_INSTANCES\s*$") | |
if ReIsLibInstance.match(String): | |
return True | |
else: | |
return False | |
## IsAsBuildOptionInfo | |
# | |
# Judge whether the string contain the information of ## @ASBUILD. | |
# | |
# @param String | |
# | |
# @return Flag | |
# | |
def IsAsBuildOptionInfo(String): | |
ReIsAsBuildInstance = re.compile("^\s*##\s*@AsBuilt\s*$") | |
if ReIsAsBuildInstance.match(String): | |
return True | |
else: | |
return False | |
class InfParserSectionRoot(object): | |
def __init__(self): | |
# | |
# Macros defined in [Define] section are file scope global | |
# | |
self.FileLocalMacros = {} | |
# | |
# Current Section Header content. | |
# | |
self.SectionHeaderContent = [] | |
# | |
# Last time Section Header content. | |
# | |
self.LastSectionHeaderContent = [] | |
self.FullPath = '' | |
self.InfDefSection = None | |
self.InfBuildOptionSection = None | |
self.InfLibraryClassSection = None | |
self.InfPackageSection = None | |
self.InfPcdSection = None | |
self.InfSourcesSection = None | |
self.InfUserExtensionSection = None | |
self.InfProtocolSection = None | |
self.InfPpiSection = None | |
self.InfGuidSection = None | |
self.InfDepexSection = None | |
self.InfPeiDepexSection = None | |
self.InfDxeDepexSection = None | |
self.InfSmmDepexSection = None | |
self.InfBinariesSection = None | |
self.InfHeader = None | |
self.InfSpecialCommentSection = None |