import re\r
import time\r
import copy\r
+import md5\r
\r
import Common.EdkLogger as EdkLogger\r
import Common.GlobalData as GlobalData\r
\r
SymbolPattern = ValueExpression.SymbolPattern\r
\r
+ IncludedFiles = set()\r
+\r
## Constructor of DscParser\r
#\r
# Initialize object of DscParser\r
def _PcdParser(self):\r
TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1)\r
self._ValueList[0:1] = GetSplitValueList(TokenList[0], TAB_SPLIT)\r
+ PcdNameTockens = GetSplitValueList(TokenList[0], TAB_SPLIT)\r
+ if len(PcdNameTockens) == 2:\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
if len(TokenList) == 2:\r
self._ValueList[2] = TokenList[1]\r
if self._ValueList[0] == '' or self._ValueList[1] == '':\r
\r
# Validate the datum type of Dynamic Defaul PCD and DynamicEx Default PCD\r
ValueList = GetSplitValueList(self._ValueList[2])\r
- if len(ValueList) > 1 and ValueList[1] != TAB_VOID \\r
+ if len(ValueList) > 1 and ValueList[1] in [TAB_UINT8 , TAB_UINT16, TAB_UINT32 , TAB_UINT64] \\r
and self._ItemType in [MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_EX_DEFAULT]:\r
EdkLogger.error('Parser', FORMAT_INVALID, "The datum type '%s' of PCD is wrong" % ValueList[1],\r
ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1)\r
\r
+ # Validate the VariableName of DynamicHii and DynamicExHii for PCD Entry must not be an empty string\r
+ if self._ItemType in [MODEL_PCD_DYNAMIC_HII, MODEL_PCD_DYNAMIC_EX_HII]:\r
+ DscPcdValueList = GetSplitValueList(TokenList[1], TAB_VALUE_SPLIT, 1)\r
+ if len(DscPcdValueList[0].replace('L','').replace('"','').strip()) == 0:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, "The VariableName field in the HII format PCD entry must not be an empty string",\r
+ ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1)\r
+\r
# if value are 'True', 'true', 'TRUE' or 'False', 'false', 'FALSE', replace with integer 1 or 0.\r
DscPcdValueList = GetSplitValueList(TokenList[1], TAB_VALUE_SPLIT, 1)\r
if DscPcdValueList[0] in ['True', 'true', 'TRUE']:\r
Parser = DscParser(IncludedFile1, self._FileType, self._Arch, IncludedFileTable,\r
Owner=Owner, From=Owner)\r
\r
+ self.IncludedFiles.add (IncludedFile1)\r
+\r
# Does not allow lower level included file to include upper level included file\r
if Parser._From != Owner and int(Owner) > int (Parser._From):\r
EdkLogger.error('parser', FILE_ALREADY_EXIST, File=self._FileWithError,\r
EdkLogger.error('build', FORMAT_INVALID, "Pcd format incorrect.", File=self._FileWithError, Line=self._LineIndex + 1,\r
ExtraData="%s.%s|%s" % (self._ValueList[0], self._ValueList[1], self._ValueList[2]))\r
PcdValue = ValList[Index]\r
- if PcdValue:\r
+ if PcdValue and "." not in self._ValueList[0]:\r
try:\r
ValList[Index] = ValueExpression(PcdValue, self._Macros)(True)\r
except WrnExpression, Value:\r
if (not self._DirectiveEvalStack) or (False not in self._DirectiveEvalStack):\r
GlobalData.gPlatformPcds[TAB_SPLIT.join(self._ValueList[0:2])] = PcdValue\r
self._Symbols[TAB_SPLIT.join(self._ValueList[0:2])] = PcdValue\r
- self._ValueList[2] = '|'.join(ValList)\r
+ try:\r
+ self._ValueList[2] = '|'.join(ValList)\r
+ except Exception:\r
+ print ValList\r
\r
def __ProcessComponent(self):\r
self._ValueList[0] = ReplaceMacro(self._ValueList[0], self._Macros)\r
self._AllPCDs = [] # Only for check duplicate PCD\r
self._AllPcdDict = {}\r
\r
+ self._CurrentStructurePcdName = ""\r
+ self._include_flag = False\r
+ self._package_flag = False\r
+\r
## Parser starter\r
def Start(self):\r
Content = ''\r
except:\r
EdkLogger.error("Parser", FILE_READ_FAILURE, ExtraData=self.MetaFile)\r
\r
+ self._DefinesCount = 0\r
for Index in range(0, len(Content)):\r
Line, Comment = CleanString2(Content[Index])\r
self._CurrentLine = Line\r
# section header\r
if Line[0] == TAB_SECTION_START and Line[-1] == TAB_SECTION_END:\r
self._SectionHeaderParser()\r
+ if self._SectionName == TAB_DEC_DEFINES.upper():\r
+ self._DefinesCount += 1\r
self._Comments = []\r
continue\r
+ if self._SectionType == MODEL_UNKNOWN:\r
+ EdkLogger.error("Parser", FORMAT_INVALID,\r
+ ""\r
+ "Not able to determine \"%s\" in which section."%self._CurrentLine,\r
+ self.MetaFile, self._LineIndex + 1)\r
elif len(self._SectionType) == 0:\r
self._Comments = []\r
continue\r
0\r
)\r
self._Comments = []\r
+ if self._DefinesCount > 1:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, 'Multiple [Defines] section is exist.', self.MetaFile )\r
+ if self._DefinesCount == 0:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, 'No [Defines] section exist.',self.MetaFile)\r
self._Done()\r
\r
\r
self._SectionType = []\r
ArchList = set()\r
PrivateList = set()\r
- Line = self._CurrentLine.replace("%s%s" % (TAB_COMMA_SPLIT, TAB_SPACE_SPLIT), TAB_COMMA_SPLIT)\r
+ Line = re.sub(',[\s]*', TAB_COMMA_SPLIT, self._CurrentLine)\r
for Item in Line[1:-1].split(TAB_COMMA_SPLIT):\r
if Item == '':\r
EdkLogger.error("Parser", FORMAT_UNKNOWN_ERROR,\r
\r
# different types of PCD are permissible in one section\r
self._SectionName = ItemList[0].upper()\r
+ if self._SectionName == TAB_DEC_DEFINES.upper() and (len(ItemList) > 1 or len(Line.split(TAB_COMMA_SPLIT)) > 1):\r
+ EdkLogger.error("Parser", FORMAT_INVALID, "Defines section format is invalid",\r
+ self.MetaFile, self._LineIndex + 1, self._CurrentLine)\r
if self._SectionName in self.DataType:\r
if self.DataType[self._SectionName] not in self._SectionType:\r
self._SectionType.append(self.DataType[self._SectionName])\r
#\r
@ParseMacro\r
def _PcdParser(self):\r
- TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1)\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
- if self._ValueList[0] == '' or self._ValueList[1] == '':\r
- EdkLogger.error('Parser', FORMAT_INVALID, "No token space GUID or PCD name specified",\r
- ExtraData=self._CurrentLine + \\r
- " (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|<Token>)",\r
- File=self.MetaFile, Line=self._LineIndex + 1)\r
- # check format of token space GUID CName\r
- if not ValueRe.match(self._ValueList[0]):\r
- EdkLogger.error('Parser', FORMAT_INVALID, "The format of the token space GUID CName is invalid. The correct format is '(a-zA-Z_)[a-zA-Z0-9_]*'",\r
- ExtraData=self._CurrentLine + \\r
- " (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|<Token>)",\r
- File=self.MetaFile, Line=self._LineIndex + 1)\r
- # check format of PCD CName\r
- if not ValueRe.match(self._ValueList[1]):\r
- EdkLogger.error('Parser', FORMAT_INVALID, "The format of the PCD CName is invalid. The correct format is '(a-zA-Z_)[a-zA-Z0-9_]*'",\r
- ExtraData=self._CurrentLine + \\r
- " (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|<Token>)",\r
- File=self.MetaFile, Line=self._LineIndex + 1)\r
- # check PCD datum information\r
- if len(TokenList) < 2 or TokenList[1] == '':\r
- EdkLogger.error('Parser', FORMAT_INVALID, "No PCD Datum information given",\r
- ExtraData=self._CurrentLine + \\r
- " (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|<Token>)",\r
- File=self.MetaFile, Line=self._LineIndex + 1)\r
-\r
-\r
- ValueRe = re.compile(r'^\s*L?\".*\|.*\"')\r
- PtrValue = ValueRe.findall(TokenList[1])\r
-\r
- # Has VOID* type string, may contain "|" character in the string. \r
- if len(PtrValue) != 0:\r
- ptrValueList = re.sub(ValueRe, '', TokenList[1])\r
- ValueList = AnalyzePcdExpression(ptrValueList)\r
- ValueList[0] = PtrValue[0]\r
- else:\r
- ValueList = AnalyzePcdExpression(TokenList[1])\r
-\r
-\r
- # check if there's enough datum information given\r
- if len(ValueList) != 3:\r
- EdkLogger.error('Parser', FORMAT_INVALID, "Invalid PCD Datum information given",\r
- ExtraData=self._CurrentLine + \\r
- " (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|<Token>)",\r
- File=self.MetaFile, Line=self._LineIndex + 1)\r
- # check default value\r
- if ValueList[0] == '':\r
- EdkLogger.error('Parser', FORMAT_INVALID, "Missing DefaultValue in PCD Datum information",\r
- ExtraData=self._CurrentLine + \\r
- " (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|<Token>)",\r
- File=self.MetaFile, Line=self._LineIndex + 1)\r
- # check datum type\r
- if ValueList[1] == '':\r
- EdkLogger.error('Parser', FORMAT_INVALID, "Missing DatumType in PCD Datum information",\r
- ExtraData=self._CurrentLine + \\r
- " (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|<Token>)",\r
- File=self.MetaFile, Line=self._LineIndex + 1)\r
- # check token of the PCD\r
- if ValueList[2] == '':\r
- EdkLogger.error('Parser', FORMAT_INVALID, "Missing Token in PCD Datum information",\r
- ExtraData=self._CurrentLine + \\r
- " (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|<Token>)",\r
- File=self.MetaFile, Line=self._LineIndex + 1)\r
-\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
- # check format of default value against the datum type\r
- IsValid, Cause = CheckPcdDatum(ValueList[1], ValueList[0])\r
- if not IsValid:\r
- EdkLogger.error('Parser', FORMAT_INVALID, Cause, ExtraData=self._CurrentLine,\r
- File=self.MetaFile, Line=self._LineIndex + 1)\r
-\r
- if ValueList[0] in ['True', 'true', 'TRUE']:\r
- ValueList[0] = '1'\r
- elif ValueList[0] in ['False', 'false', 'FALSE']:\r
- ValueList[0] = '0'\r
-\r
- # check for duplicate PCD definition\r
- if (self._Scope[0], self._ValueList[0], self._ValueList[1]) in self._AllPCDs:\r
- EdkLogger.error('Parser', FORMAT_INVALID,\r
- "The same PCD name and GUID have been already defined",\r
- ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1)\r
- else:\r
- self._AllPCDs.append((self._Scope[0], self._ValueList[0], self._ValueList[1]))\r
- self._AllPcdDict[TAB_SPLIT.join(self._ValueList[0:2])] = ValueList[0]\r
+ if self._CurrentStructurePcdName:\r
+ self._ValueList[0] = self._CurrentStructurePcdName\r
+\r
+ if "|" not in self._CurrentLine:\r
+ if "<HeaderFiles>" == self._CurrentLine:\r
+ self._include_flag = True\r
+ self._ValueList = None\r
+ return\r
+ if "<Packages>" == self._CurrentLine:\r
+ self._package_flag = True\r
+ self._ValueList = None\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._ValueList = None\r
+ return\r
+ else:\r
+ PcdTockens = self._CurrentLine.split(TAB_VALUE_SPLIT)\r
+ PcdNames = PcdTockens[0].split(TAB_SPLIT)\r
+ if len(PcdNames) == 2:\r
+ self._CurrentStructurePcdName = ""\r
+ else:\r
+ self._ValueList[1] = PcdNames[2]\r
+ self._ValueList[2] = PcdTockens[1]\r
+ if not self._CurrentStructurePcdName:\r
+ TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1)\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
+ if self._ValueList[0] == '' or self._ValueList[1] == '':\r
+ EdkLogger.error('Parser', FORMAT_INVALID, "No token space GUID or PCD name specified",\r
+ ExtraData=self._CurrentLine + \\r
+ " (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|<Token>)",\r
+ File=self.MetaFile, Line=self._LineIndex + 1)\r
+ # check format of token space GUID CName\r
+ if not ValueRe.match(self._ValueList[0]):\r
+ EdkLogger.error('Parser', FORMAT_INVALID, "The format of the token space GUID CName is invalid. The correct format is '(a-zA-Z_)[a-zA-Z0-9_]*'",\r
+ ExtraData=self._CurrentLine + \\r
+ " (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|<Token>)",\r
+ File=self.MetaFile, Line=self._LineIndex + 1)\r
+ # check format of PCD CName\r
+ if not ValueRe.match(self._ValueList[1]):\r
+ EdkLogger.error('Parser', FORMAT_INVALID, "The format of the PCD CName is invalid. The correct format is '(a-zA-Z_)[a-zA-Z0-9_]*'",\r
+ ExtraData=self._CurrentLine + \\r
+ " (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|<Token>)",\r
+ File=self.MetaFile, Line=self._LineIndex + 1)\r
+ # check PCD datum information\r
+ if len(TokenList) < 2 or TokenList[1] == '':\r
+ EdkLogger.error('Parser', FORMAT_INVALID, "No PCD Datum information given",\r
+ ExtraData=self._CurrentLine + \\r
+ " (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|<Token>)",\r
+ File=self.MetaFile, Line=self._LineIndex + 1)\r
+\r
+\r
+ ValueRe = re.compile(r'^\s*L?\".*\|.*\"')\r
+ PtrValue = ValueRe.findall(TokenList[1])\r
+\r
+ # Has VOID* type string, may contain "|" character in the string.\r
+ if len(PtrValue) != 0:\r
+ ptrValueList = re.sub(ValueRe, '', TokenList[1])\r
+ ValueList = AnalyzePcdExpression(ptrValueList)\r
+ ValueList[0] = PtrValue[0]\r
+ else:\r
+ ValueList = AnalyzePcdExpression(TokenList[1])\r
+\r
+\r
+ # check if there's enough datum information given\r
+ if len(ValueList) != 3:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, "Invalid PCD Datum information given",\r
+ ExtraData=self._CurrentLine + \\r
+ " (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|<Token>)",\r
+ File=self.MetaFile, Line=self._LineIndex + 1)\r
+ # check default value\r
+ if ValueList[0] == '':\r
+ EdkLogger.error('Parser', FORMAT_INVALID, "Missing DefaultValue in PCD Datum information",\r
+ ExtraData=self._CurrentLine + \\r
+ " (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|<Token>)",\r
+ File=self.MetaFile, Line=self._LineIndex + 1)\r
+ # check datum type\r
+ if ValueList[1] == '':\r
+ EdkLogger.error('Parser', FORMAT_INVALID, "Missing DatumType in PCD Datum information",\r
+ ExtraData=self._CurrentLine + \\r
+ " (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|<Token>)",\r
+ File=self.MetaFile, Line=self._LineIndex + 1)\r
+ # check token of the PCD\r
+ if ValueList[2] == '':\r
+ EdkLogger.error('Parser', FORMAT_INVALID, "Missing Token in PCD Datum information",\r
+ ExtraData=self._CurrentLine + \\r
+ " (<TokenSpaceGuidCName>.<PcdCName>|<DefaultValue>|<DatumType>|<Token>)",\r
+ File=self.MetaFile, Line=self._LineIndex + 1)\r
+\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
+ # check format of default value against the datum type\r
+ IsValid, Cause = CheckPcdDatum(ValueList[1], ValueList[0])\r
+ if not IsValid:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, Cause, ExtraData=self._CurrentLine,\r
+ File=self.MetaFile, Line=self._LineIndex + 1)\r
+\r
+ if Cause == "StructurePcd":\r
+ self._CurrentStructurePcdName = TAB_SPLIT.join(self._ValueList[0:2])\r
+ self._ValueList[0] = self._CurrentStructurePcdName\r
+ self._ValueList[1] = ValueList[1].strip()\r
+\r
+ if ValueList[0] in ['True', 'true', 'TRUE']:\r
+ ValueList[0] = '1'\r
+ elif ValueList[0] in ['False', 'false', 'FALSE']:\r
+ ValueList[0] = '0'\r
+\r
+ # check for duplicate PCD definition\r
+ if (self._Scope[0], self._ValueList[0], self._ValueList[1]) in self._AllPCDs:\r
+ EdkLogger.error('Parser', FORMAT_INVALID,\r
+ "The same PCD name and GUID have been already defined",\r
+ ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1)\r
+ else:\r
+ self._AllPCDs.append((self._Scope[0], self._ValueList[0], self._ValueList[1]))\r
+ self._AllPcdDict[TAB_SPLIT.join(self._ValueList[0:2])] = ValueList[0]\r
\r
- self._ValueList[2] = ValueList[0].strip() + '|' + ValueList[1].strip() + '|' + ValueList[2].strip()\r
+ self._ValueList[2] = ValueList[0].strip() + '|' + ValueList[1].strip() + '|' + ValueList[2].strip()\r
\r
_SectionParser = {\r
MODEL_META_DATA_HEADER : MetaFileParser._DefineParser,\r