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>
		
			
				
	
	
		
			217 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			217 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| ## @file
 | |
| # This file contained the miscellaneous functions for INF parser
 | |
| #
 | |
| # Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
 | |
| #
 | |
| # SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| #
 | |
| 
 | |
| '''
 | |
| InfParserMisc
 | |
| '''
 | |
| 
 | |
| ##
 | |
| # Import Modules
 | |
| #
 | |
| import re
 | |
| 
 | |
| 
 | |
| from Library import DataType as DT
 | |
| 
 | |
| 
 | |
| from Library.StringUtils import gMACRO_PATTERN
 | |
| from Library.StringUtils 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 is None:
 | |
|         GlobalMacros = {}
 | |
|     if SectionMacros is 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
 |