+ 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
+ FdfInfList = []\r
+ if GlobalData.gFdfParser:\r
+ FdfInfList = GlobalData.gFdfParser.Profile.InfList\r
+\r
+ PkgSet = set()\r
+ for Inf in FdfInfList:\r
+ ModuleFile = PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch=self._Arch)\r
+ if ModuleFile in self._Modules:\r
+ continue\r
+ ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
+ PkgSet.update(ModuleData.Packages)\r
+ DecPcds = {}\r
+ for Pkg in PkgSet:\r
+ for Pcd in Pkg.Pcds:\r
+ DecPcds[Pcd[0], Pcd[1]] = Pkg.Pcds[Pcd]\r
+ self._DecPcds.update(DecPcds)\r
+\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. Arch: ['%s']" % (TokenSpaceGuid, PcdCName, self._Arch),\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