| ## @file | |
| # This file is used to parse INF file of EDK project | |
| # | |
| # Copyright (c) 2008 - 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. | |
| # | |
| ## | |
| # Import Modules | |
| # | |
| import Common.LongFilePathOs as os | |
| import Common.EdkLogger as EdkLogger | |
| from Common.DataType import * | |
| from CommonDataClass.DataClass import * | |
| from Common.Identification import * | |
| from Common.String import * | |
| from Parser import * | |
| import Database | |
| ## 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 | |
| # @param SourceOverridePath: Override path for source file | |
| # @param Edk_Source: Envirnoment variable EDK_SOURCE | |
| # @param Efi_Source: Envirnoment variable EFI_SOURCE | |
| # | |
| def __init__(self, Filename = None, Database = None, SourceFileList = None, SourceOverridePath = None, Edk_Source = None, Efi_Source = None): | |
| self.Identification = Identification() | |
| self.Sources = [] | |
| self.Macros = {} | |
| self.Cur = Database.Cur | |
| self.TblFile = Database.TblFile | |
| self.TblInf = Database.TblInf | |
| self.FileID = -1 | |
| self.SourceOverridePath = SourceOverridePath | |
| # Load Inf file if filename is not None | |
| if Filename != 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 | |
| ## | |
| # | |
| # This acts like the main() function for the script, unless it is 'import'ed into another | |
| # script. | |
| # | |
| if __name__ == '__main__': | |
| EdkLogger.Initialize() | |
| EdkLogger.SetLevel(EdkLogger.QUIET) | |
| Db = Database.Database('Inf.db') | |
| Db.InitDatabase() | |
| P = EdkInfParser(os.path.normpath("C:\Framework\Edk\Sample\Platform\Nt32\Dxe\PlatformBds\PlatformBds.inf"), Db, '', '') | |
| for Inf in P.Sources: | |
| print Inf | |
| for Item in P.Macros: | |
| print Item, P.Macros[Item] | |
| Db.Close() |