from MetaFileTable import *\r
from MetaFileParser import *\r
from BuildClassObject import *\r
+from WorkspaceCommon import GetDeclaredPcd\r
+from Common.Misc import AnalyzeDscPcd\r
\r
## Platform build information from DSC file\r
#\r
self._LibraryInstances = None\r
self._LibraryClasses = None\r
self._Pcds = None\r
+ self._DecPcds = None\r
self._BuildOptions = None\r
self._LoadFixAddress = None\r
self._RFCLanguages = None\r
self._LibraryClasses[Library.BaseName, ':dummy:'] = Library\r
return self._LibraryClasses\r
\r
+ def _ValidatePcd(self, PcdCName, TokenSpaceGuid, Setting, PcdType, LineNo):\r
+ if self._DecPcds == None:\r
+ self._DecPcds = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain)\r
+ if (PcdCName, TokenSpaceGuid) not in self._DecPcds:\r
+ EdkLogger.error('build', PARSER_ERROR,\r
+ "Pcd (%s.%s) defined in DSC is not declared in DEC files." % (TokenSpaceGuid, PcdCName),\r
+ File=self.MetaFile, Line=LineNo)\r
+ ValueList, IsValid, Index = AnalyzeDscPcd(Setting, PcdType, self._DecPcds[PcdCName, TokenSpaceGuid].DatumType)\r
+ if not IsValid and PcdType not in [MODEL_PCD_FEATURE_FLAG, MODEL_PCD_FIXED_AT_BUILD]:\r
+ EdkLogger.error('build', FORMAT_INVALID, "Pcd format incorrect.", File=self.MetaFile, Line=LineNo,\r
+ ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))\r
+ if ValueList[Index] and PcdType not in [MODEL_PCD_FEATURE_FLAG, MODEL_PCD_FIXED_AT_BUILD]:\r
+ try:\r
+ ValueList[Index] = ValueExpression(ValueList[Index], GlobalData.gPlatformPcds)(True)\r
+ except WrnExpression, Value:\r
+ ValueList[Index] = Value.result\r
+ except EvaluationException, Excpt:\r
+ if hasattr(Excpt, 'Pcd'):\r
+ if Excpt.Pcd in GlobalData.gPlatformOtherPcds:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, "Cannot use this PCD (%s) in an expression as"\r
+ " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"\r
+ " of the DSC file" % Excpt.Pcd,\r
+ File=self.MetaFile, Line=LineNo)\r
+ else:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) is not defined in DSC file" % Excpt.Pcd,\r
+ File=self.MetaFile, Line=LineNo)\r
+ else:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt),\r
+ File=self.MetaFile, Line=LineNo)\r
+ if ValueList[Index] == 'True':\r
+ ValueList[Index] = '1'\r
+ elif ValueList[Index] == 'False':\r
+ ValueList[Index] = '0'\r
+ if ValueList[Index]:\r
+ Valid, ErrStr = CheckPcdDatum(self._DecPcds[PcdCName, TokenSpaceGuid].DatumType, ValueList[Index])\r
+ if not Valid:\r
+ EdkLogger.error('build', FORMAT_INVALID, ErrStr, File=self.MetaFile, Line=LineNo,\r
+ ExtraData="%s.%s" % (TokenSpaceGuid, PcdCName))\r
+ return ValueList\r
+\r
## Retrieve all PCD settings in platform\r
def _GetPcds(self):\r
if self._Pcds == None:\r
# Find out all possible PCD candidates for self._Arch\r
RecordList = self._RawData[Type, self._Arch]\r
for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList:\r
- PcdSet.add((PcdCName, TokenSpaceGuid))\r
+ PcdSet.add((PcdCName, TokenSpaceGuid, Dummy4))\r
PcdDict[Arch, PcdCName, TokenSpaceGuid] = Setting\r
# Remove redundant PCD candidates\r
- for PcdCName, TokenSpaceGuid in PcdSet:\r
+ for PcdCName, TokenSpaceGuid, Dummy4 in PcdSet:\r
Setting = PcdDict[self._Arch, PcdCName, TokenSpaceGuid]\r
if Setting == None:\r
continue\r
- PcdValue, DatumType, MaxDatumSize = AnalyzePcdData(Setting)\r
+ PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
PcdCName,\r
TokenSpaceGuid,\r
# Find out all possible PCD candidates for self._Arch\r
RecordList = self._RawData[Type, self._Arch]\r
for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList:\r
- PcdList.append((PcdCName, TokenSpaceGuid))\r
+ PcdList.append((PcdCName, TokenSpaceGuid, Dummy4))\r
PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
# Remove redundant PCD candidates, per the ARCH and SKU\r
- for PcdCName, TokenSpaceGuid in PcdList:\r
+ for PcdCName, TokenSpaceGuid, Dummy4 in PcdList:\r
Setting = PcdDict[self._Arch, self.SkuName, PcdCName, TokenSpaceGuid]\r
if Setting == None:\r
continue\r
\r
- PcdValue, DatumType, MaxDatumSize = AnalyzePcdData(Setting)\r
+ PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
\r
SkuInfo = SkuInfoClass(self.SkuName, self.SkuIds[self.SkuName], '', '', '', '', '', PcdValue)\r
Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
RecordList = self._RawData[Type, self._Arch]\r
# Find out all possible PCD candidates for self._Arch\r
for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList:\r
- PcdSet.add((PcdCName, TokenSpaceGuid))\r
+ PcdSet.add((PcdCName, TokenSpaceGuid, Dummy4))\r
PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
# Remove redundant PCD candidates, per the ARCH and SKU\r
- for PcdCName, TokenSpaceGuid in PcdSet:\r
+ for PcdCName, TokenSpaceGuid, Dummy4 in PcdSet:\r
Setting = PcdDict[self._Arch, self.SkuName, PcdCName, TokenSpaceGuid]\r
if Setting == None:\r
continue\r
- VariableName, VariableGuid, VariableOffset, DefaultValue = AnalyzeHiiPcdData(Setting)\r
+ VariableName, VariableGuid, VariableOffset, DefaultValue = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
SkuInfo = SkuInfoClass(self.SkuName, self.SkuIds[self.SkuName], VariableName, VariableGuid, VariableOffset, DefaultValue)\r
Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
PcdCName,\r
# Find out all possible PCD candidates for self._Arch\r
RecordList = self._RawData[Type, self._Arch]\r
for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList:\r
- PcdList.append((PcdCName, TokenSpaceGuid))\r
+ PcdList.append((PcdCName, TokenSpaceGuid, Dummy4))\r
PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
# Remove redundant PCD candidates, per the ARCH and SKU\r
- for PcdCName, TokenSpaceGuid in PcdList:\r
+ for PcdCName, TokenSpaceGuid, Dummy4 in PcdList:\r
Setting = PcdDict[self._Arch, self.SkuName, PcdCName, TokenSpaceGuid]\r
if Setting == None:\r
continue\r
# At this point, we put all the data into the PcdClssObject for we don't know the PCD's datumtype\r
# until the DEC parser has been called.\r
# \r
- VpdOffset, MaxDatumSize, InitialValue = AnalyzeVpdPcdData(Setting)\r
+ VpdOffset, MaxDatumSize, InitialValue = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
\r
SkuInfo = SkuInfoClass(self.SkuName, self.SkuIds[self.SkuName], '', '', '', '', VpdOffset, InitialValue)\r
Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
self.Pcds[Name, Guid] = PcdClassObject(Name, Guid, '', '', '', '', '', {}, False, None)\r
self.Pcds[Name, Guid].DefaultValue = Value\r
\r
- def IsPlatformPcdDeclared(self, DecPcds):\r
- for PcdType in (MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE, MODEL_PCD_FEATURE_FLAG,\r
- MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_HII, MODEL_PCD_DYNAMIC_VPD,\r
- MODEL_PCD_DYNAMIC_EX_DEFAULT, MODEL_PCD_DYNAMIC_EX_HII, MODEL_PCD_DYNAMIC_EX_VPD):\r
- RecordList = self._RawData[PcdType, self._Arch]\r
- for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList:\r
- if (PcdCName, TokenSpaceGuid) not in DecPcds:\r
- EdkLogger.error('build', PARSER_ERROR,\r
- "Pcd (%s.%s) defined in DSC is not declared in DEC files." % (TokenSpaceGuid, PcdCName),\r
- File=self.MetaFile, Line=Dummy4)\r
- PcdValue = ''\r
- if PcdType in (MODEL_PCD_DYNAMIC_VPD, MODEL_PCD_DYNAMIC_EX_VPD):\r
- if DecPcds[PcdCName, TokenSpaceGuid].DatumType == "VOID*":\r
- PcdValue = AnalyzeVpdPcdData(Setting)[2]\r
- else:\r
- PcdValue = AnalyzeVpdPcdData(Setting)[1]\r
- elif PcdType in (MODEL_PCD_DYNAMIC_HII, MODEL_PCD_DYNAMIC_EX_HII):\r
- PcdValue = AnalyzeHiiPcdData(Setting)[3]\r
- else:\r
- PcdValue = AnalyzePcdData(Setting)[0]\r
- if PcdValue:\r
- Valid, ErrStr = CheckPcdDatum(DecPcds[PcdCName, TokenSpaceGuid].DatumType, PcdValue)\r
- if not Valid:\r
- EdkLogger.error('build', FORMAT_INVALID, ErrStr, File=self.MetaFile, Line=Dummy4,\r
- ExtraData="%s.%s" % (TokenSpaceGuid, PcdCName))\r
-\r
_Macros = property(_GetMacros)\r
Arch = property(_GetArch, _SetArch)\r
Platform = property(_GetPlatformName)\r