from Common.DataType import *\r
from Common.Misc import *\r
from types import *\r
-\r
+from Common.Expression import *\r
from CommonDataClass.CommonClass import SkuInfoClass\r
from Common.TargetTxtClassObject import *\r
from Common.ToolDefClassObject import *\r
if isinstance(self._Pcds[pcd],StructurePcd) and (self._Pcds[pcd].PcdValueFromComm or self._Pcds[pcd].PcdFieldValueFromComm):\r
UpdateCommandLineValue(self._Pcds[pcd])\r
\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
TokenSpaceGuidCNameList = []\r
FoundFlag = False\r
PcdDatumType = ''\r
- NewValue = ''\r
+ DisplayName = TokenCName\r
+ if FieldName:\r
+ DisplayName = TokenCName + '.' + FieldName\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
+ PcdItem = self.DecPcds[key]\r
+ if TokenCName == PcdItem.TokenCName:\r
+ if not PcdItem.TokenSpaceGuidCName in TokenSpaceGuidCNameList:\r
+ if len (TokenSpaceGuidCNameList) < 1:\r
+ TokenSpaceGuidCNameList.append(PcdItem.TokenSpaceGuidCName)\r
+ TokenSpaceGuidCName = PcdItem.TokenSpaceGuidCName\r
+ PcdDatumType = PcdItem.DatumType\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." % (DisplayName, PcdItem.TokenSpaceGuidCName, TokenSpaceGuidCNameList[0])\r
+ )\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
+ EdkLogger.error('build', AUTOGEN_ERROR, "The Pcd %s.%s is not found in the DEC file." % (TokenSpaceGuidCName, DisplayName))\r
else:\r
- EdkLogger.error('build', AUTOGEN_ERROR, "The Pcd %s is not found in the DEC file." % (TokenCName))\r
+ EdkLogger.error('build', AUTOGEN_ERROR, "The Pcd %s is not found in the DEC file." % (DisplayName))\r
+ pcdvalue = pcdvalue.replace("\\\\\\'", '\\\\\\"').replace('\\\'', '\'').replace('\\\\\\"', "\\'")\r
+ if FieldName:\r
+ pcdvalue = self.HandleFlexiblePcd(TokenSpaceGuidCName, TokenCName, pcdvalue, PcdDatumType, self._GuidDict, FieldName)\r
+ else:\r
+ pcdvalue = self.HandleFlexiblePcd(TokenSpaceGuidCName, TokenCName, pcdvalue, PcdDatumType, self._GuidDict)\r
+ IsValid, Cause = CheckPcdDatum(PcdDatumType, pcdvalue)\r
+ if not IsValid:\r
+ EdkLogger.error("build", FORMAT_INVALID, Cause, ExtraData="%s.%s" % (TokenSpaceGuidCName, TokenCName))\r
+ GlobalData.BuildOptionPcd[i] = (TokenSpaceGuidCName, TokenCName, FieldName, pcdvalue,("build command options",1))\r
+\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
+ PcdItem.DefaultValue = pcdvalue\r
+\r
+ def HandleFlexiblePcd(self, TokenSpaceGuidCName, TokenCName, PcdValue, PcdDatumType, GuidDict, FieldName=''):\r
+ if FieldName:\r
+ IsArray = False\r
+ TokenCName += '.' + FieldName\r
+ if PcdValue.startswith('H'):\r
+ if FieldName and IsFieldValueAnArray(PcdValue[1:]):\r
+ PcdDatumType = 'VOID*'\r
+ IsArray = True\r
+ if FieldName and not IsArray:\r
+ return PcdValue\r
+ try:\r
+ PcdValue = ValueExpressionEx(PcdValue[1:], PcdDatumType, GuidDict)(True)\r
+ except BadExpression, Value: \r
+ EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
+ (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
+ elif PcdValue.startswith("L'") or PcdValue.startswith("'"):\r
+ if FieldName and IsFieldValueAnArray(PcdValue):\r
+ PcdDatumType = 'VOID*'\r
+ IsArray = True\r
+ if FieldName and not IsArray:\r
+ return PcdValue\r
+ try:\r
+ PcdValue = ValueExpressionEx(PcdValue, PcdDatumType, GuidDict)(True)\r
+ except BadExpression, Value:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
+ (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
+ elif PcdValue.startswith('L'):\r
+ PcdValue = 'L"' + PcdValue[1:] + '"'\r
+ if FieldName and IsFieldValueAnArray(PcdValue):\r
+ PcdDatumType = 'VOID*'\r
+ IsArray = True\r
+ if FieldName and not IsArray:\r
+ return PcdValue\r
+ try:\r
+ PcdValue = ValueExpressionEx(PcdValue, PcdDatumType, 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
+ if PcdValue.upper() == 'FALSE':\r
+ PcdValue = str(0)\r
+ if PcdValue.upper() == 'TRUE':\r
+ PcdValue = str(1)\r
+ if not FieldName:\r
+ if PcdDatumType not in ['UINT8','UINT16','UINT32','UINT64','BOOLEAN']:\r
+ PcdValue = '"' + PcdValue + '"'\r
+ else:\r
+ IsArray = False\r
+ Base = 10\r
+ if PcdValue.upper().startswith('0X'):\r
+ Base = 16\r
+ try:\r
+ Num = int(PcdValue, Base)\r
+ except:\r
+ PcdValue = '"' + PcdValue + '"'\r
+ if IsFieldValueAnArray(PcdValue):\r
+ PcdDatumType = 'VOID*'\r
+ IsArray = True\r
+ if not IsArray:\r
+ return PcdValue\r
+ try:\r
+ PcdValue = ValueExpressionEx(PcdValue, PcdDatumType, GuidDict)(True)\r
+ except BadExpression, Value:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
+ (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
+ return PcdValue\r
+\r
## Retrieve all PCD settings in platform\r
def _GetPcds(self):\r
if self._Pcds == None:\r
\r
return str(max([pcd_size for pcd_size in [get_length(item) for item in sku_values]]))\r
\r
- def IsFieldValueAnArray (self, Value):\r
- Value = Value.strip()\r
- if Value.startswith('GUID') and Value.endswith(')'):\r
- return True\r
- if Value.startswith('L"') and Value.endswith('"') and len(list(Value[2:-1])) > 1:\r
- return True\r
- if Value[0] == '"' and Value[-1] == '"' and len(list(Value[1:-1])) > 1:\r
- return True\r
- if Value[0] == '{' and Value[-1] == '}':\r
- return True\r
- if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:\r
- return True\r
- if Value[0] == "'" and Value[-1] == "'" and len(list(Value[1:-1])) > 1:\r
- return True\r
- return False\r
-\r
def ExecuteCommand (self, Command):\r
try:\r
Process = subprocess.Popen(Command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)\r
continue\r
for FieldName in FieldList:\r
FieldName = "." + FieldName\r
- IsArray = self.IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
+ IsArray = IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):\r
try:\r
Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], "VOID*", self._GuidDict)(True)\r
continue\r
for FieldName in FieldList:\r
FieldName = "." + FieldName\r
- IsArray = self.IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
+ IsArray = IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):\r
try:\r
Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], "VOID*", self._GuidDict)(True)\r
CApp = CApp + "// From Command Line \n"\r
for FieldName in Pcd.PcdFieldValueFromComm:\r
FieldName = "." + FieldName\r
- IsArray = self.IsFieldValueAnArray(Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0])\r
+ IsArray = IsFieldValueAnArray(Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0])\r
if IsArray and not (Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0].startswith('{GUID') and Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0].endswith('}')):\r
try:\r
Value = ValueExpressionEx(Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0], "VOID*", self._GuidDict)(True)\r
CApp = CApp + ' UINT32 FieldSize;\n'\r
CApp = CApp + ' CHAR8 *Value;\n'\r
DefaultValueFromDec = Pcd.DefaultValueFromDec\r
- IsArray = self.IsFieldValueAnArray(Pcd.DefaultValueFromDec)\r
+ IsArray = IsFieldValueAnArray(Pcd.DefaultValueFromDec)\r
if IsArray:\r
try:\r
DefaultValueFromDec = ValueExpressionEx(Pcd.DefaultValueFromDec, "VOID*")(True)\r
if not FieldList:\r
continue\r
for FieldName in FieldList:\r
- IsArray = self.IsFieldValueAnArray(FieldList[FieldName][0])\r
+ IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
if IsArray:\r
try:\r
FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], "VOID*", self._GuidDict)(True)\r
if not FieldList:\r
continue\r
if pcddefaultvalue and FieldList == pcddefaultvalue:\r
- IsArray = self.IsFieldValueAnArray(FieldList)\r
+ IsArray = IsFieldValueAnArray(FieldList)\r
if IsArray:\r
try:\r
FieldList = ValueExpressionEx(FieldList, "VOID*")(True)\r
continue\r
if (SkuName,DefaultStoreName) == ('DEFAULT','STANDARD') or (( (SkuName,'') not in Pcd.ValueChain) and ( (SkuName,DefaultStoreName) not in Pcd.ValueChain )):\r
for FieldName in FieldList:\r
- IsArray = self.IsFieldValueAnArray(FieldList[FieldName][0])\r
+ IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
if IsArray:\r
try:\r
FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], "VOID*", self._GuidDict)(True)\r
if not FieldList:\r
continue\r
if pcddefaultvalue and FieldList == pcddefaultvalue:\r
- IsArray = self.IsFieldValueAnArray(FieldList)\r
+ IsArray = IsFieldValueAnArray(FieldList)\r
if IsArray:\r
try:\r
FieldList = ValueExpressionEx(FieldList, "VOID*")(True)\r
CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
continue\r
for FieldName in FieldList:\r
- IsArray = self.IsFieldValueAnArray(FieldList[FieldName][0])\r
+ IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
if IsArray:\r
try:\r
FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], "VOID*", self._GuidDict)(True)\r