## @file | |
# This file contained the parser for [Libraries] sections in INF file | |
# | |
# Copyright (c) 2011 - 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. | |
# | |
''' | |
InfLibrarySectionParser | |
''' | |
## | |
# Import Modules | |
# | |
import Logger.Log as Logger | |
from Logger import StringTable as ST | |
from Logger.ToolError import FORMAT_INVALID | |
from Parser.InfParserMisc import InfExpandMacro | |
from Library import DataType as DT | |
from Library.Parsing import MacroParser | |
from Library.Misc import GetSplitValueList | |
from Object.Parser.InfCommonObject import InfLineCommentObject | |
from Library import GlobalData | |
from Parser.InfParserMisc import IsLibInstanceInfo | |
from Parser.InfAsBuiltProcess import GetLibInstanceInfo | |
from Parser.InfParserMisc import InfParserSectionRoot | |
class InfLibrarySectionParser(InfParserSectionRoot): | |
## InfLibraryParser | |
# | |
# | |
def InfLibraryParser(self, SectionString, InfSectionObject, FileName): | |
# | |
# For Common INF file | |
# | |
if not GlobalData.gIS_BINARY_INF: | |
# | |
# Macro defined in this section | |
# | |
SectionMacros = {} | |
ValueList = [] | |
LibraryList = [] | |
LibStillCommentFalg = False | |
LibHeaderComments = [] | |
LibLineComment = None | |
# | |
# Parse section content | |
# | |
for Line in SectionString: | |
LibLineContent = Line[0] | |
LibLineNo = Line[1] | |
if LibLineContent.strip() == '': | |
continue | |
# | |
# Found Header Comments | |
# | |
if LibLineContent.strip().startswith(DT.TAB_COMMENT_SPLIT): | |
# | |
# Last line is comments, and this line go on. | |
# | |
if LibStillCommentFalg: | |
LibHeaderComments.append(Line) | |
continue | |
# | |
# First time encounter comment | |
# | |
else: | |
# | |
# Clear original data | |
# | |
LibHeaderComments = [] | |
LibHeaderComments.append(Line) | |
LibStillCommentFalg = True | |
continue | |
else: | |
LibStillCommentFalg = False | |
if len(LibHeaderComments) >= 1: | |
LibLineComment = InfLineCommentObject() | |
LineCommentContent = '' | |
for Item in LibHeaderComments: | |
LineCommentContent += Item[0] + DT.END_OF_LINE | |
LibLineComment.SetHeaderComments(LineCommentContent) | |
# | |
# Find Tail comment. | |
# | |
if LibLineContent.find(DT.TAB_COMMENT_SPLIT) > -1: | |
LibTailComments = LibLineContent[LibLineContent.find(DT.TAB_COMMENT_SPLIT):] | |
LibLineContent = LibLineContent[:LibLineContent.find(DT.TAB_COMMENT_SPLIT)] | |
if LibLineComment == None: | |
LibLineComment = InfLineCommentObject() | |
LibLineComment.SetTailComments(LibTailComments) | |
# | |
# Find Macro | |
# | |
Name, Value = MacroParser((LibLineContent, LibLineNo), | |
FileName, | |
DT.MODEL_EFI_LIBRARY_CLASS, | |
self.FileLocalMacros) | |
if Name != None: | |
SectionMacros[Name] = Value | |
LibLineComment = None | |
LibHeaderComments = [] | |
continue | |
TokenList = GetSplitValueList(LibLineContent, DT.TAB_VALUE_SPLIT, 1) | |
ValueList[0:len(TokenList)] = TokenList | |
# | |
# Replace with Local section Macro and [Defines] section Macro. | |
# | |
ValueList = [InfExpandMacro(Value, (FileName, LibLineContent, LibLineNo), | |
self.FileLocalMacros, SectionMacros, True) | |
for Value in ValueList] | |
LibraryList.append((ValueList, LibLineComment, | |
(LibLineContent, LibLineNo, FileName))) | |
ValueList = [] | |
LibLineComment = None | |
LibTailComments = '' | |
LibHeaderComments = [] | |
continue | |
# | |
# Current section archs | |
# | |
KeyList = [] | |
for Item in self.LastSectionHeaderContent: | |
if (Item[1], Item[2]) not in KeyList: | |
KeyList.append((Item[1], Item[2])) | |
if not InfSectionObject.SetLibraryClasses(LibraryList, KeyList=KeyList): | |
Logger.Error('InfParser', | |
FORMAT_INVALID, | |
ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR % ("[Library]"), | |
File=FileName, | |
Line=Item[3]) | |
# | |
# For Binary INF | |
# | |
else: | |
self.InfAsBuiltLibraryParser(SectionString, InfSectionObject, FileName) | |
def InfAsBuiltLibraryParser(self, SectionString, InfSectionObject, FileName): | |
LibraryList = [] | |
LibInsFlag = False | |
for Line in SectionString: | |
LineContent = Line[0] | |
LineNo = Line[1] | |
if LineContent.strip() == '': | |
LibInsFlag = False | |
continue | |
if not LineContent.strip().startswith("#"): | |
Logger.Error('InfParser', | |
FORMAT_INVALID, | |
ST.ERR_LIB_CONTATIN_ASBUILD_AND_COMMON, | |
File=FileName, | |
Line=LineNo, | |
ExtraData=LineContent) | |
if IsLibInstanceInfo(LineContent): | |
LibInsFlag = True | |
continue | |
if LibInsFlag: | |
LibGuid, LibVer = GetLibInstanceInfo(LineContent, GlobalData.gWORKSPACE, LineNo, FileName) | |
# | |
# If the VERSION_STRING is missing from the INF file, tool should default to "0". | |
# | |
if LibVer == '': | |
LibVer = '0' | |
if LibGuid != '': | |
if (LibGuid, LibVer) not in LibraryList: | |
LibraryList.append((LibGuid, LibVer)) | |
# | |
# Current section archs | |
# | |
KeyList = [] | |
Item = ['', '', ''] | |
for Item in self.LastSectionHeaderContent: | |
if (Item[1], Item[2]) not in KeyList: | |
KeyList.append((Item[1], Item[2])) | |
if not InfSectionObject.SetLibraryClasses(LibraryList, KeyList=KeyList): | |
Logger.Error('InfParser', | |
FORMAT_INVALID, | |
ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR % ("[Library]"), | |
File=FileName, | |
Line=Item[3]) |