import subprocess\r
from Common.Misc import SaveFileOnChange\r
from Workspace.BuildClassObject import PlatformBuildClassObject, StructurePcd, PcdClassObject, ModuleBuildClassObject\r
-from collections import OrderedDict\r
+from collections import OrderedDict,defaultdict\r
\r
-#\r
-# Treat CHAR16 as a synonym for UINT16. CHAR16 support is required for VFR C structs\r
-#\r
PcdValueInitName = 'PcdValueInit'\r
-PcdSupportedBaseTypes = ['BOOLEAN', 'UINT8', 'UINT16', 'UINT32', 'UINT64', 'CHAR16']\r
-PcdSupportedBaseTypeWidth = {'BOOLEAN':8, 'UINT8':8, 'UINT16':16, 'UINT32':32, 'UINT64':64}\r
-PcdUnsupportedBaseTypes = ['INT8', 'INT16', 'INT32', 'INT64', 'CHAR8', 'UINTN', 'INTN', 'VOID']\r
\r
PcdMainCHeader = '''\r
/**\r
LIBS = -lCommon\r
'''\r
\r
+variablePattern = re.compile(r'[\t\s]*0[xX][a-fA-F0-9]+$')\r
+\r
## regular expressions for finding decimal and hex numbers\r
Pattern = re.compile('^[1-9]\d*|0$')\r
HexPattern = re.compile(r'0[xX][0-9a-fA-F]+$')\r
class DscBuildData(PlatformBuildClassObject):\r
# dict used to convert PCD type in database to string used by build tool\r
_PCD_TYPE_STRING_ = {\r
- MODEL_PCD_FIXED_AT_BUILD : "FixedAtBuild",\r
- MODEL_PCD_PATCHABLE_IN_MODULE : "PatchableInModule",\r
- MODEL_PCD_FEATURE_FLAG : "FeatureFlag",\r
- MODEL_PCD_DYNAMIC : "Dynamic",\r
- MODEL_PCD_DYNAMIC_DEFAULT : "Dynamic",\r
- MODEL_PCD_DYNAMIC_HII : "DynamicHii",\r
- MODEL_PCD_DYNAMIC_VPD : "DynamicVpd",\r
- MODEL_PCD_DYNAMIC_EX : "DynamicEx",\r
- MODEL_PCD_DYNAMIC_EX_DEFAULT : "DynamicEx",\r
- MODEL_PCD_DYNAMIC_EX_HII : "DynamicExHii",\r
- MODEL_PCD_DYNAMIC_EX_VPD : "DynamicExVpd",\r
+ MODEL_PCD_FIXED_AT_BUILD : TAB_PCDS_FIXED_AT_BUILD,\r
+ MODEL_PCD_PATCHABLE_IN_MODULE : TAB_PCDS_PATCHABLE_IN_MODULE,\r
+ MODEL_PCD_FEATURE_FLAG : TAB_PCDS_FEATURE_FLAG,\r
+ MODEL_PCD_DYNAMIC : TAB_PCDS_DYNAMIC,\r
+ MODEL_PCD_DYNAMIC_DEFAULT : TAB_PCDS_DYNAMIC,\r
+ MODEL_PCD_DYNAMIC_HII : TAB_PCDS_DYNAMIC_HII,\r
+ MODEL_PCD_DYNAMIC_VPD : TAB_PCDS_DYNAMIC_VPD,\r
+ MODEL_PCD_DYNAMIC_EX : TAB_PCDS_DYNAMIC_EX,\r
+ MODEL_PCD_DYNAMIC_EX_DEFAULT : TAB_PCDS_DYNAMIC_EX,\r
+ MODEL_PCD_DYNAMIC_EX_HII : TAB_PCDS_DYNAMIC_EX_HII,\r
+ MODEL_PCD_DYNAMIC_EX_VPD : TAB_PCDS_DYNAMIC_EX_VPD,\r
}\r
\r
# dict used to convert part of [Defines] to members of DscBuildData directly\r
TokenCName += '.' + FieldName\r
if PcdValue.startswith('H'):\r
if FieldName and IsFieldValueAnArray(PcdValue[1:]):\r
- PcdDatumType = 'VOID*'\r
+ PcdDatumType = TAB_VOID\r
IsArray = True\r
if FieldName and not IsArray:\r
return PcdValue\r
(TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
elif PcdValue.startswith("L'") or PcdValue.startswith("'"):\r
if FieldName and IsFieldValueAnArray(PcdValue):\r
- PcdDatumType = 'VOID*'\r
+ PcdDatumType = TAB_VOID\r
IsArray = True\r
if FieldName and not IsArray:\r
return PcdValue\r
elif PcdValue.startswith('L'):\r
PcdValue = 'L"' + PcdValue[1:] + '"'\r
if FieldName and IsFieldValueAnArray(PcdValue):\r
- PcdDatumType = 'VOID*'\r
+ PcdDatumType = TAB_VOID\r
IsArray = True\r
if FieldName and not IsArray:\r
return PcdValue\r
if PcdValue.upper() == 'TRUE':\r
PcdValue = str(1)\r
if not FieldName:\r
- if PcdDatumType not in ['UINT8','UINT16','UINT32','UINT64','BOOLEAN']:\r
+ if PcdDatumType not in TAB_PCD_NUMERIC_TYPES:\r
PcdValue = '"' + PcdValue + '"'\r
else:\r
IsArray = False\r
except:\r
PcdValue = '"' + PcdValue + '"'\r
if IsFieldValueAnArray(PcdValue):\r
- PcdDatumType = 'VOID*'\r
+ PcdDatumType = TAB_VOID\r
IsArray = True\r
if not IsArray:\r
return PcdValue\r
options[Key] += ' ' + Option\r
return self._ModuleTypeOptions[Edk, ModuleType]\r
\r
- def GetStructurePcdInfo(self, PcdSet):\r
- structure_pcd_data = {}\r
+ @staticmethod\r
+ def GetStructurePcdInfo(PcdSet):\r
+ structure_pcd_data = defaultdict(list)\r
for item in PcdSet:\r
- if (item[0],item[1]) not in structure_pcd_data:\r
- structure_pcd_data[(item[0],item[1])] = []\r
structure_pcd_data[(item[0],item[1])].append(item)\r
\r
return structure_pcd_data\r
for item in GlobalData.BuildOptionPcd:\r
if len(item) == 5 and (item[1],item[0]) in StruPcds:\r
StructurePcdInCom[(item[0],item[1],item[2] )] = (item[3],item[4])\r
- GlobalPcds = set([(item[0],item[1]) for item in StructurePcdInCom.keys()])\r
+ GlobalPcds = {(item[0],item[1]) for item in StructurePcdInCom}\r
for Pcd in StruPcds.values():\r
if (Pcd.TokenSpaceGuidCName,Pcd.TokenCName) not in GlobalPcds:\r
continue\r
for defaultstore in SkuInfo.DefaultStoreDict:\r
SkuInfo.DefaultStoreDict[defaultstore] = NoFiledValues[(Pcd.TokenSpaceGuidCName,Pcd.TokenCName)][0]\r
if Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII]]:\r
- if Pcd.DatumType == "VOID*":\r
+ if Pcd.DatumType == TAB_VOID:\r
if not Pcd.MaxDatumSize:\r
Pcd.MaxDatumSize = '0'\r
CurrentSize = int(Pcd.MaxDatumSize,16) if Pcd.MaxDatumSize.upper().startswith("0X") else int(Pcd.MaxDatumSize)\r
DefaultStoreMgr = DefaultStore(self.DefaultStores)\r
SkuIds = self.SkuIdMgr.AvailableSkuIdSet\r
SkuIds.update({TAB_DEFAULT:0})\r
- DefaultStores = set([storename for pcdobj in AllPcds.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict.keys()])\r
+ DefaultStores = {storename for pcdobj in AllPcds.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict}\r
\r
S_PcdSet = []\r
# Find out all possible PCD candidates for self._Arch\r
S_PcdSet.append([ TokenSpaceGuid.split(".")[0],TokenSpaceGuid.split(".")[1], PcdCName,SkuName, default_store,Dummy5, AnalyzePcdExpression(Setting)[0]])\r
\r
# handle pcd value override\r
- StrPcdSet = self.GetStructurePcdInfo(S_PcdSet)\r
+ StrPcdSet = DscBuildData.GetStructurePcdInfo(S_PcdSet)\r
S_pcd_set = OrderedDict()\r
for str_pcd in StrPcdSet:\r
str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None)\r
\r
@staticmethod\r
def GetPcdMaxSize(Pcd):\r
+ if Pcd.DatumType in TAB_PCD_NUMERIC_TYPES:\r
+ return MAX_SIZE_TYPE[Pcd.DatumType]\r
+\r
MaxSize = int(Pcd.MaxDatumSize,10) if Pcd.MaxDatumSize else 0\r
- if Pcd.DatumType not in ['BOOLEAN','UINT8','UINT16','UINT32','UINT64']:\r
- if Pcd.PcdValueFromComm:\r
- if Pcd.PcdValueFromComm.startswith("{") and Pcd.PcdValueFromComm.endswith("}"):\r
- MaxSize = max([len(Pcd.PcdValueFromComm.split(",")),MaxSize])\r
- elif Pcd.PcdValueFromComm.startswith("\"") or Pcd.PcdValueFromComm.startswith("\'"):\r
- MaxSize = max([len(Pcd.PcdValueFromComm)-2+1,MaxSize])\r
- elif Pcd.PcdValueFromComm.startswith("L\""):\r
- MaxSize = max([2*(len(Pcd.PcdValueFromComm)-3+1),MaxSize])\r
- else:\r
- MaxSize = max([len(Pcd.PcdValueFromComm),MaxSize])\r
- elif Pcd.DatumType not in ['BOOLEAN','UINT8']:\r
- MaxSize = 1\r
- elif Pcd.DatumType == 'UINT16':\r
- MaxSize = 2\r
- elif Pcd.DatumType == 'UINT32':\r
- MaxSize = 4\r
- elif Pcd.DatumType == 'UINT64':\r
- MaxSize = 8\r
+ if Pcd.PcdValueFromComm:\r
+ if Pcd.PcdValueFromComm.startswith("{") and Pcd.PcdValueFromComm.endswith("}"):\r
+ return max([len(Pcd.PcdValueFromComm.split(",")),MaxSize])\r
+ elif Pcd.PcdValueFromComm.startswith("\"") or Pcd.PcdValueFromComm.startswith("\'"):\r
+ return max([len(Pcd.PcdValueFromComm)-2+1,MaxSize])\r
+ elif Pcd.PcdValueFromComm.startswith("L\""):\r
+ return max([2*(len(Pcd.PcdValueFromComm)-3+1),MaxSize])\r
+ else:\r
+ return max([len(Pcd.PcdValueFromComm),MaxSize])\r
return MaxSize\r
\r
def GenerateSizeFunction(self,Pcd):\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
+ Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
except BadExpression:\r
EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
(".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))\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
+ Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
except BadExpression:\r
EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
(".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))\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
+ Value = ValueExpressionEx(Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
except BadExpression:\r
EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
(".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), Pcd.PcdFieldValueFromComm[FieldName.strip(".")][1], Pcd.PcdFieldValueFromComm[FieldName.strip(".")][2]))\r
IsArray = IsFieldValueAnArray(Pcd.DefaultValueFromDec)\r
if IsArray:\r
try:\r
- DefaultValueFromDec = ValueExpressionEx(Pcd.DefaultValueFromDec, "VOID*")(True)\r
+ DefaultValueFromDec = ValueExpressionEx(Pcd.DefaultValueFromDec, TAB_VOID)(True)\r
except BadExpression:\r
EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DEC: %s" %\r
(Pcd.TokenSpaceGuidCName, Pcd.TokenCName, DefaultValueFromDec))\r
IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
if IsArray:\r
try:\r
- FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], "VOID*", self._GuidDict)(True)\r
+ FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
except BadExpression:\r
EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
(".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1],FieldList[FieldName][2]))\r
IsArray = IsFieldValueAnArray(FieldList)\r
if IsArray:\r
try:\r
- FieldList = ValueExpressionEx(FieldList, "VOID*")(True)\r
+ FieldList = ValueExpressionEx(FieldList, TAB_VOID)(True)\r
except BadExpression:\r
EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DSC: %s" %\r
(Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))\r
IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
if IsArray:\r
try:\r
- FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], "VOID*", self._GuidDict)(True)\r
+ FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
except BadExpression:\r
EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
(".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
IsArray = IsFieldValueAnArray(FieldList)\r
if IsArray:\r
try:\r
- FieldList = ValueExpressionEx(FieldList, "VOID*")(True)\r
+ FieldList = ValueExpressionEx(FieldList, TAB_VOID)(True)\r
except BadExpression:\r
EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from Command: %s" %\r
(Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))\r
IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
if IsArray:\r
try:\r
- FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], "VOID*", self._GuidDict)(True)\r
+ FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
except BadExpression:\r
EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
(".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
InitByteValue = ""\r
CApp = PcdMainCHeader\r
\r
- Includes = {}\r
IncludeFiles = set()\r
for PcdName in StructuredPcds:\r
Pcd = StructuredPcds[PcdName]\r
for IncludeFile in Pcd.StructuredPcdIncludeFile:\r
- if IncludeFile not in Includes:\r
- Includes[IncludeFile] = True\r
+ if IncludeFile not in IncludeFiles:\r
IncludeFiles.add(IncludeFile)\r
CApp = CApp + '#include <%s>\n' % (IncludeFile)\r
CApp = CApp + '\n'\r
Pcds = {}\r
DefaultStoreObj = DefaultStore(self._GetDefaultStores())\r
SkuIds = {skuname:skuid for skuname,skuid in self.SkuIdMgr.AvailableSkuIdSet.items() if skuname != TAB_COMMON}\r
- DefaultStores = set([storename for pcdobj in PcdSet.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict.keys()])\r
+ DefaultStores = set([storename for pcdobj in PcdSet.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict])\r
for PcdCName, TokenSpaceGuid in PcdSet:\r
PcdObj = PcdSet[(PcdCName, TokenSpaceGuid)]\r
self.CopyDscRawValue(PcdObj)\r
if VariableOffset.isdigit():\r
if int(VariableOffset, 10) > 0xFFFF:\r
ExceedMax = True\r
- elif re.match(r'[\t\s]*0[xX][a-fA-F0-9]+$', VariableOffset):\r
+ elif variablePattern.match(VariableOffset):\r
if int(VariableOffset, 16) > 0xFFFF:\r
ExceedMax = True\r
# For Offset written in "A.B"\r
MaxSize = int(pcd.MaxDatumSize, 0)\r
else:\r
MaxSize = 0\r
- if pcd.DatumType not in ['BOOLEAN','UINT8','UINT16','UINT32','UINT64']:\r
+ if pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
for (_, skuobj) in pcd.SkuInfoList.items():\r
datalen = 0\r
skuobj.HiiDefaultValue = StringToArray(skuobj.HiiDefaultValue)\r