| ## @file | |
| # This file contained the parser for BuildOption 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. | |
| # | |
| ''' | |
| InfBuildOptionSectionParser | |
| ''' | |
| ## | |
| # Import Modules | |
| # | |
| from Library import DataType as DT | |
| from Library import GlobalData | |
| import Logger.Log as Logger | |
| from Logger import StringTable as ST | |
| from Logger.ToolError import FORMAT_INVALID | |
| from Parser.InfParserMisc import InfExpandMacro | |
| from Library.Misc import GetSplitValueList | |
| from Parser.InfParserMisc import IsAsBuildOptionInfo | |
| from Library.Misc import GetHelpStringByRemoveHashKey | |
| from Library.ParserValidate import IsValidFamily | |
| from Library.ParserValidate import IsValidBuildOptionName | |
| from Parser.InfParserMisc import InfParserSectionRoot | |
| class InfBuildOptionSectionParser(InfParserSectionRoot): | |
| ## InfBuildOptionParser | |
| # | |
| # | |
| 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]) | |
| ## InfBuildOptionParser | |
| # | |
| # | |
| def InfAsBuiltBuildOptionParser(SectionString, FileName): | |
| BuildOptionList = [] | |
| # | |
| # AsBuild Binary INF file. | |
| # | |
| AsBuildOptionFlag = False | |
| BuildOptionItem = [] | |
| Count = 0 | |
| for Line in SectionString: | |
| Count += 1 | |
| LineContent = Line[0] | |
| LineNo = Line[1] | |
| # | |
| # The last line | |
| # | |
| if len(SectionString) == Count: | |
| if LineContent.strip().startswith("##") and AsBuildOptionFlag: | |
| BuildOptionList.append(BuildOptionItem) | |
| BuildOptionList.append([GetHelpStringByRemoveHashKey(LineContent)]) | |
| elif LineContent.strip().startswith("#") and AsBuildOptionFlag: | |
| BuildOptionInfo = GetHelpStringByRemoveHashKey(LineContent) | |
| BuildOptionItem.append(BuildOptionInfo) | |
| BuildOptionList.append(BuildOptionItem) | |
| else: | |
| if len(BuildOptionItem) > 0: | |
| BuildOptionList.append(BuildOptionItem) | |
| break | |
| if LineContent.strip() == '': | |
| AsBuildOptionFlag = False | |
| continue | |
| if LineContent.strip().startswith("##") and AsBuildOptionFlag: | |
| if len(BuildOptionItem) > 0: | |
| BuildOptionList.append(BuildOptionItem) | |
| BuildOptionItem = [] | |
| if not LineContent.strip().startswith("#"): | |
| Logger.Error('InfParser', | |
| FORMAT_INVALID, | |
| ST.ERR_BO_CONTATIN_ASBUILD_AND_COMMON, | |
| File=FileName, | |
| Line=LineNo, | |
| ExtraData=LineContent) | |
| if IsAsBuildOptionInfo(LineContent): | |
| AsBuildOptionFlag = True | |
| continue | |
| if AsBuildOptionFlag: | |
| BuildOptionInfo = GetHelpStringByRemoveHashKey(LineContent) | |
| BuildOptionItem.append(BuildOptionInfo) | |
| return BuildOptionList |