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>
		
			
				
	
	
		
			149 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
## @file
 | 
						|
# This file is used to parse INF file of EDK project
 | 
						|
#
 | 
						|
# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>
 | 
						|
# 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
 | 
						|
 | 
						|
 |