## @file | |
# This file contained the parser for define sections in INF file | |
# | |
# Copyright (c) 2011, 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. | |
# | |
''' | |
InfDefineSectionParser | |
''' | |
## | |
# Import Modules | |
# | |
import re | |
from Library import DataType as DT | |
from Library import GlobalData | |
from Library.Parsing import MacroParser | |
from Library.Misc import GetSplitValueList | |
from Library.ParserValidate import IsValidArch | |
from Object.Parser.InfCommonObject import InfLineCommentObject | |
from Object.Parser.InfDefineObject import InfDefMember | |
from Parser.InfParserMisc import InfExpandMacro | |
from Object.Parser.InfMisc import ErrorInInf | |
from Logger import StringTable as ST | |
from Parser.InfParserMisc import InfParserSectionRoot | |
## __GetValidateArchList | |
# | |
# | |
def GetValidateArchList(LineContent): | |
TempArch = '' | |
ArchList = [] | |
ValidateAcrhPatten = re.compile(r"^\s*#\s*VALID_ARCHITECTURES\s*=\s*.*$", re.DOTALL) | |
if ValidateAcrhPatten.match(LineContent): | |
TempArch = GetSplitValueList(LineContent, DT.TAB_EQUAL_SPLIT, 1)[1] | |
TempArch = GetSplitValueList(TempArch, '(', 1)[0] | |
ArchList = re.split('\s+', TempArch) | |
NewArchList = [] | |
for Arch in ArchList: | |
if IsValidArch(Arch): | |
NewArchList.append(Arch) | |
ArchList = NewArchList | |
return ArchList | |
class InfDefinSectionParser(InfParserSectionRoot): | |
def InfDefineParser(self, SectionString, InfSectionObject, FileName, SectionComment): | |
if SectionComment: | |
pass | |
# | |
# Parser Defines section content and fill self._ContentList dict. | |
# | |
StillCommentFalg = False | |
HeaderComments = [] | |
SectionContent = '' | |
ArchList = [] | |
_ContentList = [] | |
_ValueList = [] | |
# | |
# Add WORKSPACE to global Marco dict. | |
# | |
self.FileLocalMacros['WORKSPACE'] = GlobalData.gWORKSPACE | |
for Line in SectionString: | |
LineContent = Line[0] | |
LineNo = Line[1] | |
TailComments = '' | |
LineComment = None | |
LineInfo = ['', -1, ''] | |
LineInfo[0] = FileName | |
LineInfo[1] = LineNo | |
LineInfo[2] = LineContent | |
if LineContent.strip() == '': | |
continue | |
# | |
# The first time encountered VALIDATE_ARCHITECHERS will be considered as support arch list. | |
# | |
if not ArchList: | |
ArchList = GetValidateArchList(LineContent) | |
# | |
# Parser Comment | |
# | |
if LineContent.strip().startswith(DT.TAB_COMMENT_SPLIT): | |
# | |
# Last line is comments, and this line go on. | |
# | |
if StillCommentFalg: | |
HeaderComments.append(Line) | |
SectionContent += LineContent + DT.END_OF_LINE | |
continue | |
# | |
# First time encounter comment | |
# | |
else: | |
# | |
# Clear original data | |
# | |
HeaderComments = [] | |
HeaderComments.append(Line) | |
StillCommentFalg = True | |
SectionContent += LineContent + DT.END_OF_LINE | |
continue | |
else: | |
StillCommentFalg = False | |
if len(HeaderComments) >= 1: | |
LineComment = InfLineCommentObject() | |
LineCommentContent = '' | |
for Item in HeaderComments: | |
LineCommentContent += Item[0] + DT.END_OF_LINE | |
LineComment.SetHeaderComments(LineCommentContent) | |
# | |
# Find Tail comment. | |
# | |
if LineContent.find(DT.TAB_COMMENT_SPLIT) > -1: | |
TailComments = LineContent[LineContent.find(DT.TAB_COMMENT_SPLIT):] | |
LineContent = LineContent[:LineContent.find(DT.TAB_COMMENT_SPLIT)] | |
if LineComment == None: | |
LineComment = InfLineCommentObject() | |
LineComment.SetTailComments(TailComments) | |
# | |
# Find Macro | |
# | |
Name, Value = MacroParser((LineContent, LineNo), | |
FileName, | |
DT.MODEL_META_DATA_HEADER, | |
self.FileLocalMacros) | |
if Name != None: | |
self.FileLocalMacros[Name] = Value | |
continue | |
# | |
# Replace with [Defines] section Macro | |
# | |
LineContent = InfExpandMacro(LineContent, | |
(FileName, LineContent, LineNo), | |
self.FileLocalMacros, | |
None, True) | |
SectionContent += LineContent + DT.END_OF_LINE | |
TokenList = GetSplitValueList(LineContent, DT.TAB_EQUAL_SPLIT, 1) | |
if len(TokenList) < 2: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_NO_VALUE, | |
LineInfo=LineInfo) | |
_ValueList[0:len(TokenList)] = TokenList | |
if not _ValueList[0]: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_NO_NAME, | |
LineInfo=LineInfo) | |
if not _ValueList[1]: | |
ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_NO_VALUE, | |
LineInfo=LineInfo) | |
Name, Value = _ValueList[0], _ValueList[1] | |
InfDefMemberObj = InfDefMember(Name, Value) | |
if (LineComment != None): | |
InfDefMemberObj.Comments.SetHeaderComments(LineComment.GetHeaderComments()) | |
InfDefMemberObj.Comments.SetTailComments(LineComment.GetTailComments()) | |
InfDefMemberObj.CurrentLine.SetFileName(self.FullPath) | |
InfDefMemberObj.CurrentLine.SetLineString(LineContent) | |
InfDefMemberObj.CurrentLine.SetLineNo(LineNo) | |
_ContentList.append(InfDefMemberObj) | |
HeaderComments = [] | |
TailComments = '' | |
# | |
# Current Define section archs | |
# | |
if not ArchList: | |
ArchList = ['COMMON'] | |
InfSectionObject.SetAllContent(SectionContent) | |
InfSectionObject.SetDefines(_ContentList, Arch=ArchList) | |