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
def FromXml2(self, Item, Key): self.AsBuiltFlags = XmlElement(Item, '%s' % Key) LineList = GetSplitValueList(self.AsBuiltFlags, '\n') ReturnLine = '' Count = 0 for Line in LineList: if Count == 0: ReturnLine = "# " + Line else: ReturnLine = ReturnLine + '\n' + '# ' + Line Count += 1 BuildFlag = BinaryBuildFlagObject() BuildFlag.SetAsBuiltOptionFlags(ReturnLine) return BuildFlag
def InfPackageParser(self, SectionString, InfSectionObject, FileName): # # Macro defined in this section # SectionMacros = {} ValueList = [] PackageList = [] StillCommentFalg = False HeaderComments = [] LineComment = None # # Parse section content # for Line in SectionString: PkgLineContent = Line[0] PkgLineNo = Line[1] if PkgLineContent.strip() == '': continue # # Find Header Comments # if PkgLineContent.strip().startswith(DT.TAB_COMMENT_SPLIT): # # Last line is comments, and this line go on. # if StillCommentFalg: HeaderComments.append(Line) continue # # First time encounter comment # else: # # Clear original data # HeaderComments = [] HeaderComments.append(Line) StillCommentFalg = True 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 PkgLineContent.find(DT.TAB_COMMENT_SPLIT) > -1: TailComments = PkgLineContent[PkgLineContent. find(DT.TAB_COMMENT_SPLIT):] PkgLineContent = PkgLineContent[:PkgLineContent. find(DT.TAB_COMMENT_SPLIT)] if LineComment is None: LineComment = InfLineCommentObject() LineComment.SetTailComments(TailComments) # # Find Macro # Name, Value = MacroParser((PkgLineContent, PkgLineNo), FileName, DT.MODEL_META_DATA_PACKAGE, self.FileLocalMacros) if Name is not None: SectionMacros[Name] = Value LineComment = None HeaderComments = [] continue TokenList = GetSplitValueList(PkgLineContent, DT.TAB_VALUE_SPLIT, 1) ValueList[0:len(TokenList)] = TokenList # # Replace with Local section Macro and [Defines] section Macro. # ValueList = [ InfExpandMacro(Value, (FileName, PkgLineContent, PkgLineNo), self.FileLocalMacros, SectionMacros, True) for Value in ValueList ] PackageList.append((ValueList, LineComment, (PkgLineContent, PkgLineNo, FileName))) ValueList = [] LineComment = None TailComments = '' HeaderComments = [] continue # # Current section archs # ArchList = [] for Item in self.LastSectionHeaderContent: if Item[1] not in ArchList: ArchList.append(Item[1]) if not InfSectionObject.SetPackages(PackageList, Arch=ArchList): Logger.Error('InfParser', FORMAT_INVALID, ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR\ %("[Packages]"), File=FileName, Line=Item[3])
def InfSourceParser(self, SectionString, InfSectionObject, FileName): SectionMacros = {} ValueList = [] SourceList = [] StillCommentFalg = False HeaderComments = [] LineComment = None SectionContent = '' for Line in SectionString: SrcLineContent = Line[0] SrcLineNo = Line[1] if SrcLineContent.strip() == '': continue # # Found Header Comments # if SrcLineContent.strip().startswith(DT.TAB_COMMENT_SPLIT): # # Last line is comments, and this line go on. # if StillCommentFalg: HeaderComments.append(Line) SectionContent += SrcLineContent + DT.END_OF_LINE continue # # First time encounter comment # else: # # Clear original data # HeaderComments = [] HeaderComments.append(Line) StillCommentFalg = True SectionContent += SrcLineContent + 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 SrcLineContent.find(DT.TAB_COMMENT_SPLIT) > -1: TailComments = SrcLineContent[SrcLineContent. find(DT.TAB_COMMENT_SPLIT):] SrcLineContent = SrcLineContent[:SrcLineContent. find(DT.TAB_COMMENT_SPLIT)] if LineComment is None: LineComment = InfLineCommentObject() LineComment.SetTailComments(TailComments) # # Find Macro # Name, Value = MacroParser((SrcLineContent, SrcLineNo), FileName, DT.MODEL_EFI_SOURCE_FILE, self.FileLocalMacros) if Name is not None: SectionMacros[Name] = Value LineComment = None HeaderComments = [] continue # # Replace with Local section Macro and [Defines] section Macro. # SrcLineContent = InfExpandMacro( SrcLineContent, (FileName, SrcLineContent, SrcLineNo), self.FileLocalMacros, SectionMacros) TokenList = GetSplitValueList(SrcLineContent, DT.TAB_VALUE_SPLIT, 4) ValueList[0:len(TokenList)] = TokenList # # Store section content string after MACRO replaced. # SectionContent += SrcLineContent + DT.END_OF_LINE SourceList.append((ValueList, LineComment, (SrcLineContent, SrcLineNo, FileName))) ValueList = [] LineComment = None TailComments = '' HeaderComments = [] continue # # Current section archs # ArchList = [] for Item in self.LastSectionHeaderContent: if Item[1] not in ArchList: ArchList.append(Item[1]) InfSectionObject.SetSupArchList(Item[1]) InfSectionObject.SetAllContent(SectionContent) if not InfSectionObject.SetSources(SourceList, Arch=ArchList): Logger.Error('InfParser', FORMAT_INVALID, ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR % ("[Sources]"), File=FileName, Line=Item[3])
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 is None: LineComment = InfLineCommentObject() LineComment.SetTailComments(TailComments) # # Find Macro # Name, Value = MacroParser((LineContent, LineNo), FileName, DT.MODEL_META_DATA_HEADER, self.FileLocalMacros) if Name is not 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 is not 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)
def InfBuildOptionParser(self, SectionString, InfSectionObject, FileName): BuildOptionList = [] SectionContent = '' if not GlobalData.gIS_BINARY_INF: ValueList = [] LineNo = 0 for Line in SectionString: LineContent = Line[0] LineNo = Line[1] TailComments = '' ReplaceFlag = False if LineContent.strip() == '': SectionContent += LineContent + DT.END_OF_LINE continue # # Found Comment # if LineContent.strip().startswith(DT.TAB_COMMENT_SPLIT): SectionContent += LineContent + DT.END_OF_LINE continue # # 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)] TokenList = GetSplitValueList(LineContent, DT.TAB_DEQUAL_SPLIT, 1) if len(TokenList) == 2: # # "Replace" type build option # TokenList.append('True') ReplaceFlag = True else: TokenList = GetSplitValueList(LineContent, DT.TAB_EQUAL_SPLIT, 1) # # "Append" type build option # if len(TokenList) == 2: TokenList.append('False') else: Logger.Error( 'InfParser', FORMAT_INVALID, ST.ERR_INF_PARSER_BUILD_OPTION_FORMAT_INVALID, ExtraData=LineContent, File=FileName, Line=LineNo) ValueList[0:len(TokenList)] = TokenList # # Replace with [Defines] section Macro # ValueList[0] = InfExpandMacro(ValueList[0], (FileName, LineContent, LineNo), self.FileLocalMacros, None) ValueList[1] = InfExpandMacro(ValueList[1], (FileName, LineContent, LineNo), self.FileLocalMacros, None, True) EqualString = '' if not ReplaceFlag: EqualString = ' = ' else: EqualString = ' == ' SectionContent += ValueList[0] + EqualString + ValueList[ 1] + TailComments + DT.END_OF_LINE Family = GetSplitValueList(ValueList[0], DT.TAB_COLON_SPLIT, 1) if len(Family) == 2: if not IsValidFamily(Family[0]): Logger.Error( 'InfParser', FORMAT_INVALID, ST.ERR_INF_PARSER_BUILD_OPTION_FORMAT_INVALID, ExtraData=LineContent, File=FileName, Line=LineNo) if not IsValidBuildOptionName(Family[1]): Logger.Error( 'InfParser', FORMAT_INVALID, ST.ERR_INF_PARSER_BUILD_OPTION_FORMAT_INVALID, ExtraData=LineContent, File=FileName, Line=LineNo) if len(Family) == 1: if not IsValidBuildOptionName(Family[0]): Logger.Error( 'InfParser', FORMAT_INVALID, ST.ERR_INF_PARSER_BUILD_OPTION_FORMAT_INVALID, ExtraData=LineContent, File=FileName, Line=LineNo) BuildOptionList.append(ValueList) ValueList = [] continue else: BuildOptionList = InfAsBuiltBuildOptionParser( SectionString, FileName) # # Current section archs # ArchList = [] LastItem = '' for Item in self.LastSectionHeaderContent: LastItem = Item if not (Item[1] == '' or Item[1] == '') and Item[1] not in ArchList: ArchList.append(Item[1]) InfSectionObject.SetSupArchList(Item[1]) InfSectionObject.SetAllContent(SectionContent) if not InfSectionObject.SetBuildOptions(BuildOptionList, ArchList, SectionContent): Logger.Error('InfParser', FORMAT_INVALID, ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR % ("[BuilOptions]"), File=FileName, Line=LastItem[3])
def InfGuidParser(self, SectionString, InfSectionObject, FileName): # # Macro defined in this section # SectionMacros = {} ValueList = [] GuidList = [] CommentsList = [] CurrentLineVar = None # # Parse section content # for Line in SectionString: LineContent = Line[0] LineNo = Line[1] if LineContent.strip() == '': CommentsList = [] continue if LineContent.strip().startswith(DT.TAB_COMMENT_SPLIT): CommentsList.append(Line) continue else: # # Encounter a GUID entry # if LineContent.find(DT.TAB_COMMENT_SPLIT) > -1: CommentsList.append( (LineContent[LineContent.find(DT.TAB_COMMENT_SPLIT):], LineNo)) LineContent = \ LineContent[:LineContent.find(DT.TAB_COMMENT_SPLIT)] if LineContent != '': # # Find Macro # Name, Value = MacroParser((LineContent, LineNo), FileName, DT.MODEL_EFI_GUID, self.FileLocalMacros) if Name is not None: SectionMacros[Name] = Value CommentsList = [] ValueList = [] continue TokenList = GetSplitValueList(LineContent, DT.TAB_VALUE_SPLIT, 1) ValueList[0:len(TokenList)] = TokenList # # Replace with Local section Macro and [Defines] section Macro. # ValueList = [ InfExpandMacro(Value, (FileName, LineContent, LineNo), self.FileLocalMacros, SectionMacros, True) for Value in ValueList ] CurrentLineVar = (LineContent, LineNo, FileName) if len(ValueList) >= 1: GuidList.append((ValueList, CommentsList, CurrentLineVar)) CommentsList = [] ValueList = [] continue # # Current section archs # ArchList = [] LineIndex = -1 for Item in self.LastSectionHeaderContent: LineIndex = Item[3] if Item[1] not in ArchList: ArchList.append(Item[1]) if not InfSectionObject.SetGuid(GuidList, Arch=ArchList): Logger.Error('InfParser', FORMAT_INVALID, ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR % ("[Guid]"), File=FileName, Line=LineIndex)
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 is None: LibLineComment = InfLineCommentObject() LibLineComment.SetTailComments(LibTailComments) # # Find Macro # Name, Value = MacroParser((LibLineContent, LibLineNo), FileName, DT.MODEL_EFI_LIBRARY_CLASS, self.FileLocalMacros) if Name is not 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 InfBuildOptionParser(self, SectionString, InfSectionObject, FileName): BuildOptionList = [] SectionContent = '' if not GlobalData.gIS_BINARY_INF: ValueList = [] LineNo = 0 for Line in SectionString: LineContent = Line[0] LineNo = Line[1] TailComments = '' ReplaceFlag = False if LineContent.strip() == '': SectionContent += LineContent + DT.END_OF_LINE continue # # Found Comment # if LineContent.strip().startswith(DT.TAB_COMMENT_SPLIT): SectionContent += LineContent + DT.END_OF_LINE continue # # 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)] TokenList = GetSplitValueList(LineContent, DT.TAB_DEQUAL_SPLIT, 1) if len(TokenList) == 2: # # "Replace" type build option # TokenList.append('True') ReplaceFlag = True else: TokenList = GetSplitValueList(LineContent, DT.TAB_EQUAL_SPLIT, 1) # # "Append" type build option # if len(TokenList) == 2: TokenList.append('False') else: Logger.Error('InfParser', FORMAT_INVALID, ST.ERR_INF_PARSER_BUILD_OPTION_FORMAT_INVALID, ExtraData=LineContent, File=FileName, Line=LineNo) ValueList[0:len(TokenList)] = TokenList # # Replace with [Defines] section Macro # ValueList[0] = InfExpandMacro(ValueList[0], (FileName, LineContent, LineNo), self.FileLocalMacros, None) ValueList[1] = InfExpandMacro(ValueList[1], (FileName, LineContent, LineNo), self.FileLocalMacros, None, True) EqualString = '' if not ReplaceFlag: EqualString = ' = ' else: EqualString = ' == ' SectionContent += ValueList[0] + EqualString + ValueList[1] + TailComments + DT.END_OF_LINE Family = GetSplitValueList(ValueList[0], DT.TAB_COLON_SPLIT, 1) if len(Family) == 2: if not IsValidFamily(Family[0]): Logger.Error('InfParser', FORMAT_INVALID, ST.ERR_INF_PARSER_BUILD_OPTION_FORMAT_INVALID, ExtraData=LineContent, File=FileName, Line=LineNo) if not IsValidBuildOptionName(Family[1]): Logger.Error('InfParser', FORMAT_INVALID, ST.ERR_INF_PARSER_BUILD_OPTION_FORMAT_INVALID, ExtraData=LineContent, File=FileName, Line=LineNo) if len(Family) == 1: if not IsValidBuildOptionName(Family[0]): Logger.Error('InfParser', FORMAT_INVALID, ST.ERR_INF_PARSER_BUILD_OPTION_FORMAT_INVALID, ExtraData=LineContent, File=FileName, Line=LineNo) BuildOptionList.append(ValueList) ValueList = [] continue else: BuildOptionList = InfAsBuiltBuildOptionParser(SectionString, FileName) # # Current section archs # ArchList = [] LastItem = '' for Item in self.LastSectionHeaderContent: LastItem = Item if not (Item[1] == '' or Item[1] == '') and Item[1] not in ArchList: ArchList.append(Item[1]) InfSectionObject.SetSupArchList(Item[1]) InfSectionObject.SetAllContent(SectionContent) if not InfSectionObject.SetBuildOptions(BuildOptionList, ArchList, SectionContent): Logger.Error('InfParser', FORMAT_INVALID, ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR%("[BuilOptions]"), File=FileName, Line=LastItem[3])
def InfBinaryParser(self, SectionString, InfSectionObject, FileName): # # Macro defined in this section # SectionMacros = {} ValueList = [] # # For UI (UI, SEC_UI, UNI_UI) binaries # One and only one UI section can be included # UiBinaryList = [] # # For Version (VER, SEC_VER, UNI_VER). # One and only one VER section on be included # VerBinaryList = [] # # For other common type binaries # ComBinaryList = [] StillCommentFalg = False HeaderComments = [] LineComment = None AllSectionContent = '' # # Parse section content # for Line in SectionString: BinLineContent = Line[0] BinLineNo = Line[1] if BinLineContent.strip() == '': continue CurrentLineObj = CurrentLine() CurrentLineObj.FileName = FileName CurrentLineObj.LineString = BinLineContent CurrentLineObj.LineNo = BinLineNo # # Found Header Comments # if BinLineContent.strip().startswith(DT.TAB_COMMENT_SPLIT): # # Last line is comments, and this line go on. # if StillCommentFalg: HeaderComments.append(Line) AllSectionContent += BinLineContent + DT.END_OF_LINE continue # # First time encounter comment # else: # # Clear original data # HeaderComments = [] HeaderComments.append(Line) AllSectionContent += BinLineContent + DT.END_OF_LINE StillCommentFalg = True 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 BinLineContent.find(DT.TAB_COMMENT_SPLIT) > -1: TailComments = BinLineContent[BinLineContent. find(DT.TAB_COMMENT_SPLIT):] BinLineContent = BinLineContent[:BinLineContent. find(DT.TAB_COMMENT_SPLIT)] if LineComment == None: LineComment = InfLineCommentObject() LineComment.SetTailComments(TailComments) # # Find Macro # MacroDef = MacroParser((BinLineContent, BinLineNo), FileName, DT.MODEL_EFI_BINARY_FILE, self.FileLocalMacros) if MacroDef[0] != None: SectionMacros[MacroDef[0]] = MacroDef[1] LineComment = None HeaderComments = [] continue # # Replace with Local section Macro and [Defines] section Macro. # LineContent = InfExpandMacro(BinLineContent, (FileName, BinLineContent, BinLineNo), self.FileLocalMacros, SectionMacros, True) AllSectionContent += LineContent + DT.END_OF_LINE TokenList = GetSplitValueList(LineContent, DT.TAB_VALUE_SPLIT, 1) ValueList[0:len(TokenList)] = TokenList # # Should equal to UI/SEC_UI/UNI_UI # ValueList[0] = ValueList[0].strip() if ValueList[0] == DT.BINARY_FILE_TYPE_UNI_UI or \ ValueList[0] == DT.BINARY_FILE_TYPE_SEC_UI or \ ValueList[0] == DT.BINARY_FILE_TYPE_UI: if len(ValueList) == 2: TokenList = GetSplitValueList(ValueList[1], DT.TAB_VALUE_SPLIT, 2) NewValueList = [] NewValueList.append(ValueList[0]) for Item in TokenList: NewValueList.append(Item) UiBinaryList.append( (NewValueList, LineComment, CurrentLineObj)) # # Should equal to VER/SEC_VER/UNI_VER # elif ValueList[0] == DT.BINARY_FILE_TYPE_UNI_VER or \ ValueList[0] == DT.BINARY_FILE_TYPE_SEC_VER or \ ValueList[0] == DT.BINARY_FILE_TYPE_VER: if len(ValueList) == 2: TokenList = GetSplitValueList(ValueList[1], DT.TAB_VALUE_SPLIT, 2) NewValueList = [] NewValueList.append(ValueList[0]) for Item in TokenList: NewValueList.append(Item) VerBinaryList.append( (NewValueList, LineComment, CurrentLineObj)) else: if len(ValueList) == 2: if ValueList[0].strip() == 'SUBTYPE_GUID': TokenList = GetSplitValueList(ValueList[1], DT.TAB_VALUE_SPLIT, 5) else: TokenList = GetSplitValueList(ValueList[1], DT.TAB_VALUE_SPLIT, 4) NewValueList = [] NewValueList.append(ValueList[0]) for Item in TokenList: NewValueList.append(Item) ComBinaryList.append( (NewValueList, LineComment, CurrentLineObj)) elif len(ValueList) == 1: NewValueList = [] NewValueList.append(ValueList[0]) ComBinaryList.append( (NewValueList, LineComment, CurrentLineObj)) ValueList = [] LineComment = None TailComments = '' HeaderComments = [] continue # # Current section archs # ArchList = [] for Item in self.LastSectionHeaderContent: if Item[1] not in ArchList: ArchList.append(Item[1]) InfSectionObject.SetSupArchList(Item[1]) InfSectionObject.SetAllContent(AllSectionContent) if not InfSectionObject.SetBinary(UiBinaryList, VerBinaryList, ComBinaryList, ArchList): Logger.Error('InfParser', FORMAT_INVALID, ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR % ("[Binaries]"), File=FileName, Line=Item[3])
def InfDepexParser(self, SectionString, InfSectionObject, FileName): DepexContent = [] DepexComment = [] ValueList = [] # # Parse section content # for Line in SectionString: LineContent = Line[0] LineNo = Line[1] # # Found comment # if LineContent.strip().startswith(DT.TAB_COMMENT_SPLIT): DepexComment.append((LineContent, LineNo)) continue # # Replace with [Defines] section Macro # LineContent = InfExpandMacro(LineContent, (FileName, LineContent, Line[1]), self.FileLocalMacros, None, True) CommentCount = LineContent.find(DT.TAB_COMMENT_SPLIT) if CommentCount > -1: DepexComment.append((LineContent[CommentCount:], LineNo)) LineContent = LineContent[:CommentCount-1] CommentCount = -1 DepexContent.append((LineContent, LineNo)) TokenList = GetSplitValueList(LineContent, DT.TAB_COMMENT_SPLIT) ValueList[0:len(TokenList)] = TokenList # # Current section archs # KeyList = [] LastItem = '' for Item in self.LastSectionHeaderContent: LastItem = Item if (Item[1], Item[2], Item[3]) not in KeyList: KeyList.append((Item[1], Item[2], Item[3])) NewCommentList = [] FormatCommentLn = -1 ReFormatComment = re.compile(r"""#(?:\s*)\[(.*?)\](?:.*)""", re.DOTALL) for CommentItem in DepexComment: CommentContent = CommentItem[0] if ReFormatComment.match(CommentContent) is not None: FormatCommentLn = CommentItem[1] + 1 continue if CommentItem[1] != FormatCommentLn: NewCommentList.append(CommentContent) else: FormatCommentLn = CommentItem[1] + 1 if not InfSectionObject.SetDepex(DepexContent, KeyList = KeyList, CommentList = NewCommentList): Logger.Error('InfParser', FORMAT_INVALID, ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR%("[Depex]"), File=FileName, Line=LastItem[3])
def InfPcdParser(self, SectionString, InfSectionObject, FileName): KeysList = [] PcdList = [] CommentsList = [] ValueList = [] # # Current section archs # LineIndex = -1 for Item in self.LastSectionHeaderContent: if (Item[0], Item[1], Item[3]) not in KeysList: KeysList.append((Item[0], Item[1], Item[3])) LineIndex = Item[3] if (Item[0].upper() == DT.TAB_INF_FIXED_PCD.upper() or \ Item[0].upper() == DT.TAB_INF_FEATURE_PCD.upper() or \ Item[0].upper() == DT.TAB_INF_PCD.upper()) and GlobalData.gIS_BINARY_INF: Logger.Error('InfParser', FORMAT_INVALID, ST.ERR_ASBUILD_PCD_SECTION_TYPE % ("\"" + Item[0] + "\""), File=FileName, Line=LineIndex) # # For Common INF file # if not GlobalData.gIS_BINARY_INF: # # Macro defined in this section # SectionMacros = {} for Line in SectionString: PcdLineContent = Line[0] PcdLineNo = Line[1] if PcdLineContent.strip() == '': CommentsList = [] continue if PcdLineContent.strip().startswith(DT.TAB_COMMENT_SPLIT): CommentsList.append(Line) continue else: # # Encounter a PCD entry # if PcdLineContent.find(DT.TAB_COMMENT_SPLIT) > -1: CommentsList.append( (PcdLineContent[PcdLineContent. find(DT.TAB_COMMENT_SPLIT):], PcdLineNo)) PcdLineContent = PcdLineContent[:PcdLineContent.find( DT.TAB_COMMENT_SPLIT)] if PcdLineContent != '': # # Find Macro # Name, Value = MacroParser((PcdLineContent, PcdLineNo), FileName, DT.MODEL_EFI_PCD, self.FileLocalMacros) if Name is not None: SectionMacros[Name] = Value ValueList = [] CommentsList = [] continue PcdEntryReturn = SplitPcdEntry(PcdLineContent) if not PcdEntryReturn[1]: TokenList = [''] else: TokenList = PcdEntryReturn[0] ValueList[0:len(TokenList)] = TokenList # # Replace with Local section Macro and [Defines] section Macro. # ValueList = [ InfExpandMacro(Value, (FileName, PcdLineContent, PcdLineNo), self.FileLocalMacros, SectionMacros, True) for Value in ValueList ] if len(ValueList) >= 1: PcdList.append((ValueList, CommentsList, (PcdLineContent, PcdLineNo, FileName))) ValueList = [] CommentsList = [] continue # # For Binary INF file # else: for Line in SectionString: LineContent = Line[0].strip() LineNo = Line[1] if LineContent == '': CommentsList = [] continue if LineContent.startswith(DT.TAB_COMMENT_SPLIT): CommentsList.append(LineContent) continue # # Have comments at tail. # CommentIndex = LineContent.find(DT.TAB_COMMENT_SPLIT) if CommentIndex > -1: CommentsList.append(LineContent[CommentIndex + 1:]) LineContent = LineContent[:CommentIndex] TokenList = GetSplitValueList(LineContent, DT.TAB_VALUE_SPLIT) # # PatchablePcd # TokenSpace.CName | Value | Offset # if KeysList[0][0].upper() == DT.TAB_INF_PATCH_PCD.upper(): if len(TokenList) != 3: Logger.Error('InfParser', FORMAT_INVALID, ST.ERR_ASBUILD_PATCHPCD_FORMAT_INVALID, File=FileName, Line=LineNo, ExtraData=LineContent) # elif KeysList[0][0].upper() == DT.TAB_INF_PCD_EX.upper(): if len(TokenList) != 1: Logger.Error('InfParser', FORMAT_INVALID, ST.ERR_ASBUILD_PCDEX_FORMAT_INVALID, File=FileName, Line=LineNo, ExtraData=LineContent) ValueList[0:len(TokenList)] = TokenList if len(ValueList) >= 1: PcdList.append((ValueList, CommentsList, (LineContent, LineNo, FileName))) ValueList = [] CommentsList = [] continue if not InfSectionObject.SetPcds( PcdList, KeysList=KeysList, PackageInfo=self.InfPackageSection.GetPackages()): Logger.Error('InfParser', FORMAT_INVALID, ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR % ("[PCD]"), File=FileName, Line=LineIndex)