4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This file is used to define common parsing related functions used in parsing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# INF/DEC/DSC process
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This program and the accompanying materials are licensed and made available
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# under the terms and conditions of the BSD License which accompanies this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# http://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync'''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncParsing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync'''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync##
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Import Modules
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncimport os.path
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncimport re
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library.String import RaiseParserError
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library.String import GetSplitValueList
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library.String import CheckFileType
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library.String import CheckFileExist
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library.String import CleanString
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library.String import NormPath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Logger.ToolError import FILE_NOT_FOUND
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Logger.ToolError import FatalError
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Logger.ToolError import FORMAT_INVALID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library import DataType
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library.Misc import GuidStructureStringToGuidString
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library.Misc import CheckGuidRegFormat
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Logger import StringTable as ST
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncimport Logger.Log as Logger
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Parser.DecParser import Dec
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncgPKG_INFO_DICT = {}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## GetBuildOption
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Parse a string with format "[<Family>:]<ToolFlag>=Flag"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Return (Family, ToolFlag, Flag)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param String: String with BuildOption statement
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param File: The file which defines build option, used in error report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GetBuildOption(String, File, LineNo=-1):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Family, ToolChain, Flag) = ('', '', '')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if String.find(DataType.TAB_EQUAL_SPLIT) < 0:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RaiseParserError(String, 'BuildOptions', File, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync '[<Family>:]<ToolFlag>=Flag', LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync List = GetSplitValueList(String, DataType.TAB_EQUAL_SPLIT, MaxSplit=1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if List[0].find(':') > -1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Family = List[0][ : List[0].find(':')].strip()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ToolChain = List[0][List[0].find(':') + 1 : ].strip()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ToolChain = List[0].strip()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Flag = List[1].strip()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Family, ToolChain, Flag)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## Get Library Class
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Get Library of Dsc as <LibraryClassKeyWord>|<LibraryInstance>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Item: String as <LibraryClassKeyWord>|<LibraryInstance>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param ContainerFile: The file which describes the library class, used for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# error report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GetLibraryClass(Item, ContainerFile, WorkspaceDir, LineNo=-1):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync List = GetSplitValueList(Item[0])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SupMod = DataType.SUP_MODULE_LIST_STRING
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(List) != 2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RaiseParserError(Item[0], 'LibraryClasses', ContainerFile, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync '<LibraryClassKeyWord>|<LibraryInstance>')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckFileType(List[1], '.Inf', ContainerFile, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 'library class instance', Item[0], LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckFileExist(WorkspaceDir, List[1], ContainerFile, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 'LibraryClasses', Item[0], LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Item[1] != '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SupMod = Item[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (List[0], List[1], SupMod)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## Get Library Class
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Get Library of Dsc as <LibraryClassKeyWord>[|<LibraryInstance>]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# [|<TokenSpaceGuidCName>.<PcdCName>]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Item: String as <LibraryClassKeyWord>|<LibraryInstance>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param ContainerFile: The file which describes the library class, used for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# error report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GetLibraryClassOfInf(Item, ContainerFile, WorkspaceDir, LineNo = -1):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ItemList = GetSplitValueList((Item[0] + DataType.TAB_VALUE_SPLIT * 2))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SupMod = DataType.SUP_MODULE_LIST_STRING
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(ItemList) > 5:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RaiseParserError\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Item[0], 'LibraryClasses', ContainerFile, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync '<LibraryClassKeyWord>[|<LibraryInstance>]\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync [|<TokenSpaceGuidCName>.<PcdCName>]')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckFileType(ItemList[1], '.Inf', ContainerFile, 'LibraryClasses', \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item[0], LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckFileExist(WorkspaceDir, ItemList[1], ContainerFile, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 'LibraryClasses', Item[0], LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ItemList[2] != '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckPcdTokenInfo(ItemList[2], 'LibraryClasses', \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ContainerFile, LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Item[1] != '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SupMod = Item[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (ItemList[0], ItemList[1], ItemList[2], SupMod)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## CheckPcdTokenInfo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Check if PcdTokenInfo is following <TokenSpaceGuidCName>.<PcdCName>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param TokenInfoString: String to be checked
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Section: Used for error report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param File: Used for error report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef CheckPcdTokenInfo(TokenInfoString, Section, File, LineNo=-1):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Format = '<TokenSpaceGuidCName>.<PcdCName>'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if TokenInfoString != '' and TokenInfoString != None:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TokenInfoList = GetSplitValueList(TokenInfoString, DataType.TAB_SPLIT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(TokenInfoList) == 2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return True
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RaiseParserError(TokenInfoString, Section, File, Format, LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## Get Pcd
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Get Pcd of Dsc as <PcdTokenSpaceGuidCName>.<TokenCName>|<Value>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# [|<Type>|<MaximumDatumSize>]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Item: String as <PcdTokenSpaceGuidCName>.<TokenCName>|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# <Value>[|<Type>|<MaximumDatumSize>]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param ContainerFile: The file which describes the pcd, used for error
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GetPcd(Item, Type, ContainerFile, LineNo=-1):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TokenGuid, TokenName, Value, MaximumDatumSize, Token = '', '', '', '', ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync List = GetSplitValueList(Item + DataType.TAB_VALUE_SPLIT * 2)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(List) < 4 or len(List) > 6:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RaiseParserError(Item, 'Pcds' + Type, ContainerFile, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync '<PcdTokenSpaceGuidCName>.<TokenCName>|<Value>\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync [|<Type>|<MaximumDatumSize>]', LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = List[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MaximumDatumSize = List[2]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Token = List[3]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile, LineNo):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (TokenGuid, TokenName) = GetSplitValueList(List[0], DataType.TAB_SPLIT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TokenName, TokenGuid, Value, MaximumDatumSize, Token, Type)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## Get FeatureFlagPcd
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Get FeatureFlagPcd of Dsc as <PcdTokenSpaceGuidCName>.<TokenCName>|TRUE/FALSE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Item: String as <PcdTokenSpaceGuidCName>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# .<TokenCName>|TRUE/FALSE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param ContainerFile: The file which describes the pcd, used for error
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GetFeatureFlagPcd(Item, Type, ContainerFile, LineNo=-1):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TokenGuid, TokenName, Value = '', '', ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync List = GetSplitValueList(Item)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(List) != 2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RaiseParserError(Item, 'Pcds' + Type, ContainerFile, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync '<PcdTokenSpaceGuidCName>.<TokenCName>|TRUE/FALSE', \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = List[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile, LineNo):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (TokenGuid, TokenName) = GetSplitValueList(List[0], DataType.TAB_SPLIT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TokenName, TokenGuid, Value, Type)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## Get DynamicDefaultPcd
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Get DynamicDefaultPcd of Dsc as <PcdTokenSpaceGuidCName>.<TokenCName>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# |<Value>[|<DatumTyp>[|<MaxDatumSize>]]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Item: String as <PcdTokenSpaceGuidCName>.<TokenCName>|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# TRUE/FALSE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param ContainerFile: The file which describes the pcd, used for error
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GetDynamicDefaultPcd(Item, Type, ContainerFile, LineNo=-1):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TokenGuid, TokenName, Value, DatumTyp, MaxDatumSize = '', '', '', '', ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync List = GetSplitValueList(Item + DataType.TAB_VALUE_SPLIT * 2)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(List) < 4 or len(List) > 8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RaiseParserError(Item, 'Pcds' + Type, ContainerFile, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync '<PcdTokenSpaceGuidCName>.<TokenCName>|<Value>\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync [|<DatumTyp>[|<MaxDatumSize>]]', LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = List[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DatumTyp = List[2]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MaxDatumSize = List[3]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile, LineNo):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (TokenGuid, TokenName) = GetSplitValueList(List[0], DataType.TAB_SPLIT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TokenName, TokenGuid, Value, DatumTyp, MaxDatumSize, Type)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## Get DynamicHiiPcd
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Get DynamicHiiPcd of Dsc as <PcdTokenSpaceGuidCName>.<TokenCName>|<String>|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# <VariableGuidCName>|<VariableOffset>[|<DefaultValue>[|<MaximumDatumSize>]]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Item: String as <PcdTokenSpaceGuidCName>.<TokenCName>|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# TRUE/FALSE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param ContainerFile: The file which describes the pcd, used for error
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GetDynamicHiiPcd(Item, Type, ContainerFile, LineNo = -1):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TokenGuid, TokenName, List1, List2, List3, List4, List5 = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync '', '', '', '', '', '', ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync List = GetSplitValueList(Item + DataType.TAB_VALUE_SPLIT * 2)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(List) < 6 or len(List) > 8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RaiseParserError(Item, 'Pcds' + Type, ContainerFile, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync '<PcdTokenSpaceGuidCName>.<TokenCName>|<String>|\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <VariableGuidCName>|<VariableOffset>[|<DefaultValue>\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync [|<MaximumDatumSize>]]', LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync List1, List2, List3, List4, List5 = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync List[1], List[2], List[3], List[4], List[5]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile, LineNo):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (TokenGuid, TokenName) = GetSplitValueList(List[0], DataType.TAB_SPLIT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TokenName, TokenGuid, List1, List2, List3, List4, List5, Type)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## Get DynamicVpdPcd
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Get DynamicVpdPcd of Dsc as <PcdTokenSpaceGuidCName>.<TokenCName>|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# <VpdOffset>[|<MaximumDatumSize>]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Item: String as <PcdTokenSpaceGuidCName>.<TokenCName>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# |TRUE/FALSE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param ContainerFile: The file which describes the pcd, used for error
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GetDynamicVpdPcd(Item, Type, ContainerFile, LineNo=-1):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TokenGuid, TokenName, List1, List2 = '', '', '', ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync List = GetSplitValueList(Item + DataType.TAB_VALUE_SPLIT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(List) < 3 or len(List) > 4:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RaiseParserError(Item, 'Pcds' + Type, ContainerFile, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync '<PcdTokenSpaceGuidCName>.<TokenCName>|<VpdOffset>\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync [|<MaximumDatumSize>]', LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync List1, List2 = List[1], List[2]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile, LineNo):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (TokenGuid, TokenName) = GetSplitValueList(List[0], DataType.TAB_SPLIT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TokenName, TokenGuid, List1, List2, Type)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## GetComponent
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Parse block of the components defined in dsc file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Set KeyValues as [ ['component name', [lib1, lib2, lib3],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# [bo1, bo2, bo3], [pcd1, pcd2, pcd3]], ...]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Lines: The content to be parsed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param KeyValues: To store data after parsing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GetComponent(Lines, KeyValues):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (FindBlock, FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsPatchableInModule, FindPcdsFixedAtBuild, FindPcdsDynamic, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsDynamicEx) = (False, False, False, False, False, False, False, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync False)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ListItem = None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LibraryClassItem = []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BuildOption = []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pcd = []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Line in Lines:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line = Line[0]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Ignore !include statement
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line.upper().find(DataType.TAB_INCLUDE.upper() + ' ') > -1 or \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line.upper().find(DataType.TAB_DEFINE + ' ') > -1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FindBlock == False:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ListItem = Line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # find '{' at line tail
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line.endswith('{'):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindBlock = True
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ListItem = CleanString(Line.rsplit('{', 1)[0], \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataType.TAB_COMMENT_SPLIT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Parse a block content
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FindBlock:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line.find('<LibraryClasses>') != -1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsDynamic, FindPcdsDynamicEx) = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (True, False, False, False, False, False, False)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line.find('<BuildOptions>') != -1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsDynamic, FindPcdsDynamicEx) = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (False, True, False, False, False, False, False)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line.find('<PcdsFeatureFlag>') != -1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsDynamic, FindPcdsDynamicEx) = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (False, False, True, False, False, False, False)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line.find('<PcdsPatchableInModule>') != -1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsDynamic, FindPcdsDynamicEx) = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (False, False, False, True, False, False, False)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line.find('<PcdsFixedAtBuild>') != -1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsDynamic, FindPcdsDynamicEx) = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (False, False, False, False, True, False, False)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line.find('<PcdsDynamic>') != -1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsDynamic, FindPcdsDynamicEx) = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (False, False, False, False, False, True, False)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line.find('<PcdsDynamicEx>') != -1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsDynamic, FindPcdsDynamicEx) = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (False, False, False, False, False, False, True)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line.endswith('}'):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # find '}' at line tail
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync KeyValues.append([ListItem, LibraryClassItem, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BuildOption, Pcd])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (FindBlock, FindLibraryClass, FindBuildOption, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsFeatureFlag, FindPcdsPatchableInModule, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsFixedAtBuild, FindPcdsDynamic, FindPcdsDynamicEx) = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (False, False, False, False, False, False, False, False)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LibraryClassItem, BuildOption, Pcd = [], [], []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FindBlock:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FindLibraryClass:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LibraryClassItem.append(Line)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif FindBuildOption:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BuildOption.append(Line)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif FindPcdsFeatureFlag:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pcd.append((DataType.TAB_PCDS_FEATURE_FLAG_NULL, Line))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif FindPcdsPatchableInModule:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pcd.append((DataType.TAB_PCDS_PATCHABLE_IN_MODULE_NULL, Line))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif FindPcdsFixedAtBuild:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pcd.append((DataType.TAB_PCDS_FIXED_AT_BUILD_NULL, Line))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif FindPcdsDynamic:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pcd.append((DataType.TAB_PCDS_DYNAMIC_DEFAULT_NULL, Line))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif FindPcdsDynamicEx:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pcd.append((DataType.TAB_PCDS_DYNAMIC_EX_DEFAULT_NULL, Line))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync KeyValues.append([ListItem, [], [], []])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return True
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## GetExec
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Parse a string with format "InfFilename [EXEC = ExecFilename]"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Return (InfFilename, ExecFilename)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param String: String with EXEC statement
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GetExec(String):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InfFilename = ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ExecFilename = ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if String.find('EXEC') > -1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InfFilename = String[ : String.find('EXEC')].strip()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ExecFilename = String[String.find('EXEC') + len('EXEC') : ].strip()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InfFilename = String.strip()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (InfFilename, ExecFilename)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## GetComponents
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Parse block of the components defined in dsc file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Set KeyValues as [ ['component name', [lib1, lib2, lib3], [bo1, bo2, bo3],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# [pcd1, pcd2, pcd3]], ...]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Lines: The content to be parsed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Key: Reserved
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param KeyValues: To store data after parsing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param CommentCharacter: Comment char, used to ignore comment content
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @retval True Get component successfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GetComponents(Lines, KeyValues, CommentCharacter):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Lines.find(DataType.TAB_SECTION_END) > -1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Lines = Lines.split(DataType.TAB_SECTION_END, 1)[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (FindBlock, FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsPatchableInModule, FindPcdsFixedAtBuild, FindPcdsDynamic, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsDynamicEx) = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (False, False, False, False, False, False, False, False)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ListItem = None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LibraryClassItem = []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BuildOption = []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pcd = []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LineList = Lines.split('\n')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Line in LineList:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line = CleanString(Line, CommentCharacter)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line == None or Line == '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FindBlock == False:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ListItem = Line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # find '{' at line tail
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line.endswith('{'):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindBlock = True
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ListItem = CleanString(Line.rsplit('{', 1)[0], CommentCharacter)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Parse a block content
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FindBlock:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line.find('<LibraryClasses>') != -1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsDynamic, FindPcdsDynamicEx) = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (True, False, False, False, False, False, False)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line.find('<BuildOptions>') != -1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsDynamic, FindPcdsDynamicEx) = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (False, True, False, False, False, False, False)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line.find('<PcdsFeatureFlag>') != -1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsDynamic, FindPcdsDynamicEx) = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (False, False, True, False, False, False, False)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line.find('<PcdsPatchableInModule>') != -1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsDynamic, FindPcdsDynamicEx) = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (False, False, False, True, False, False, False)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line.find('<PcdsFixedAtBuild>') != -1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsDynamic, FindPcdsDynamicEx) = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (False, False, False, False, True, False, False)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line.find('<PcdsDynamic>') != -1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsDynamic, FindPcdsDynamicEx) = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (False, False, False, False, False, True, False)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line.find('<PcdsDynamicEx>') != -1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsDynamic, FindPcdsDynamicEx) = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (False, False, False, False, False, False, True)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Line.endswith('}'):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # find '}' at line tail
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync KeyValues.append([ListItem, LibraryClassItem, BuildOption, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pcd])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (FindBlock, FindLibraryClass, FindBuildOption, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsFeatureFlag, FindPcdsPatchableInModule, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindPcdsFixedAtBuild, FindPcdsDynamic, FindPcdsDynamicEx) = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (False, False, False, False, False, False, False, False)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LibraryClassItem, BuildOption, Pcd = [], [], []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FindBlock:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FindLibraryClass:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LibraryClassItem.append(Line)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif FindBuildOption:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BuildOption.append(Line)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif FindPcdsFeatureFlag:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pcd.append((DataType.TAB_PCDS_FEATURE_FLAG, Line))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif FindPcdsPatchableInModule:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pcd.append((DataType.TAB_PCDS_PATCHABLE_IN_MODULE, Line))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif FindPcdsFixedAtBuild:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pcd.append((DataType.TAB_PCDS_FIXED_AT_BUILD, Line))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif FindPcdsDynamic:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pcd.append((DataType.TAB_PCDS_DYNAMIC, Line))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif FindPcdsDynamicEx:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pcd.append((DataType.TAB_PCDS_DYNAMIC_EX, Line))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync KeyValues.append([ListItem, [], [], []])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return True
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## Get Source
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Get Source of Inf as <Filename>[|<Family>[|<TagName>[|<ToolCode>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# [|<PcdFeatureFlag>]]]]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Item: String as <Filename>[|<Family>[|<TagName>[|<ToolCode>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# [|<PcdFeatureFlag>]]]]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param ContainerFile: The file which describes the library class, used
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# for error report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GetSource(Item, ContainerFile, FileRelativePath, LineNo=-1):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ItemNew = Item + DataType.TAB_VALUE_SPLIT * 4
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync List = GetSplitValueList(ItemNew)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(List) < 5 or len(List) > 9:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RaiseParserError(Item, 'Sources', ContainerFile, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync '<Filename>[|<Family>[|<TagName>[|<ToolCode>\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync [|<PcdFeatureFlag>]]]]', LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync List[0] = NormPath(List[0])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckFileExist(FileRelativePath, List[0], ContainerFile, 'Sources', \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item, LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if List[4] != '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckPcdTokenInfo(List[4], 'Sources', ContainerFile, LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (List[0], List[1], List[2], List[3], List[4])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## Get Binary
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Get Binary of Inf as <Filename>[|<Family>[|<TagName>[|<ToolCode>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# [|<PcdFeatureFlag>]]]]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Item: String as <Filename>[|<Family>[|<TagName>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# [|<ToolCode>[|<PcdFeatureFlag>]]]]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param ContainerFile: The file which describes the library class,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# used for error report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GetBinary(Item, ContainerFile, LineNo=-1):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ItemNew = Item + DataType.TAB_VALUE_SPLIT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync List = GetSplitValueList(ItemNew)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(List) < 3 or len(List) > 5:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RaiseParserError(Item, 'Binaries', ContainerFile, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "<FileType>|<Filename>[|<Target>\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync [|<TokenSpaceGuidCName>.<PcdCName>]]", LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(List) >= 4:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if List[3] != '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckPcdTokenInfo(List[3], 'Binaries', ContainerFile, LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (List[0], List[1], List[2], List[3])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif len(List) == 3:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (List[0], List[1], List[2], '')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## Get Guids/Protocols/Ppis
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Get Guids/Protocols/Ppis of Inf as <GuidCName>[|<PcdFeatureFlag>]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Item: String as <GuidCName>[|<PcdFeatureFlag>]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Type: Type of parsing string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param ContainerFile: The file which describes the library class,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# used for error report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GetGuidsProtocolsPpisOfInf(Item):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ItemNew = Item + DataType.TAB_VALUE_SPLIT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync List = GetSplitValueList(ItemNew)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (List[0], List[1])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## Get Guids/Protocols/Ppis
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Get Guids/Protocols/Ppis of Dec as <GuidCName>=<GuidValue>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Item: String as <GuidCName>=<GuidValue>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Type: Type of parsing string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param ContainerFile: The file which describes the library class,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# used for error report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GetGuidsProtocolsPpisOfDec(Item, Type, ContainerFile, LineNo=-1):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync List = GetSplitValueList(Item, DataType.TAB_EQUAL_SPLIT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(List) != 2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RaiseParserError(Item, Type, ContainerFile, '<CName>=<GuidValue>', \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #convert C-Format Guid to Register Format
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if List[1][0] == '{' and List[1][-1] == '}':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RegisterFormatGuid = GuidStructureStringToGuidString(List[1])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if RegisterFormatGuid == '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RaiseParserError(Item, Type, ContainerFile, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 'CFormat or RegisterFormat', LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if CheckGuidRegFormat(List[1]):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RegisterFormatGuid = List[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RaiseParserError(Item, Type, ContainerFile, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 'CFormat or RegisterFormat', LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (List[0], RegisterFormatGuid)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## GetPackage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Get Package of Inf as <PackagePath>[|<PcdFeatureFlag>]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Item: String as <PackagePath>[|<PcdFeatureFlag>]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Type: Type of parsing string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param ContainerFile: The file which describes the library class,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# used for error report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GetPackage(Item, ContainerFile, FileRelativePath, LineNo=-1):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ItemNew = Item + DataType.TAB_VALUE_SPLIT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync List = GetSplitValueList(ItemNew)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckFileType(List[0], '.Dec', ContainerFile, 'package', List[0], LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckFileExist(FileRelativePath, List[0], ContainerFile, 'Packages', \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync List[0], LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if List[1] != '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckPcdTokenInfo(List[1], 'Packages', ContainerFile, LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (List[0], List[1])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## Get Pcd Values of Inf
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Get Pcd of Inf as <TokenSpaceGuidCName>.<PcdCName>[|<Value>]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Item: The string describes pcd
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Type: The type of Pcd
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param File: The file which describes the pcd, used for error report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GetPcdOfInf(Item, Type, File, LineNo):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Format = '<TokenSpaceGuidCName>.<PcdCName>[|<Value>]'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TokenGuid, TokenName, Value, InfType = '', '', '', ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Type == DataType.TAB_PCDS_FIXED_AT_BUILD:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InfType = DataType.TAB_INF_FIXED_PCD
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif Type == DataType.TAB_PCDS_PATCHABLE_IN_MODULE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InfType = DataType.TAB_INF_PATCH_PCD
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif Type == DataType.TAB_PCDS_FEATURE_FLAG:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InfType = DataType.TAB_INF_FEATURE_PCD
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif Type == DataType.TAB_PCDS_DYNAMIC_EX:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InfType = DataType.TAB_INF_PCD_EX
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif Type == DataType.TAB_PCDS_DYNAMIC:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InfType = DataType.TAB_INF_PCD
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync List = GetSplitValueList(Item, DataType.TAB_VALUE_SPLIT, 1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(TokenInfo) != 2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RaiseParserError(Item, InfType, File, Format, LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TokenGuid = TokenInfo[0]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TokenName = TokenInfo[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(List) > 1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = List[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TokenGuid, TokenName, Value, InfType)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## Get Pcd Values of Dec
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Get Pcd of Dec as <TokenSpcCName>.<TokenCName>|<Value>|<DatumType>|<Token>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Item: Pcd item
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Type: Pcd type
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param File: Dec file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param LineNo: Line number
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GetPcdOfDec(Item, Type, File, LineNo=-1):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Format = '<TokenSpaceGuidCName>.<PcdCName>|<Value>|<DatumType>|<Token>'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TokenGuid, TokenName, Value, DatumType, Token = '', '', '', '', ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync List = GetSplitValueList(Item)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(List) != 4:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RaiseParserError(Item, 'Pcds' + Type, File, Format, LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = List[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DatumType = List[2]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Token = List[3]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(TokenInfo) != 2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RaiseParserError(Item, 'Pcds' + Type, File, Format, LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TokenGuid = TokenInfo[0]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TokenName = TokenInfo[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TokenGuid, TokenName, Value, DatumType, Token, Type)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## Parse DEFINE statement
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Get DEFINE macros
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param LineValue: A DEFINE line value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param StartLine: A DEFINE start line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Table: A table
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param FileID: File ID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Filename: File name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param SectionName: DEFINE section name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param SectionModel: DEFINE section model
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Arch: DEFINE arch
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef ParseDefine(LineValue, StartLine, Table, FileID, SectionName, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SectionModel, Arch):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Logger.Debug(Logger.DEBUG_2, ST.MSG_DEFINE_STATEMENT_FOUND % (LineValue, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SectionName))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Define = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetSplitValueList(CleanString\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (LineValue[LineValue.upper().\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync find(DataType.TAB_DEFINE.upper() + ' ') + \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync len(DataType.TAB_DEFINE + ' ') : ]), \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataType.TAB_EQUAL_SPLIT, 1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Table.Insert(DataType.MODEL_META_DATA_DEFINE, Define[0], Define[1], '', \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync '', '', Arch, SectionModel, FileID, StartLine, -1, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartLine, -1, 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## InsertSectionItems
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Insert item data of a section to a dict
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Model: A model
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param CurrentSection: Current section
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param SectionItemList: Section item list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param ArchList: Arch list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param ThirdList: Third list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param RecordSet: Record set
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef InsertSectionItems(Model, SectionItemList, ArchList, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ThirdList, RecordSet):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Insert each item data of a section
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Index in range(0, len(ArchList)):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Arch = ArchList[Index]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Third = ThirdList[Index]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Arch == '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Arch = DataType.TAB_ARCH_COMMON
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Records = RecordSet[Model]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for SectionItem in SectionItemList:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LineValue, StartLine, Comment = SectionItem[0], \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SectionItem[1], SectionItem[2]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Logger.Debug(4, ST.MSG_PARSING %LineValue)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # And then parse DEFINE statement
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if LineValue.upper().find(DataType.TAB_DEFINE.upper() + ' ') > -1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # At last parse other sections
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IdNum = -1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Records.append([LineValue, Arch, StartLine, IdNum, Third, Comment])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if RecordSet != {}:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordSet[Model] = Records
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## GenMetaDatSectionItem
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Key: A key
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Value: A value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param List: A list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GenMetaDatSectionItem(Key, Value, List):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Key not in List:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync List[Key] = [Value]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync List[Key].append(Value)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## GetPkgInfoFromDec
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# get package name, guid, version info from dec files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Path: File path
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GetPkgInfoFromDec(Path):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PkgName = None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PkgGuid = None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PkgVersion = None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Path = Path.replace('\\', '/')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not os.path.exists(Path):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Logger.Error("\nUPT", FILE_NOT_FOUND, File = Path)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Path in gPKG_INFO_DICT:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return gPKG_INFO_DICT[Path]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync try:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DecParser = Dec(Path)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PkgName = DecParser.GetPackageName()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PkgGuid = DecParser.GetPackageGuid()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PkgVersion = DecParser.GetPackageVersion()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gPKG_INFO_DICT[Path] = (PkgName, PkgGuid, PkgVersion)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PkgName, PkgGuid, PkgVersion
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync except FatalError:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return None, None, None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## GetWorkspacePackage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Get a list of workspace package information.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GetWorkspacePackage():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DecFileList = []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WorkspaceDir = os.environ["WORKSPACE"]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Root, Dirs, Files in os.walk(WorkspaceDir):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if 'CVS' in Dirs:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dirs.remove('CVS')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if '.svn' in Dirs:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dirs.remove('.svn')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Dir in Dirs:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Dir.startswith('.'):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dirs.remove(Dir)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for FileSp in Files:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FileSp.startswith('.'):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ext = os.path.splitext(FileSp)[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Ext.lower() in ['.dec']:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DecFileList.append\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (os.path.normpath(os.path.join(Root, FileSp)))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # abstract package guid, version info from DecFile List
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PkgList = []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for DecFile in DecFileList:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (PkgName, PkgGuid, PkgVersion) = GetPkgInfoFromDec(DecFile)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if PkgName and PkgGuid and PkgVersion:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PkgList.append((PkgName, PkgGuid, PkgVersion, DecFile))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PkgList
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## GetWorkspaceModule
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Get a list of workspace modules.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GetWorkspaceModule():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InfFileList = []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WorkspaceDir = os.environ["WORKSPACE"]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Root, Dirs, Files in os.walk(WorkspaceDir):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if 'CVS' in Dirs:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dirs.remove('CVS')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if '.svn' in Dirs:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dirs.remove('.svn')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if 'Build' in Dirs:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dirs.remove('Build')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Dir in Dirs:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Dir.startswith('.'):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dirs.remove(Dir)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for FileSp in Files:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FileSp.startswith('.'):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ext = os.path.splitext(FileSp)[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Ext.lower() in ['.inf']:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InfFileList.append\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (os.path.normpath(os.path.join(Root, FileSp)))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InfFileList
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## MacroParser used to parse macro definition
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Line: The content contain linestring and line number
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param FileName: The meta-file file name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param SectionType: Section for the Line belong to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param FileLocalMacros: A list contain Macro defined in [Defines] section.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef MacroParser(Line, FileName, SectionType, FileLocalMacros):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MacroDefPattern = re.compile("^(DEFINE)[ \t]+")
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LineContent = Line[0]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LineNo = Line[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Match = MacroDefPattern.match(LineContent)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not Match:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Not 'DEFINE/EDK_GLOBAL' statement, call decorated method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return None, None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TokenList = GetSplitValueList(LineContent[Match.end(1):], \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataType.TAB_EQUAL_SPLIT, 1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Syntax check
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not TokenList[0]:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Logger.Error('Parser', FORMAT_INVALID, ST.ERR_MACRONAME_NOGIVEN,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ExtraData=LineContent, File=FileName, Line=LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(TokenList) < 2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Logger.Error('Parser', FORMAT_INVALID, ST.ERR_MACROVALUE_NOGIVEN,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ExtraData=LineContent, File=FileName, Line=LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Name, Value = TokenList
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # DEFINE defined macros
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if SectionType == DataType.MODEL_META_DATA_HEADER:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileLocalMacros[Name] = Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ReIsValidMacroName = re.compile(r"^[A-Z][A-Z0-9_]*$", re.DOTALL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ReIsValidMacroName.match(Name) == None:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Logger.Error('Parser',
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORMAT_INVALID,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ST.ERR_MACRONAME_INVALID%(Name),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ExtraData=LineContent,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File=FileName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line=LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Validate MACRO Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # <MacroDefinition> ::= [<Comments>]{0,}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # "DEFINE" <MACRO> "=" [{<PATH>} {<VALUE>}] <EOL>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # <Value> ::= {<NumVal>} {<Boolean>} {<AsciiString>} {<GUID>}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # {<CString>} {<UnicodeString>} {<CArray>}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # The definition of <NumVal>, <PATH>, <Boolean>, <GUID>, <CString>,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # <UnicodeString>, <CArray> are subset of <AsciiString>.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ReIsValidMacroValue = re.compile(r"^[\x20-\x7e]*$", re.DOTALL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ReIsValidMacroValue.match(Value) == None:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Logger.Error('Parser',
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORMAT_INVALID,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ST.ERR_MACROVALUE_INVALID%(Value),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ExtraData=LineContent,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File=FileName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line=LineNo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Name, Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## GenSection
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# generate section contents
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param SectionName: indicate the name of the section, details refer to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# INF, DEC specs
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param SectionDict: section statement dict, key is SectionAttrs(arch,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# moduletype or platform may exist as needed) list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# seperated by space,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# value is statement
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GenSection(SectionName, SectionDict, SplitArch=True):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Content = ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for SectionAttrs in SectionDict:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StatementList = SectionDict[SectionAttrs]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if SectionAttrs and SectionName != 'Defines' and SectionAttrs.strip().upper() != DataType.TAB_ARCH_COMMON:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if SplitArch:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ArchList = GetSplitValueList(SectionAttrs, DataType.TAB_SPACE_SPLIT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if SectionName != 'UserExtensions':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ArchList = GetSplitValueList(SectionAttrs, DataType.TAB_COMMENT_SPLIT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ArchList = [SectionAttrs]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Index in xrange(0, len(ArchList)):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ArchList[Index] = ConvertArchForInstall(ArchList[Index])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Section = '[' + SectionName + '.' + (', ' + SectionName + '.').join(ArchList) + ']'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Section = '[' + SectionName + ']'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Content += '\n\n' + Section + '\n'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if StatementList != None:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Statement in StatementList:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Content += Statement + '\n'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Content
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## ConvertArchForInstall
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# if Arch.upper() is in "IA32", "X64", "IPF", and "EBC", it must be upper case. "common" must be lower case.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Anything else, the case must be preserved
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Arch: the arch string that need to be converted, it should be stripped before pass in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @return: the arch string that get converted
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef ConvertArchForInstall(Arch):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Arch.upper() in [DataType.TAB_ARCH_IA32, DataType.TAB_ARCH_X64,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataType.TAB_ARCH_IPF, DataType.TAB_ARCH_EBC]:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Arch = Arch.upper()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif Arch.upper() == DataType.TAB_ARCH_COMMON:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Arch = Arch.lower()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Arch