from collections import OrderedDict\r
from Common.Misc import CopyDict,ArrayIndex\r
import copy\r
+from CommonDataClass.DataClass import *\r
import Common.EdkLogger as EdkLogger\r
+import Common.GlobalData as GlobalData\r
from Common.BuildToolError import OPTION_VALUE_INVALID\r
+from Common.caching import cached_property\r
StructPattern = re.compile(r'[_a-zA-Z][0-9A-Za-z_\[\]]*$')\r
\r
## PcdClassObject\r
self.DscDefaultValue = Value\r
self.PcdValueFromComm = ""\r
self.PcdValueFromFdf = ""\r
+ self.PcdValueFromComponents = {} #{ModuleGuid:value, file_path,lineNo}\r
self.CustomAttribute = {}\r
self.UserDefinedDefaultStoresFlag = UserDefinedDefaultStoresFlag\r
self._Capacity = None\r
def __hash__(self):\r
return hash((self.TokenCName, self.TokenSpaceGuidCName))\r
\r
+ @cached_property\r
+ def _fullname(self):\r
+ return ".".join((self.TokenSpaceGuidCName,self.TokenCName))\r
+\r
+ def __lt__(self,pcd):\r
+ return self._fullname < pcd._fullname\r
+ def __gt__(self,pcd):\r
+ return self._fullname > pcd._fullname\r
+\r
def sharedcopy(self,new_pcd):\r
new_pcd.TokenCName = self.TokenCName\r
new_pcd.TokenSpaceGuidCName = self.TokenSpaceGuidCName\r
self.PcdFieldValueFromComm = OrderedDict()\r
self.PcdFieldValueFromFdf = OrderedDict()\r
self.DefaultFromDSC=None\r
+ self.PcdFiledValueFromDscComponent = OrderedDict()\r
def __repr__(self):\r
return self.TypeName\r
\r
self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldName] = [Value.strip(), FileName, LineNo]\r
return self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldName]\r
\r
+ def AddComponentOverrideValue(self,FieldName, Value, ModuleGuid, FileName="", LineNo=0, DimensionAttr = '-1'):\r
+ self.PcdFiledValueFromDscComponent.setdefault(ModuleGuid, OrderedDict())\r
+ self.PcdFiledValueFromDscComponent[ModuleGuid].setdefault(DimensionAttr,OrderedDict())\r
+ self.PcdFiledValueFromDscComponent[ModuleGuid][DimensionAttr][FieldName] = [Value.strip(), FileName, LineNo]\r
+ return self.PcdFiledValueFromDscComponent[ModuleGuid][DimensionAttr][FieldName]\r
+\r
def SetPcdMode (self, PcdMode):\r
self.PcdMode = PcdMode\r
\r
self.ValueChain = PcdObject.ValueChain if PcdObject.ValueChain else self.ValueChain\r
self.PcdFieldValueFromComm = PcdObject.PcdFieldValueFromComm if PcdObject.PcdFieldValueFromComm else self.PcdFieldValueFromComm\r
self.PcdFieldValueFromFdf = PcdObject.PcdFieldValueFromFdf if PcdObject.PcdFieldValueFromFdf else self.PcdFieldValueFromFdf\r
+ self.PcdFiledValueFromDscComponent = PcdObject.PcdFiledValueFromDscComponent if PcdObject.PcdFiledValueFromDscComponent else self.PcdFiledValueFromDscComponent\r
\r
def __deepcopy__(self,memo):\r
new_pcd = StructurePcd()\r
new_pcd.SkuOverrideValues = CopyDict(self.SkuOverrideValues)\r
new_pcd.PcdFieldValueFromComm = CopyDict(self.PcdFieldValueFromComm)\r
new_pcd.PcdFieldValueFromFdf = CopyDict(self.PcdFieldValueFromFdf)\r
+ new_pcd.PcdFiledValueFromDscComponent = CopyDict(self.PcdFiledValueFromDscComponent)\r
new_pcd.ValueChain = {item for item in self.ValueChain}\r
return new_pcd\r
\r
LibraryClassObject = namedtuple('LibraryClassObject', ['LibraryClass','SupModList'])\r
\r
+class BuildData(object):\r
+ # dict used to convert PCD type in database to string used by build tool\r
+\r
+ _PCD_TYPE_STRING_ = {\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
+ def UpdatePcdTypeDict(self):\r
+ if GlobalData.gCommandLineDefines.get(TAB_DSC_DEFINES_PCD_DYNAMIC_AS_DYNAMICEX,"FALSE").upper() == "TRUE":\r
+ self._PCD_TYPE_STRING_ = {\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_EX,\r
+ MODEL_PCD_DYNAMIC_DEFAULT : TAB_PCDS_DYNAMIC_EX,\r
+ MODEL_PCD_DYNAMIC_HII : TAB_PCDS_DYNAMIC_EX_HII,\r
+ MODEL_PCD_DYNAMIC_VPD : TAB_PCDS_DYNAMIC_EX_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
+ ## Convert the class to a string\r
+ #\r
+ # Convert member MetaFile of the class to a string\r
+ #\r
+ # @retval string Formatted String\r
+ #\r
+ def __str__(self):\r
+ return str(self.MetaFile)\r
+\r
+ ## Override __eq__ function\r
+ #\r
+ # Check whether ModuleBuildClassObjects are the same\r
+ #\r
+ # @retval False The two ModuleBuildClassObjects are different\r
+ # @retval True The two ModuleBuildClassObjects are the same\r
+ #\r
+ def __eq__(self, Other):\r
+ return self.MetaFile == Other\r
+\r
+ ## Override __hash__ function\r
+ #\r
+ # Use MetaFile as key in hash table\r
+ #\r
+ # @retval string Key for hash table\r
+ #\r
+ def __hash__(self):\r
+ return hash(self.MetaFile)\r
+\r
## ModuleBuildClassObject\r
#\r
# This Class defines ModuleBuildClass\r
# { [BuildOptionKey] : BuildOptionValue}\r
# @var Depex: To store value for Depex\r
#\r
-class ModuleBuildClassObject(object):\r
+class ModuleBuildClassObject(BuildData):\r
def __init__(self):\r
self.AutoGenVersion = 0\r
self.MetaFile = ''\r
self.Pcds = {}\r
self.BuildOptions = {}\r
self.Depex = {}\r
-\r
- ## Convert the class to a string\r
- #\r
- # Convert member MetaFile of the class to a string\r
- #\r
- # @retval string Formatted String\r
- #\r
- def __str__(self):\r
- return str(self.MetaFile)\r
-\r
- ## Override __eq__ function\r
- #\r
- # Check whether ModuleBuildClassObjects are the same\r
- #\r
- # @retval False The two ModuleBuildClassObjects are different\r
- # @retval True The two ModuleBuildClassObjects are the same\r
- #\r
- def __eq__(self, Other):\r
- return self.MetaFile == Other\r
-\r
- ## Override __hash__ function\r
- #\r
- # Use MetaFile as key in hash table\r
- #\r
- # @retval string Key for hash table\r
- #\r
- def __hash__(self):\r
- return hash(self.MetaFile)\r
+ self.StrPcdSet = []\r
+ self.StrPcdOverallValue = {}\r
\r
## PackageBuildClassObject\r
#\r
# @var Pcds: To store value for Pcds, it is a set structure as\r
# { [(PcdCName, PcdGuidCName)] : PcdClassObject}\r
#\r
-class PackageBuildClassObject(object):\r
+class PackageBuildClassObject(BuildData):\r
def __init__(self):\r
self.MetaFile = ''\r
self.PackageName = ''\r
self.LibraryClasses = {}\r
self.Pcds = {}\r
\r
- ## Convert the class to a string\r
- #\r
- # Convert member MetaFile of the class to a string\r
- #\r
- # @retval string Formatted String\r
- #\r
- def __str__(self):\r
- return str(self.MetaFile)\r
-\r
- ## Override __eq__ function\r
- #\r
- # Check whether PackageBuildClassObjects are the same\r
- #\r
- # @retval False The two PackageBuildClassObjects are different\r
- # @retval True The two PackageBuildClassObjects are the same\r
- #\r
- def __eq__(self, Other):\r
- return self.MetaFile == Other\r
-\r
- ## Override __hash__ function\r
- #\r
- # Use MetaFile as key in hash table\r
- #\r
- # @retval string Key for hash table\r
- #\r
- def __hash__(self):\r
- return hash(self.MetaFile)\r
-\r
## PlatformBuildClassObject\r
#\r
# This Class defines PlatformBuildClass\r
# @var OutputDirectory: To store value for OutputDirectory\r
# @var FlashDefinition: To store value for FlashDefinition\r
# @var BuildNumber: To store value for BuildNumber\r
-# @var MakefileName: To store value for MakefileName\r
# @var SkuIds: To store value for SkuIds, it is a set structure as\r
# { 'SkuName' : SkuId, '!include' : includefilename, ...}\r
# @var Modules: To store value for Modules, it is a list structure as\r
# @var BuildOptions: To store value for BuildOptions, it is a set structure as\r
# { [BuildOptionKey] : BuildOptionValue }\r
#\r
-class PlatformBuildClassObject(object):\r
+class PlatformBuildClassObject(BuildData):\r
def __init__(self):\r
self.MetaFile = ''\r
self.PlatformName = ''\r
self.OutputDirectory = ''\r
self.FlashDefinition = ''\r
self.BuildNumber = ''\r
- self.MakefileName = ''\r
\r
self.SkuIds = {}\r
self.Modules = []\r
self.Libraries = {}\r
self.Pcds = {}\r
self.BuildOptions = {}\r
-\r
- ## Convert the class to a string\r
- #\r
- # Convert member MetaFile of the class to a string\r
- #\r
- # @retval string Formatted String\r
- #\r
- def __str__(self):\r
- return str(self.MetaFile)\r
-\r
- ## Override __eq__ function\r
- #\r
- # Check whether PlatformBuildClassObjects are the same\r
- #\r
- # @retval False The two PlatformBuildClassObjects are different\r
- # @retval True The two PlatformBuildClassObjects are the same\r
- #\r
- def __eq__(self, Other):\r
- return self.MetaFile == Other\r
-\r
- ## Override __hash__ function\r
- #\r
- # Use MetaFile as key in hash table\r
- #\r
- # @retval string Key for hash table\r
- #\r
- def __hash__(self):\r
- return hash(self.MetaFile)\r