diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-11 08:17:27 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-11 08:17:27 +0000 |
commit | f215e02bf85f68d3a6106c2a1f4f7f063f819064 (patch) | |
tree | 6bb5b92c046312c4e95ac2620b10ddf482d3fa8b /src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfBuildOptionSectionParser.py | |
parent | Initial commit. (diff) | |
download | virtualbox-f215e02bf85f68d3a6106c2a1f4f7f063f819064.tar.xz virtualbox-f215e02bf85f68d3a6106c2a1f4f7f063f819064.zip |
Adding upstream version 7.0.14-dfsg.upstream/7.0.14-dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfBuildOptionSectionParser.py')
-rwxr-xr-x | src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfBuildOptionSectionParser.py | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfBuildOptionSectionParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfBuildOptionSectionParser.py new file mode 100755 index 00000000..3f74ff0c --- /dev/null +++ b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfBuildOptionSectionParser.py @@ -0,0 +1,212 @@ +## @file +# This file contained the parser for BuildOption sections in INF file +# +# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# + +''' +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 |