## @file\r
# This file is used to parse meta files\r
#\r
-# Copyright (c) 2008 - 2017, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>\r
# (C) Copyright 2015-2016 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
from CommonDataClass.DataClass import *\r
from Common.DataType import *\r
from Common.String import *\r
-from Common.Misc import GuidStructureStringToGuidString, CheckPcdDatum, PathClass, AnalyzePcdData, AnalyzeDscPcd, AnalyzePcdExpression\r
+from Common.Misc import GuidStructureStringToGuidString, CheckPcdDatum, PathClass, AnalyzePcdData, AnalyzeDscPcd, AnalyzePcdExpression, ParseFieldValue\r
from Common.Expression import *\r
from CommonDataClass.Exceptions import *\r
from Common.LongFilePathSupport import OpenLongFilePath as open\r
self._PostProcessed = False\r
# Different version of meta-file has different way to parse.\r
self._Version = 0\r
+ self._GuidDict = {} # for Parser PCD value {GUID(gTokeSpaceGuidName)}\r
\r
## Store the parsed data in table\r
def _Store(self, *Args):\r
def _SkuIdParser(self):\r
TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT)\r
if len(TokenList) not in (2,3):\r
- EdkLogger.error('Parser', FORMAT_INVALID, "Correct format is '<Integer>|<UiName>[|<UiName>]'",\r
+ EdkLogger.error('Parser', FORMAT_INVALID, "Correct format is '<Number>|<UiName>[|<UiName>]'",\r
ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1)\r
self._ValueList[0:len(TokenList)] = TokenList\r
@ParseMacro\r
def _DefaultStoresParser(self):\r
TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT)\r
if len(TokenList) != 2:\r
- EdkLogger.error('Parser', FORMAT_INVALID, "Correct format is '<Integer>|<UiName>'",\r
+ EdkLogger.error('Parser', FORMAT_INVALID, "Correct format is '<Number>|<UiName>'",\r
ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1)\r
self._ValueList[0:len(TokenList)] = TokenList\r
\r
self._ValueList[0], self._ValueList[1] = PcdNameTockens[0], PcdNameTockens[1]\r
elif len(PcdNameTockens) == 3:\r
self._ValueList[0], self._ValueList[1] = ".".join((PcdNameTockens[0], PcdNameTockens[1])), PcdNameTockens[2]\r
+ elif len(PcdNameTockens) > 3:\r
+ self._ValueList[0], self._ValueList[1] = ".".join((PcdNameTockens[0], PcdNameTockens[1])), ".".join(PcdNameTockens[2:])\r
if len(TokenList) == 2:\r
self._ValueList[2] = TokenList[1]\r
if self._ValueList[0] == '' or self._ValueList[1] == '':\r
File=self.MetaFile, Line=self._LineIndex + 1)\r
if self._ValueList[2] == '':\r
#\r
- # The PCD values are optional for FIXEDATBUILD and PATCHABLEINMODULE\r
+ # The PCD values are optional for FIXEDATBUILD, PATCHABLEINMODULE, Dynamic/DynamicEx default\r
#\r
- if self._SectionType in (MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE):\r
+ if self._SectionType in (MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE, MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_EX_DEFAULT):\r
return\r
EdkLogger.error('Parser', FORMAT_INVALID, "No PCD value given",\r
ExtraData=self._CurrentLine + " (<TokenSpaceGuidCName>.<TokenCName>|<PcdValue>)",\r
# PCD cannot be referenced in macro definition\r
if self._ItemType not in [MODEL_META_DATA_DEFINE, MODEL_META_DATA_GLOBAL_DEFINE]:\r
Macros.update(self._Symbols)\r
+ if GlobalData.BuildOptionPcd:\r
+ for Item in GlobalData.BuildOptionPcd:\r
+ if type(Item) is tuple:\r
+ continue\r
+ PcdName, TmpValue = Item.split("=")\r
+ TmpValue = BuildOptionValue(TmpValue, self._GuidDict)\r
+ Macros[PcdName.strip()] = TmpValue\r
return Macros\r
\r
def _PostProcess(self):\r
ValList[Index] = ValueExpression(PcdValue, self._Macros)(True)\r
except WrnExpression, Value:\r
ValList[Index] = Value.result\r
+ except:\r
+ pass\r
\r
if ValList[Index] == 'True':\r
ValList[Index] = '1'\r
File=self.MetaFile, Line=self._LineIndex + 1)\r
self._ValueList[0] = TokenList[0]\r
self._ValueList[1] = TokenList[1]\r
+ if self._ValueList[0] not in self._GuidDict:\r
+ self._GuidDict[self._ValueList[0]] = self._ValueList[1]\r
\r
## PCD sections parser\r
#\r
if "|" not in self._CurrentLine:\r
if "<HeaderFiles>" == self._CurrentLine:\r
self._include_flag = True\r
+ self._package_flag = False\r
self._ValueList = None\r
return\r
if "<Packages>" == self._CurrentLine:\r
self._package_flag = True\r
self._ValueList = None\r
+ self._include_flag = False\r
return\r
\r
if self._include_flag:\r
self._ValueList[1] = "<HeaderFiles>_" + md5.new(self._CurrentLine).hexdigest()\r
self._ValueList[2] = self._CurrentLine\r
- self._include_flag = False\r
if self._package_flag and "}" != self._CurrentLine:\r
self._ValueList[1] = "<Packages>_" + md5.new(self._CurrentLine).hexdigest()\r
self._ValueList[2] = self._CurrentLine\r
if self._CurrentLine == "}":\r
self._package_flag = False\r
+ self._include_flag = False\r
self._ValueList = None\r
return\r
else:\r
if len(PcdNames) == 2:\r
self._CurrentStructurePcdName = ""\r
else:\r
- self._ValueList[1] = PcdNames[2]\r
+ if self._CurrentStructurePcdName != TAB_SPLIT.join(PcdNames[:2]):\r
+ EdkLogger.error('Parser', FORMAT_INVALID, "Pcd Name does not match: %s and %s " % (self._CurrentStructurePcdName , TAB_SPLIT.join(PcdNames[:2])),\r
+ File=self.MetaFile, Line=self._LineIndex + 1)\r
+ self._ValueList[1] = TAB_SPLIT.join(PcdNames[2:])\r
self._ValueList[2] = PcdTockens[1]\r
if not self._CurrentStructurePcdName:\r
TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1)\r
PcdValue = ValueList[0]\r
if PcdValue:\r
try:\r
- ValueList[0] = ValueExpression(PcdValue, self._AllPcdDict)(True)\r
- except WrnExpression, Value:\r
- ValueList[0] = Value.result\r
-\r
- if ValueList[0] == 'True':\r
- ValueList[0] = '1'\r
- if ValueList[0] == 'False':\r
- ValueList[0] = '0'\r
-\r
+ self._GuidDict.update(self._AllPcdDict)\r
+ ValueList[0] = ValueExpressionEx(ValueList[0], ValueList[1], self._GuidDict)(True)\r
+ except BadExpression, Value:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, Value, ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1)\r
# check format of default value against the datum type\r
IsValid, Cause = CheckPcdDatum(ValueList[1], ValueList[0])\r
if not IsValid:\r