## @file # This file is used to parse INF file of EDK project # # Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent # ## # Import Modules # from __future__ import print_function from __future__ import absolute_import import Common.LongFilePathOs as os import Common.EdkLogger as EdkLogger from Common.DataType import * from CommonDataClass.DataClass import * from Eot.Identification import Identification from Common.StringUtils import * from Eot.Parser import * from Eot import Database from Eot import EotGlobalData ## EdkInfParser() class # # This class defined basic INF object which is used by inheriting # # @param object: Inherited from object class # class EdkInfParser(object): ## The constructor # # @param self: The object pointer # @param Filename: INF file name # @param Database: Eot database # @param SourceFileList: A list for all source file belonging this INF file # def __init__(self, Filename = None, Database = None, SourceFileList = None): self.Identification = Identification() self.Sources = [] self.Macros = {} self.Cur = Database.Cur self.TblFile = Database.TblFile self.TblInf = Database.TblInf self.FileID = -1 # Load Inf file if filename is not None if Filename is not None: self.LoadInfFile(Filename) if SourceFileList: for Item in SourceFileList: self.TblInf.Insert(MODEL_EFI_SOURCE_FILE, Item, '', '', '', '', 'COMMON', -1, self.FileID, -1, -1, -1, -1, 0) ## LoadInffile() method # # Load INF file and insert a record in database # # @param self: The object pointer # @param Filename: Input value for filename of Inf file # def LoadInfFile(self, Filename = None): # Insert a record for file Filename = NormPath(Filename) self.Identification.FileFullPath = Filename (self.Identification.FileRelativePath, self.Identification.FileName) = os.path.split(Filename) self.FileID = self.TblFile.InsertFile(Filename, MODEL_FILE_INF) self.ParseInf(PreProcess(Filename, False), self.Identification.FileRelativePath, Filename) ## ParserSource() method # # Parse Source section and insert records in database # # @param self: The object pointer # @param CurrentSection: current section name # @param SectionItemList: the item belonging current section # @param ArchList: A list for arch for this section # @param ThirdList: A list for third item for this section # def ParserSource(self, CurrentSection, SectionItemList, ArchList, ThirdList): for Index in range(0, len(ArchList)): Arch = ArchList[Index] Third = ThirdList[Index] if Arch == '': Arch = TAB_ARCH_COMMON for Item in SectionItemList: if CurrentSection.upper() == 'defines'.upper(): (Name, Value) = AddToSelfMacro(self.Macros, Item[0]) self.TblInf.Insert(MODEL_META_DATA_HEADER, Name, Value, Third, '', '', Arch, -1, self.FileID, Item[1], -1, Item[1], -1, 0) ## ParseInf() method # # Parse INF file and get sections information # # @param self: The object pointer # @param Lines: contents of INF file # @param FileRelativePath: relative path of the file # @param Filename: file name of INF file # def ParseInf(self, Lines = [], FileRelativePath = '', Filename = ''): IfDefList, SectionItemList, CurrentSection, ArchList, ThirdList, IncludeFiles = \ [], [], TAB_UNKNOWN, [], [], [] LineNo = 0 for Line in Lines: LineNo = LineNo + 1 if Line == '': continue if Line.startswith(TAB_SECTION_START) and Line.endswith(TAB_SECTION_END): self.ParserSource(CurrentSection, SectionItemList, ArchList, ThirdList) # Parse the new section SectionItemList = [] ArchList = [] ThirdList = [] # Parse section name CurrentSection = '' LineList = GetSplitValueList(Line[len(TAB_SECTION_START):len(Line) - len(TAB_SECTION_END)], TAB_COMMA_SPLIT) for Item in LineList: ItemList = GetSplitValueList(Item, TAB_SPLIT) if CurrentSection == '': CurrentSection = ItemList[0] else: if CurrentSection != ItemList[0]: EdkLogger.error("Parser", PARSER_ERROR, "Different section names '%s' and '%s' are found in one section definition, this is not allowed." % (CurrentSection, ItemList[0]), File=Filename, Line=LineNo) ItemList.append('') ItemList.append('') if len(ItemList) > 5: RaiseParserError(Line, CurrentSection, Filename, '', LineNo) else: ArchList.append(ItemList[1].upper()) ThirdList.append(ItemList[2]) continue # Add a section item SectionItemList.append([Line, LineNo]) # End of parse self.ParserSource(CurrentSection, SectionItemList, ArchList, ThirdList) #End of For