mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-30 18:53:45 +01:00 
			
		
		
		
	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>
		
			
				
	
	
		
			248 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			248 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| ## @file
 | |
| # This file is used to define class objects of INF file [LibraryClasses] section.
 | |
| # It will consumed by InfParser.
 | |
| #
 | |
| # Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
 | |
| #
 | |
| # SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
| '''
 | |
| InfLibraryClassesObject
 | |
| '''
 | |
| 
 | |
| from Logger import StringTable as ST
 | |
| from Logger import ToolError
 | |
| import Logger.Log as Logger
 | |
| from Library import GlobalData
 | |
| 
 | |
| from Library.Misc import Sdict
 | |
| from Object.Parser.InfCommonObject import CurrentLine
 | |
| from Library.ExpressionValidate import IsValidFeatureFlagExp
 | |
| from Library.ParserValidate import IsValidLibName
 | |
| 
 | |
| ## GetArchModuleType
 | |
| #
 | |
| # Get Arch List and ModuleType List
 | |
| #
 | |
| def GetArchModuleType(KeyList):
 | |
|     __SupArchList = []
 | |
|     __SupModuleList = []
 | |
| 
 | |
|     for (ArchItem, ModuleItem) in KeyList:
 | |
|         #
 | |
|         # Validate Arch
 | |
|         #
 | |
|         if (ArchItem == '' or ArchItem is None):
 | |
|             ArchItem = 'COMMON'
 | |
| 
 | |
|         if (ModuleItem == '' or ModuleItem is None):
 | |
|             ModuleItem = 'COMMON'
 | |
| 
 | |
|         if ArchItem not in __SupArchList:
 | |
|             __SupArchList.append(ArchItem)
 | |
| 
 | |
|         List = ModuleItem.split('|')
 | |
|         for Entry in List:
 | |
|             if Entry not in __SupModuleList:
 | |
|                 __SupModuleList.append(Entry)
 | |
| 
 | |
|     return (__SupArchList, __SupModuleList)
 | |
| 
 | |
| 
 | |
| class InfLibraryClassItem():
 | |
|     def __init__(self, LibName='', FeatureFlagExp='', HelpString=None):
 | |
|         self.LibName = LibName
 | |
|         self.FeatureFlagExp = FeatureFlagExp
 | |
|         self.HelpString = HelpString
 | |
|         self.CurrentLine = CurrentLine()
 | |
|         self.SupArchList = []
 | |
|         self.SupModuleList = []
 | |
|         self.FileGuid = ''
 | |
|         self.Version = ''
 | |
| 
 | |
|     def SetLibName(self, LibName):
 | |
|         self.LibName = LibName
 | |
|     def GetLibName(self):
 | |
|         return self.LibName
 | |
| 
 | |
|     def SetHelpString(self, HelpString):
 | |
|         self.HelpString = HelpString
 | |
|     def GetHelpString(self):
 | |
|         return self.HelpString
 | |
| 
 | |
|     def SetFeatureFlagExp(self, FeatureFlagExp):
 | |
|         self.FeatureFlagExp = FeatureFlagExp
 | |
|     def GetFeatureFlagExp(self):
 | |
|         return self.FeatureFlagExp
 | |
| 
 | |
|     def SetSupArchList(self, SupArchList):
 | |
|         self.SupArchList = SupArchList
 | |
|     def GetSupArchList(self):
 | |
|         return self.SupArchList
 | |
| 
 | |
|     def SetSupModuleList(self, SupModuleList):
 | |
|         self.SupModuleList = SupModuleList
 | |
|     def GetSupModuleList(self):
 | |
|         return self.SupModuleList
 | |
| 
 | |
|     #
 | |
|     # As Build related information
 | |
|     #
 | |
|     def SetFileGuid(self, FileGuid):
 | |
|         self.FileGuid = FileGuid
 | |
|     def GetFileGuid(self):
 | |
|         return self.FileGuid
 | |
| 
 | |
|     def SetVersion(self, Version):
 | |
|         self.Version = Version
 | |
|     def GetVersion(self):
 | |
|         return self.Version
 | |
| 
 | |
| ## INF LibraryClass Section
 | |
| #
 | |
| #
 | |
| #
 | |
| class InfLibraryClassObject():
 | |
|     def __init__(self):
 | |
|         self.LibraryClasses = Sdict()
 | |
|         #
 | |
|         # Macro defined in this section should be only used in this section.
 | |
|         #
 | |
|         self.Macros = {}
 | |
| 
 | |
|     ##SetLibraryClasses
 | |
|     #
 | |
|     #
 | |
|     # @param HelpString:     It can be a common comment or contain a recommend
 | |
|     #                        instance.
 | |
|     #
 | |
|     def SetLibraryClasses(self, LibContent, KeyList=None):
 | |
|         #
 | |
|         # Validate Arch
 | |
|         #
 | |
|         (__SupArchList, __SupModuleList) = GetArchModuleType(KeyList)
 | |
| 
 | |
|         for LibItem in LibContent:
 | |
|             LibItemObj = InfLibraryClassItem()
 | |
|             if not GlobalData.gIS_BINARY_INF:
 | |
|                 HelpStringObj = LibItem[1]
 | |
|                 LibItemObj.CurrentLine.SetFileName(LibItem[2][2])
 | |
|                 LibItemObj.CurrentLine.SetLineNo(LibItem[2][1])
 | |
|                 LibItemObj.CurrentLine.SetLineString(LibItem[2][0])
 | |
|                 LibItem = LibItem[0]
 | |
|                 if HelpStringObj is not None:
 | |
|                     LibItemObj.SetHelpString(HelpStringObj)
 | |
|                 if len(LibItem) >= 1:
 | |
|                     if LibItem[0].strip() != '':
 | |
|                         if IsValidLibName(LibItem[0].strip()):
 | |
|                             if LibItem[0].strip() != 'NULL':
 | |
|                                 LibItemObj.SetLibName(LibItem[0])
 | |
|                             else:
 | |
|                                 Logger.Error("InfParser",
 | |
|                                          ToolError.FORMAT_INVALID,
 | |
|                                          ST.ERR_INF_PARSER_DEFINE_LIB_NAME_INVALID,
 | |
|                                          File=GlobalData.gINF_MODULE_NAME,
 | |
|                                          Line=LibItemObj.CurrentLine.GetLineNo(),
 | |
|                                          ExtraData=LibItemObj.CurrentLine.GetLineString())
 | |
|                         else:
 | |
|                             Logger.Error("InfParser",
 | |
|                                          ToolError.FORMAT_INVALID,
 | |
|                                          ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID % (LibItem[0]),
 | |
|                                          File=GlobalData.gINF_MODULE_NAME,
 | |
|                                          Line=LibItemObj.CurrentLine.GetLineNo(),
 | |
|                                          ExtraData=LibItemObj.CurrentLine.GetLineString())
 | |
|                     else:
 | |
|                         Logger.Error("InfParser",
 | |
|                                      ToolError.FORMAT_INVALID,
 | |
|                                      ST.ERR_INF_PARSER_LIBRARY_SECTION_LIBNAME_MISSING,
 | |
|                                      File=GlobalData.gINF_MODULE_NAME,
 | |
|                                      Line=LibItemObj.CurrentLine.GetLineNo(),
 | |
|                                      ExtraData=LibItemObj.CurrentLine.GetLineString())
 | |
|                 if len(LibItem) == 2:
 | |
|                     if LibItem[1].strip() == '':
 | |
|                         Logger.Error("InfParser",
 | |
|                                      ToolError.FORMAT_INVALID,
 | |
|                                      ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING,
 | |
|                                      File=GlobalData.gINF_MODULE_NAME,
 | |
|                                      Line=LibItemObj.CurrentLine.GetLineNo(),
 | |
|                                      ExtraData=LibItemObj.CurrentLine.GetLineString())
 | |
|                     #
 | |
|                     # Validate FFE
 | |
|                     #
 | |
|                     FeatureFlagRtv = IsValidFeatureFlagExp(LibItem[1].strip())
 | |
|                     if not FeatureFlagRtv[0]:
 | |
|                         Logger.Error("InfParser",
 | |
|                                      ToolError.FORMAT_INVALID,
 | |
|                                      ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID % (FeatureFlagRtv[1]),
 | |
|                                      File=GlobalData.gINF_MODULE_NAME,
 | |
|                                      Line=LibItemObj.CurrentLine.GetLineNo(),
 | |
|                                      ExtraData=LibItemObj.CurrentLine.GetLineString())
 | |
|                     LibItemObj.SetFeatureFlagExp(LibItem[1].strip())
 | |
| 
 | |
|                 #
 | |
|                 # Invalid strings
 | |
|                 #
 | |
|                 if len(LibItem) < 1 or len(LibItem) > 2:
 | |
|                     Logger.Error("InfParser",
 | |
|                                  ToolError.FORMAT_INVALID,
 | |
|                                  ST.ERR_INF_PARSER_LIBRARY_SECTION_CONTENT_ERROR,
 | |
|                                  File=GlobalData.gINF_MODULE_NAME,
 | |
|                                  Line=LibItemObj.CurrentLine.GetLineNo(),
 | |
|                                  ExtraData=LibItemObj.CurrentLine.GetLineString())
 | |
| 
 | |
|                 LibItemObj.SetSupArchList(__SupArchList)
 | |
|                 LibItemObj.SetSupModuleList(__SupModuleList)
 | |
| 
 | |
|                 #
 | |
|                 # Determine Library class duplicate. Follow below rule:
 | |
|                 #
 | |
|                 # A library class keyword must not be duplicated within a
 | |
|                 # [LibraryClasses] section. Library class keywords may appear in
 | |
|                 # multiple architectural and module type [LibraryClasses] sections.
 | |
|                 # A library class keyword listed in an architectural or module type
 | |
|                 # [LibraryClasses] section must not be listed in the common
 | |
|                 # architectural or module type [LibraryClasses] section.
 | |
|                 #
 | |
|                 # NOTE: This check will not report error now. But keep code for future enhancement.
 | |
|                 #
 | |
| #                for Item in self.LibraryClasses:
 | |
| #                    if Item.GetLibName() == LibItemObj.GetLibName():
 | |
| #                        ItemSupArchList = Item.GetSupArchList()
 | |
| #                        ItemSupModuleList = Item.GetSupModuleList()
 | |
| #                        for ItemArch in ItemSupArchList:
 | |
| #                            for ItemModule in ItemSupModuleList:
 | |
| #                                for LibItemObjArch in __SupArchList:
 | |
| #                                    for LibItemObjModule in __SupModuleList:
 | |
| #                                        if ItemArch == LibItemObjArch and LibItemObjModule == ItemModule:
 | |
| #                                            #
 | |
| #                                            # ERR_INF_PARSER_ITEM_DUPLICATE
 | |
| #                                            #
 | |
| #                                            pass
 | |
| #                                        if (ItemArch.upper() == 'COMMON' or LibItemObjArch.upper() == 'COMMON') \
 | |
| #                                           and LibItemObjModule == ItemModule:
 | |
| #                                            #
 | |
| #                                            # ERR_INF_PARSER_ITEM_DUPLICATE_COMMON
 | |
| #                                            #
 | |
| #                                            pass
 | |
|             else:
 | |
|                 #
 | |
|                 # Assume the file GUID is well formatted.
 | |
|                 #
 | |
|                 LibItemObj.SetFileGuid(LibItem[0])
 | |
|                 LibItemObj.SetVersion(LibItem[1])
 | |
|                 LibItemObj.SetSupArchList(__SupArchList)
 | |
| 
 | |
|             if (LibItemObj) in self.LibraryClasses:
 | |
|                 LibraryList = self.LibraryClasses[LibItemObj]
 | |
|                 LibraryList.append(LibItemObj)
 | |
|                 self.LibraryClasses[LibItemObj] = LibraryList
 | |
|             else:
 | |
|                 LibraryList = []
 | |
|                 LibraryList.append(LibItemObj)
 | |
|                 self.LibraryClasses[LibItemObj] = LibraryList
 | |
| 
 | |
|         return True
 | |
| 
 | |
|     def GetLibraryClasses(self):
 | |
|         return self.LibraryClasses
 |