#\r
# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>\r
# (C) Copyright 2015-2018 Hewlett Packard Enterprise Development LP<BR>\r
-# This program and the accompanying materials\r
-# are licensed and made available under the terms and conditions of the BSD License\r
-# which accompanies this distribution. The full text of the license may be found at\r
-# http://opensource.org/licenses/bsd-license.php\r
-#\r
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+# SPDX-License-Identifier: BSD-2-Clause-Patent\r
#\r
\r
##\r
self.MetaFile = FilePath\r
self._FileDir = self.MetaFile.Dir\r
self._Defines = {}\r
+ self._Packages = []\r
self._FileLocalMacros = {}\r
self._SectionsMacroDict = defaultdict(dict)\r
\r
self._Version = 0\r
self._GuidDict = {} # for Parser PCD value {GUID(gTokeSpaceGuidName)}\r
\r
+ self._PcdCodeValue = ""\r
+ self._PcdDataTypeCODE = False\r
+ self._CurrentPcdName = ""\r
+\r
## Store the parsed data in table\r
def _Store(self, *Args):\r
return self._Table.Insert(*Args)\r
S1 = ItemList[1].upper()\r
else:\r
S1 = TAB_ARCH_COMMON\r
+ S1 = ReplaceMacro(S1, self._Macros)\r
ArchList.add(S1)\r
\r
# S2 may be Platform or ModuleType\r
# If the section information is needed later, it should be stored in database\r
self._ValueList[0] = self._SectionName\r
\r
+ ## [packages] section parser\r
+ @ParseMacro\r
+ def _PackageParser(self):\r
+ self._CurrentLine = CleanString(self._CurrentLine)\r
+ self._Packages.append(self._CurrentLine)\r
+ self._ValueList[0] = self._CurrentLine\r
+\r
## [defines] section parser\r
@ParseMacro\r
def _DefineParser(self):\r
ScopeKey = tuple(ScopeKey)\r
#\r
# DecParser SectionType is a list, will contain more than one item only in Pcd Section\r
- # As Pcd section macro usage is not alllowed, so here it is safe\r
+ # As Pcd section macro usage is not allowed, so here it is safe\r
#\r
if isinstance(self, DecParser):\r
SectionDictKey = self._SectionType[0], ScopeKey\r
\r
return Macros\r
\r
+ def ProcessMultipleLineCODEValue(self,Content):\r
+ CODEBegin = False\r
+ CODELine = ""\r
+ continuelinecount = 0\r
+ newContent = []\r
+ for Index in range(0, len(Content)):\r
+ Line = Content[Index]\r
+ if CODEBegin:\r
+ CODELine = CODELine + Line\r
+ continuelinecount +=1\r
+ if ")}" in Line:\r
+ newContent.append(CODELine)\r
+ for _ in range(continuelinecount):\r
+ newContent.append("")\r
+ CODEBegin = False\r
+ CODELine = ""\r
+ continuelinecount = 0\r
+ else:\r
+ if not Line:\r
+ newContent.append(Line)\r
+ continue\r
+ if "{CODE(" not in Line:\r
+ newContent.append(Line)\r
+ continue\r
+ elif CODEPattern.findall(Line):\r
+ newContent.append(Line)\r
+ continue\r
+ else:\r
+ CODEBegin = True\r
+ CODELine = Line\r
+\r
+ return newContent\r
+\r
_SectionParser = {}\r
\r
## INF file parser class\r
NmakeLine = ''\r
Content = ''\r
try:\r
- Content = open(str(self.MetaFile), 'r').readlines()\r
+ with open(str(self.MetaFile), 'r') as File:\r
+ Content = File.readlines()\r
except:\r
EdkLogger.error("Parser", FILE_READ_FAILURE, ExtraData=self.MetaFile)\r
\r
Value = self._ValueList[Index]\r
if not Value:\r
continue\r
-\r
- if Value.upper().find('$(EFI_SOURCE)\Edk'.upper()) > -1 or Value.upper().find('$(EFI_SOURCE)/Edk'.upper()) > -1:\r
- Value = '$(EDK_SOURCE)' + Value[17:]\r
- if Value.find('$(EFI_SOURCE)') > -1 or Value.find('$(EDK_SOURCE)') > -1:\r
- pass\r
- elif Value.startswith('.'):\r
- pass\r
- elif Value.startswith('$('):\r
- pass\r
- else:\r
- Value = '$(EFI_SOURCE)/' + Value\r
-\r
self._ValueList[Index] = ReplaceMacro(Value, Macros)\r
\r
## Parse [Sources] section\r
@ParseMacro\r
def _SourceFileParser(self):\r
TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT)\r
+ # Let TokenList[2] be TagName|ToolCode|FeatureFlag\r
+ if len(TokenList) > 3:\r
+ for extraToken in range(3, len(TokenList)):\r
+ TokenList[2] = TokenList[2] + '|' + TokenList[extraToken]\r
self._ValueList[0:len(TokenList)] = TokenList\r
Macros = self._Macros\r
# For Acpi tables, remove macro like ' TABLE_NAME=Sata1'\r
if self._ValueList[2] != '':\r
InfPcdValueList = GetSplitValueList(TokenList[1], TAB_VALUE_SPLIT, 1)\r
if InfPcdValueList[0] in ['True', 'true', 'TRUE']:\r
- self._ValueList[2] = TokenList[1].replace(InfPcdValueList[0], '1', 1);\r
+ self._ValueList[2] = TokenList[1].replace(InfPcdValueList[0], '1', 1)\r
elif InfPcdValueList[0] in ['False', 'false', 'FALSE']:\r
- self._ValueList[2] = TokenList[1].replace(InfPcdValueList[0], '0', 1);\r
+ self._ValueList[2] = TokenList[1].replace(InfPcdValueList[0], '0', 1)\r
+ elif isinstance(InfPcdValueList[0], str) and InfPcdValueList[0].find('$(') >= 0:\r
+ Value = ReplaceExprMacro(InfPcdValueList[0],self._Macros)\r
+ if Value != '0':\r
+ self._ValueList[2] = Value\r
if (self._ValueList[0], self._ValueList[1]) not in self.PcdsDict:\r
self.PcdsDict[self._ValueList[0], self._ValueList[1]] = self._SectionType\r
elif self.PcdsDict[self._ValueList[0], self._ValueList[1]] != self._SectionType:\r
TAB_LIBRARIES.upper() : MODEL_EFI_LIBRARY_INSTANCE,\r
TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_CLASS,\r
TAB_BUILD_OPTIONS.upper() : MODEL_META_DATA_BUILD_OPTION,\r
+ TAB_PACKAGES.upper() : MODEL_META_DATA_PACKAGE,\r
TAB_PCDS_FIXED_AT_BUILD_NULL.upper() : MODEL_PCD_FIXED_AT_BUILD,\r
TAB_PCDS_PATCHABLE_IN_MODULE_NULL.upper() : MODEL_PCD_PATCHABLE_IN_MODULE,\r
TAB_PCDS_FEATURE_FLAG_NULL.upper() : MODEL_PCD_FEATURE_FLAG,\r
TAB_PCDS_DYNAMIC_EX_HII_NULL.upper() : MODEL_PCD_DYNAMIC_EX_HII,\r
TAB_PCDS_DYNAMIC_EX_VPD_NULL.upper() : MODEL_PCD_DYNAMIC_EX_VPD,\r
TAB_COMPONENTS.upper() : MODEL_META_DATA_COMPONENT,\r
- TAB_COMPONENTS_SOURCE_OVERRIDE_PATH.upper() : MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH,\r
TAB_DSC_DEFINES.upper() : MODEL_META_DATA_HEADER,\r
TAB_DSC_DEFINES_DEFINE : MODEL_META_DATA_DEFINE,\r
TAB_DSC_DEFINES_EDKGLOBAL : MODEL_META_DATA_GLOBAL_DEFINE,\r
#\r
self._IdMapping = {-1:-1}\r
\r
- self._PcdCodeValue = ""\r
- self._PcdDataTypeCODE = False\r
- self._CurrentPcdName = ""\r
self._Content = None\r
\r
## Parser starter\r
def Start(self):\r
Content = ''\r
try:\r
- Content = open(str(self.MetaFile), 'r').readlines()\r
+ with open(str(self.MetaFile), 'r') as File:\r
+ Content = File.readlines()\r
except:\r
EdkLogger.error("Parser", FILE_READ_FAILURE, ExtraData=self.MetaFile)\r
\r
def _LibraryInstanceParser(self):\r
self._ValueList[0] = self._CurrentLine\r
\r
- def ProcessMultipleLineCODEValue(self,Content):\r
- CODEBegin = False\r
- CODELine = ""\r
- continuelinecount = 0\r
- newContent = []\r
- for Index in range(0, len(Content)):\r
- Line = Content[Index]\r
- if CODEBegin:\r
- CODELine = CODELine + Line\r
- continuelinecount +=1\r
- if ")}" in Line:\r
- newContent.append(CODELine)\r
- for _ in range(continuelinecount):\r
- newContent.append("")\r
- CODEBegin = False\r
- CODELine = ""\r
- continuelinecount = 0\r
- else:\r
- if not Line:\r
- newContent.append(Line)\r
- continue\r
- if "{CODE(" not in Line:\r
- newContent.append(Line)\r
- continue\r
- elif CODEPattern.findall(Line):\r
- newContent.append(Line)\r
- continue\r
- else:\r
- CODEBegin = True\r
- CODELine = Line\r
-\r
- return newContent\r
\r
def _DecodeCODEData(self):\r
pass\r
\r
self._ValueList[0:len(TokenList)] = TokenList\r
\r
- def _CompponentSourceOverridePathParser(self):\r
- self._ValueList[0] = self._CurrentLine\r
\r
## [BuildOptions] section parser\r
@ParseMacro\r
MODEL_META_DATA_DEFINE : self.__ProcessDefine,\r
MODEL_META_DATA_GLOBAL_DEFINE : self.__ProcessDefine,\r
MODEL_META_DATA_INCLUDE : self.__ProcessDirective,\r
+ MODEL_META_DATA_PACKAGE : self.__ProcessPackages,\r
MODEL_META_DATA_CONDITIONAL_STATEMENT_IF : self.__ProcessDirective,\r
MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE : self.__ProcessDirective,\r
MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF : self.__ProcessDirective,\r
MODEL_PCD_DYNAMIC_EX_HII : self.__ProcessPcd,\r
MODEL_PCD_DYNAMIC_EX_VPD : self.__ProcessPcd,\r
MODEL_META_DATA_COMPONENT : self.__ProcessComponent,\r
- MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH : self.__ProcessSourceOverridePath,\r
MODEL_META_DATA_BUILD_OPTION : self.__ProcessBuildOption,\r
MODEL_UNKNOWN : self._Skip,\r
MODEL_META_DATA_USER_EXTENSION : self._SkipUserExtension,\r
self._SubsectionType = MODEL_UNKNOWN\r
\r
def __RetrievePcdValue(self):\r
- Content = open(str(self.MetaFile), 'r').readlines()\r
+ try:\r
+ with open(str(self.MetaFile), 'r') as File:\r
+ Content = File.readlines()\r
+ except:\r
+ EdkLogger.error("Parser", FILE_READ_FAILURE, ExtraData=self.MetaFile)\r
+\r
GlobalData.gPlatformOtherPcds['DSCFILE'] = str(self.MetaFile)\r
for PcdType in (MODEL_PCD_PATCHABLE_IN_MODULE, MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_HII,\r
MODEL_PCD_DYNAMIC_VPD, MODEL_PCD_DYNAMIC_EX_DEFAULT, MODEL_PCD_DYNAMIC_EX_HII,\r
# Allow using system environment variables in path after !include\r
#\r
__IncludeMacros['WORKSPACE'] = GlobalData.gGlobalDefines['WORKSPACE']\r
- if "ECP_SOURCE" in GlobalData.gGlobalDefines:\r
- __IncludeMacros['ECP_SOURCE'] = GlobalData.gGlobalDefines['ECP_SOURCE']\r
- #\r
- # During GenFds phase call DSC parser, will go into this branch.\r
- #\r
- elif "ECP_SOURCE" in GlobalData.gCommandLineDefines:\r
- __IncludeMacros['ECP_SOURCE'] = GlobalData.gCommandLineDefines['ECP_SOURCE']\r
-\r
- __IncludeMacros['EFI_SOURCE'] = GlobalData.gGlobalDefines['EFI_SOURCE']\r
- __IncludeMacros['EDK_SOURCE'] = GlobalData.gGlobalDefines['EDK_SOURCE']\r
#\r
# Allow using MACROs comes from [Defines] section to keep compatible.\r
#\r
# First search the include file under the same directory as DSC file\r
#\r
IncludedFile1 = PathClass(IncludedFile, self.MetaFile.Dir)\r
- ErrorCode, ErrorInfo1 = IncludedFile1.Validate()\r
- if ErrorCode != 0:\r
- #\r
- # Also search file under the WORKSPACE directory\r
- #\r
- IncludedFile1 = PathClass(IncludedFile, GlobalData.gWorkspace)\r
- ErrorCode, ErrorInfo2 = IncludedFile1.Validate()\r
+ if self._Enabled:\r
+ ErrorCode, ErrorInfo1 = IncludedFile1.Validate()\r
if ErrorCode != 0:\r
- EdkLogger.error('parser', ErrorCode, File=self._FileWithError,\r
- Line=self._LineIndex + 1, ExtraData=ErrorInfo1 + "\n" + ErrorInfo2)\r
-\r
- self._FileWithError = IncludedFile1\r
+ #\r
+ # Also search file under the WORKSPACE directory\r
+ #\r
+ IncludedFile1 = PathClass(IncludedFile, GlobalData.gWorkspace)\r
+ ErrorCode, ErrorInfo2 = IncludedFile1.Validate()\r
+ if ErrorCode != 0:\r
+ EdkLogger.error('parser', ErrorCode, File=self._FileWithError,\r
+ Line=self._LineIndex + 1, ExtraData=ErrorInfo1 + "\n" + ErrorInfo2)\r
+\r
+ self._FileWithError = IncludedFile1\r
+\r
+ FromItem = self._Content[self._ContentIndex - 1][0]\r
+ if self._InSubsection:\r
+ Owner = self._Content[self._ContentIndex - 1][8]\r
+ else:\r
+ Owner = self._Content[self._ContentIndex - 1][0]\r
+ IncludedFileTable = MetaFileStorage(self._RawTable.DB, IncludedFile1, MODEL_FILE_DSC, False, FromItem=FromItem)\r
+ Parser = DscParser(IncludedFile1, self._FileType, self._Arch, IncludedFileTable,\r
+ Owner=Owner, From=FromItem)\r
+\r
+ self.IncludedFiles.add (IncludedFile1)\r
+\r
+ # set the parser status with current status\r
+ Parser._SectionName = self._SectionName\r
+ Parser._SubsectionType = self._SubsectionType\r
+ Parser._InSubsection = self._InSubsection\r
+ Parser._SectionType = self._SectionType\r
+ Parser._Scope = self._Scope\r
+ Parser._Enabled = self._Enabled\r
+ # Parse the included file\r
+ Parser.StartParse()\r
+ # Insert all records in the table for the included file into dsc file table\r
+ Records = IncludedFileTable.GetAll()\r
+ if Records:\r
+ self._Content[self._ContentIndex:self._ContentIndex] = Records\r
+ self._Content.pop(self._ContentIndex - 1)\r
+ self._ValueList = None\r
+ self._ContentIndex -= 1\r
\r
- FromItem = self._Content[self._ContentIndex - 1][0]\r
- if self._InSubsection:\r
- Owner = self._Content[self._ContentIndex - 1][8]\r
- else:\r
- Owner = self._Content[self._ContentIndex - 1][0]\r
- IncludedFileTable = MetaFileStorage(self._RawTable.DB, IncludedFile1, MODEL_FILE_DSC, False, FromItem=FromItem)\r
- Parser = DscParser(IncludedFile1, self._FileType, self._Arch, IncludedFileTable,\r
- Owner=Owner, From=FromItem)\r
-\r
- self.IncludedFiles.add (IncludedFile1)\r
-\r
- # set the parser status with current status\r
- Parser._SectionName = self._SectionName\r
- Parser._SubsectionType = self._SubsectionType\r
- Parser._InSubsection = self._InSubsection\r
- Parser._SectionType = self._SectionType\r
- Parser._Scope = self._Scope\r
- Parser._Enabled = self._Enabled\r
- # Parse the included file\r
- Parser.StartParse()\r
- # Insert all records in the table for the included file into dsc file table\r
- Records = IncludedFileTable.GetAll()\r
- if Records:\r
- self._Content[self._ContentIndex:self._ContentIndex] = Records\r
- self._Content.pop(self._ContentIndex - 1)\r
- self._ValueList = None\r
- self._ContentIndex -= 1\r
+ def __ProcessPackages(self):\r
+ self._ValueList[0] = ReplaceMacro(self._ValueList[0], self._Macros)\r
\r
def __ProcessSkuId(self):\r
self._ValueList = [ReplaceMacro(Value, self._Macros, RaiseError=True)\r
def __ProcessComponent(self):\r
self._ValueList[0] = ReplaceMacro(self._ValueList[0], self._Macros)\r
\r
- def __ProcessSourceOverridePath(self):\r
- self._ValueList[0] = ReplaceMacro(self._ValueList[0], self._Macros)\r
-\r
def __ProcessBuildOption(self):\r
self._ValueList = [ReplaceMacro(Value, self._Macros, RaiseError=False)\r
for Value in self._ValueList]\r
\r
+ def DisableOverrideComponent(self,module_id):\r
+ for ori_id in self._IdMapping:\r
+ if self._IdMapping[ori_id] == module_id:\r
+ self._RawTable.DisableComponent(ori_id)\r
+\r
_SectionParser = {\r
MODEL_META_DATA_HEADER : _DefineParser,\r
MODEL_EFI_SKU_ID : _SkuIdParser,\r
MODEL_PCD_DYNAMIC_EX_HII : _PcdParser,\r
MODEL_PCD_DYNAMIC_EX_VPD : _PcdParser,\r
MODEL_META_DATA_COMPONENT : _ComponentParser,\r
- MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH : _CompponentSourceOverridePathParser,\r
MODEL_META_DATA_BUILD_OPTION : _BuildOptionParser,\r
MODEL_UNKNOWN : MetaFileParser._Skip,\r
+ MODEL_META_DATA_PACKAGE : MetaFileParser._PackageParser,\r
MODEL_META_DATA_USER_EXTENSION : MetaFileParser._SkipUserExtension,\r
MODEL_META_DATA_SECTION_HEADER : MetaFileParser._SectionHeaderParser,\r
MODEL_META_DATA_SUBSECTION_HEADER : _SubsectionHeaderParser,\r
self._include_flag = False\r
self._package_flag = False\r
\r
+ self._RestofValue = ""\r
+\r
## Parser starter\r
def Start(self):\r
Content = ''\r
try:\r
- Content = open(str(self.MetaFile), 'r').readlines()\r
+ with open(str(self.MetaFile), 'r') as File:\r
+ Content = File.readlines()\r
except:\r
EdkLogger.error("Parser", FILE_READ_FAILURE, ExtraData=self.MetaFile)\r
\r
+ Content = self.ProcessMultipleLineCODEValue(Content)\r
+\r
self._DefinesCount = 0\r
for Index in range(0, len(Content)):\r
Line, Comment = CleanString2(Content[Index])\r
#\r
@ParseMacro\r
def _PcdParser(self):\r
+\r
if self._CurrentStructurePcdName:\r
self._ValueList[0] = self._CurrentStructurePcdName\r
\r
return\r
\r
if self._include_flag:\r
- self._ValueList[1] = "<HeaderFiles>_" + md5(self._CurrentLine).hexdigest()\r
+ self._ValueList[1] = "<HeaderFiles>_" + md5(self._CurrentLine.encode('utf-8')).hexdigest()\r
self._ValueList[2] = self._CurrentLine\r
if self._package_flag and "}" != self._CurrentLine:\r
- self._ValueList[1] = "<Packages>_" + md5(self._CurrentLine).hexdigest()\r
+ self._ValueList[1] = "<Packages>_" + md5(self._CurrentLine.encode('utf-8')).hexdigest()\r
self._ValueList[2] = self._CurrentLine\r
if self._CurrentLine == "}":\r
self._package_flag = False\r
self._ValueList[1] = TAB_SPLIT.join(PcdNames[2:])\r
self._ValueList[2] = PcdTockens[1]\r
if not self._CurrentStructurePcdName:\r
+ if self._PcdDataTypeCODE:\r
+ if ")}" in self._CurrentLine:\r
+ ValuePart,RestofValue = self._CurrentLine.split(")}")\r
+ self._PcdCodeValue = self._PcdCodeValue + "\n " + ValuePart\r
+ self._CurrentLine = "|".join((self._CurrentPcdName, self._PcdCodeValue,RestofValue))\r
+ self._PcdDataTypeCODE = False\r
+ self._PcdCodeValue = ""\r
+ else:\r
+ self._PcdCodeValue = self._PcdCodeValue + "\n " + self._CurrentLine\r
+ self._ValueList = None\r
+ return\r
TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1)\r
+ self._CurrentPcdName = TokenList[0]\r
+ if len(TokenList) == 2 and TokenList[1].strip().startswith("{CODE"):\r
+ if ")}" in self._CurrentLine:\r
+ self._PcdDataTypeCODE = False\r
+ self._PcdCodeValue = ""\r
+ else:\r
+ self._PcdDataTypeCODE = True\r
+ self._PcdCodeValue = TokenList[1].strip()\r
+ self._ValueList = None\r
+ return\r
+\r
self._ValueList[0:1] = GetSplitValueList(TokenList[0], TAB_SPLIT)\r
ValueRe = re.compile(r'^[a-zA-Z_][a-zA-Z0-9_]*')\r
# check PCD information\r