+ def RecoverCommandLinePcd(self):\r
+ pcdset = []\r
+ if GlobalData.BuildOptionPcd:\r
+ for pcd in GlobalData.BuildOptionPcd:\r
+ if pcd[2] == "":\r
+ pcdset.append((pcd[0],pcd[1],pcd[3]))\r
+ else:\r
+ pcdobj = self._Pcds.get((pcd[1],pcd[0]))\r
+ if pcdobj:\r
+ pcdset.append((pcd[0],pcd[1], pcdobj.DefaultValue))\r
+ else:\r
+ pcdvalue = pcd[3] if len(pcd) == 4 else pcd[2]\r
+ pcdset.append((pcd[0],pcd[1],pcdvalue))\r
+ GlobalData.BuildOptionPcd = pcdset\r
+ def GetFieldValueFromComm(self,ValueStr,TokenSpaceGuidCName, TokenCName, FieldName):\r
+ PredictedFieldType = "VOID*"\r
+ if ValueStr.startswith('L'):\r
+ if not ValueStr[1]:\r
+ EdkLogger.error("build", FORMAT_INVALID, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", H"{...}"')\r
+ ValueStr = ValueStr[0] + '"' + ValueStr[1:] + '"'\r
+ PredictedFieldType = "VOID*"\r
+ elif ValueStr.startswith('H') or ValueStr.startswith('{'):\r
+ EdkLogger.error("build", FORMAT_INVALID, 'Currently we do not support assign H"{...}" format for Pcd field.', ExtraData="%s.%s.%s from command line" % (TokenSpaceGuidCName, TokenCName, FieldName))\r
+ ValueStr = ValueStr[1:]\r
+ PredictedFieldType = "VOID*"\r
+ elif ValueStr.upper() in ['TRUE', '0X1', '0X01', '1', 'FALSE', '0X0', '0X00', '0']:\r
+ PredictedFieldType = "BOOLEAN"\r
+ elif ValueStr.isdigit() or ValueStr.upper().startswith('0X'):\r
+ PredictedFieldType = TAB_UINT16\r
+ else:\r
+ if not ValueStr[0]:\r
+ EdkLogger.error("build", FORMAT_INVALID, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", H"{...}"')\r
+ ValueStr = '"' + ValueStr + '"'\r
+ PredictedFieldType = "VOID*"\r
+ IsValid, Cause = CheckPcdDatum(PredictedFieldType, ValueStr)\r
+ if not IsValid:\r
+ EdkLogger.error("build", FORMAT_INVALID, Cause, ExtraData="%s.%s.%s from command line" % (TokenSpaceGuidCName, TokenCName, FieldName))\r
+ if PredictedFieldType == 'BOOLEAN':\r
+ ValueStr = ValueStr.upper()\r
+ if ValueStr == 'TRUE' or ValueStr == '1':\r
+ ValueStr = '1'\r
+ elif ValueStr == 'FALSE' or ValueStr == '0':\r
+ ValueStr = '0'\r
+ return ValueStr\r
+ def __ParsePcdFromCommandLine(self):\r
+ if GlobalData.BuildOptionPcd:\r
+ for i, pcd in enumerate(GlobalData.BuildOptionPcd):\r
+ if type(pcd) is tuple:\r
+ continue\r
+ (pcdname, pcdvalue) = pcd.split('=')\r
+ if not pcdvalue:\r
+ EdkLogger.error('build', AUTOGEN_ERROR, "No Value specified for the PCD %s." % (pcdname))\r
+ if '.' in pcdname:\r
+ (Name1, Name2) = pcdname.split('.',1)\r
+ if "." in Name2:\r
+ (Name3, FieldName) = Name2.split(".",1)\r
+ if ((Name3,Name1)) in self.DecPcds:\r
+ HasTokenSpace = True\r
+ TokenCName = Name3\r
+ TokenSpaceGuidCName = Name1\r
+ else:\r
+ FieldName = Name2\r
+ TokenCName = Name1\r
+ TokenSpaceGuidCName = ''\r
+ HasTokenSpace = False\r
+ else:\r
+ if ((Name2,Name1)) in self.DecPcds:\r
+ HasTokenSpace = True\r
+ TokenCName = Name2\r
+ TokenSpaceGuidCName = Name1\r
+ FieldName =""\r
+ else:\r
+ FieldName = Name2\r
+ TokenCName = Name1\r
+ TokenSpaceGuidCName = ''\r
+ HasTokenSpace = False\r
+ else:\r
+ FieldName = ""\r
+ TokenCName = pcdname\r
+ TokenSpaceGuidCName = ''\r
+ HasTokenSpace = False\r
+ TokenSpaceGuidCNameList = []\r
+ FoundFlag = False\r
+ PcdDatumType = ''\r
+ NewValue = ''\r
+ if not HasTokenSpace:\r
+ for key in self.DecPcds:\r
+ if TokenCName == key[0]:\r
+ if TokenSpaceGuidCName:\r
+ EdkLogger.error(\r
+ 'build',\r
+ AUTOGEN_ERROR,\r
+ "The Pcd %s is found under multiple different TokenSpaceGuid: %s and %s." % (TokenCName, TokenSpaceGuidCName, key[1])\r
+ )\r
+ else:\r
+ TokenSpaceGuidCName = key[1]\r
+ FoundFlag = True\r
+ else:\r
+ if (TokenCName, TokenSpaceGuidCName) in self.DecPcds:\r
+ FoundFlag = True\r
+ if FieldName:\r
+ NewValue = self.GetFieldValueFromComm(pcdvalue, TokenSpaceGuidCName, TokenCName, FieldName)\r
+ GlobalData.BuildOptionPcd[i] = (TokenSpaceGuidCName, TokenCName, FieldName,NewValue,("build command options",1))\r
+ else:\r
+ # Replace \' to ', \\\' to \'\r
+ pcdvalue = pcdvalue.replace("\\\\\\'", '\\\\\\"').replace('\\\'', '\'').replace('\\\\\\"', "\\'")\r
+ for key in self.DecPcds:\r
+ PcdItem = self.DecPcds[key]\r
+ if HasTokenSpace:\r
+ if (PcdItem.TokenCName, PcdItem.TokenSpaceGuidCName) == (TokenCName, TokenSpaceGuidCName):\r
+ PcdDatumType = PcdItem.DatumType\r
+ if pcdvalue.startswith('H'):\r
+ try:\r
+ pcdvalue = ValueExpressionEx(pcdvalue[1:], PcdDatumType, self._GuidDict)(True)\r
+ except BadExpression, Value:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
+ (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
+ if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']:\r
+ pcdvalue = 'H' + pcdvalue\r
+ elif pcdvalue.startswith("L'"):\r
+ try:\r
+ pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True)\r
+ except BadExpression, Value:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
+ (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
+ if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']:\r
+ pcdvalue = 'H' + pcdvalue\r
+ elif pcdvalue.startswith("'"):\r
+ try:\r
+ pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True)\r
+ except BadExpression, Value:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
+ (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
+ if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']:\r
+ pcdvalue = 'H' + pcdvalue\r
+ elif pcdvalue.startswith('L'):\r
+ pcdvalue = 'L"' + pcdvalue[1:] + '"'\r
+ try:\r
+ pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True)\r
+ except BadExpression, Value:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
+ (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
+ else:\r
+ try:\r
+ pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True)\r
+ except BadExpression, Value:\r
+ try:\r
+ pcdvalue = '"' + pcdvalue + '"'\r
+ pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True)\r
+ except BadExpression, Value:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
+ (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
+ NewValue = BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, pcdvalue)\r
+ FoundFlag = True\r
+ else:\r
+ if PcdItem.TokenCName == TokenCName:\r
+ if not PcdItem.TokenSpaceGuidCName in TokenSpaceGuidCNameList:\r
+ if len (TokenSpaceGuidCNameList) < 1:\r
+ TokenSpaceGuidCNameList.append(PcdItem.TokenSpaceGuidCName)\r
+ PcdDatumType = PcdItem.DatumType\r
+ TokenSpaceGuidCName = PcdItem.TokenSpaceGuidCName\r
+ if pcdvalue.startswith('H'):\r
+ try:\r
+ pcdvalue = ValueExpressionEx(pcdvalue[1:], PcdDatumType, self._GuidDict)(True)\r
+ except BadExpression, Value:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
+ (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
+ if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64,'BOOLEAN']:\r
+ pcdvalue = 'H' + pcdvalue\r
+ elif pcdvalue.startswith("L'"):\r
+ try:\r
+ pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(\r
+ True)\r
+ except BadExpression, Value:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
+ (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
+ if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']:\r
+ pcdvalue = 'H' + pcdvalue\r
+ elif pcdvalue.startswith("'"):\r
+ try:\r
+ pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(\r
+ True)\r
+ except BadExpression, Value:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
+ (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
+ if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']:\r
+ pcdvalue = 'H' + pcdvalue\r
+ elif pcdvalue.startswith('L'):\r
+ pcdvalue = 'L"' + pcdvalue[1:] + '"'\r
+ try:\r
+ pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(\r
+ True)\r
+ except BadExpression, Value:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
+ (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
+ else:\r
+ try:\r
+ pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True)\r
+ except BadExpression, Value:\r
+ try:\r
+ pcdvalue = '"' + pcdvalue + '"'\r
+ pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True)\r
+ except BadExpression, Value:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
+ (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
+ NewValue = BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, pcdvalue)\r
+ FoundFlag = True\r
+ else:\r
+ EdkLogger.error(\r
+ 'build',\r
+ AUTOGEN_ERROR,\r
+ "The Pcd %s is found under multiple different TokenSpaceGuid: %s and %s." % (TokenCName, PcdItem.TokenSpaceGuidCName, TokenSpaceGuidCNameList[0])\r
+ )\r
+ GlobalData.BuildOptionPcd[i] = (TokenSpaceGuidCName, TokenCName, FieldName,NewValue,("build command options",1))\r
+ if not FoundFlag:\r
+ if HasTokenSpace:\r
+ EdkLogger.error('build', AUTOGEN_ERROR, "The Pcd %s.%s is not found in the DEC file." % (TokenSpaceGuidCName, TokenCName))\r
+ else:\r
+ EdkLogger.error('build', AUTOGEN_ERROR, "The Pcd %s is not found in the DEC file." % (TokenCName))\r
+ for BuildData in self._Bdb._CACHE_.values():\r
+ if BuildData.MetaFile.Ext == '.dec' or BuildData.MetaFile.Ext == '.dsc':\r
+ continue\r
+ for key in BuildData.Pcds:\r
+ PcdItem = BuildData.Pcds[key]\r
+ if (TokenSpaceGuidCName, TokenCName) == (PcdItem.TokenSpaceGuidCName, PcdItem.TokenCName) and FieldName =="":\r
+ PcdItem.DefaultValue = NewValue\r