]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/BuildClassObject.py
BaseTools: Fix the bug that PcdValueFromComm is not set
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / BuildClassObject.py
index 258905e80f25a4bfa6e2879847dfedd22aad92d1..95edc376fe6ebc2eeacca973a5a31ab60257ca47 100644 (file)
 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 #\r
 \r
-import Common.LongFilePathOs as os\r
-\r
-from collections import OrderedDict\r
-from Common.Misc import RealPath2\r
-from Common.BuildToolError import *\r
+from collections import OrderedDict, namedtuple\r
 from Common.DataType import *\r
 import collections\r
-\r
+import re\r
+from collections import OrderedDict\r
+StructPattern = re.compile(r'[_a-zA-Z][0-9A-Za-z_\[\]]*$')\r
+ArrayIndex = re.compile("\[\s*\d{0,1}\s*\]")\r
 ## PcdClassObject\r
 #\r
 # This Class is used for PcdObject\r
@@ -46,7 +45,7 @@ import collections
 # @var Phase:                To store value for Phase, default is "DXE"\r
 #\r
 class PcdClassObject(object):\r
-    def __init__(self, Name = None, Guid = None, Type = None, DatumType = None, Value = None, Token = None, MaxDatumSize = None, SkuInfoList = {}, IsOverrided = False, GuidValue = None, validateranges = [], validlists = [], expressions = [], IsDsc = False):\r
+    def __init__(self, Name = None, Guid = None, Type = None, DatumType = None, Value = None, Token = None, MaxDatumSize = None, SkuInfoList = None, IsOverrided = False, GuidValue = None, validateranges = None, validlists = None, expressions = None, IsDsc = False, UserDefinedDefaultStoresFlag = False):\r
         self.TokenCName = Name\r
         self.TokenSpaceGuidCName = Guid\r
         self.TokenSpaceGuidValue = GuidValue\r
@@ -56,21 +55,64 @@ class PcdClassObject(object):
         self.TokenValue = Token\r
         self.MaxDatumSize = MaxDatumSize\r
         self.MaxSizeUserSet = None\r
-        self.SkuInfoList = SkuInfoList\r
+        self.SkuInfoList = SkuInfoList if SkuInfoList is not None else OrderedDict()\r
         self.Phase = "DXE"\r
         self.Pending = False\r
         self.IsOverrided = IsOverrided\r
         self.IsFromBinaryInf = False\r
         self.IsFromDsc = False\r
-        self.validateranges = validateranges\r
-        self.validlists = validlists\r
-        self.expressions = expressions\r
+        self.validateranges = validateranges if validateranges is not None else []\r
+        self.validlists = validlists if validlists is not None else []\r
+        self.expressions = expressions if expressions is not None else []\r
         self.DscDefaultValue = None\r
-        self.DscRawValue = None\r
+        self.DscRawValue = {}\r
         if IsDsc:\r
             self.DscDefaultValue = Value\r
         self.PcdValueFromComm = ""\r
-        self.DefinitionPosition = ("","")\r
+        self.PcdValueFromFdf = ""\r
+        self.CustomAttribute = {}\r
+        self.UserDefinedDefaultStoresFlag = UserDefinedDefaultStoresFlag\r
+\r
+    @staticmethod\r
+    def GetPcdMaxSizeWorker(PcdString, MaxSize):\r
+        if PcdString.startswith("{") and PcdString.endswith("}"):\r
+            return  max([len(PcdString.split(",")),MaxSize])\r
+\r
+        if PcdString.startswith("\"") or PcdString.startswith("\'"):\r
+            return  max([len(PcdString)-2+1,MaxSize])\r
+\r
+        if PcdString.startswith("L\""):\r
+            return  max([2*(len(PcdString)-3+1),MaxSize])\r
+\r
+        return max([len(PcdString),MaxSize])\r
+\r
+    ## Get the maximum number of bytes\r
+    def GetPcdMaxSize(self):\r
+        if self.DatumType in TAB_PCD_NUMERIC_TYPES:\r
+            return MAX_SIZE_TYPE[self.DatumType]\r
+\r
+        MaxSize = int(self.MaxDatumSize, 10) if self.MaxDatumSize else 0\r
+        if self.PcdValueFromFdf:\r
+            MaxSize = self.GetPcdMaxSizeWorker(self.PcdValueFromFdf,MaxSize)\r
+        if self.PcdValueFromComm:\r
+            MaxSize = self.GetPcdMaxSizeWorker(self.PcdValueFromComm,MaxSize)\r
+        if hasattr(self, "DefaultValueFromDec"):\r
+            MaxSize = self.GetPcdMaxSizeWorker(self.DefaultValueFromDec,MaxSize)\r
+        return MaxSize\r
+\r
+    ## Get the number of bytes\r
+    def GetPcdSize(self):\r
+        if self.DatumType in TAB_PCD_NUMERIC_TYPES:\r
+            return MAX_SIZE_TYPE[self.DatumType]\r
+        if not self.DefaultValue:\r
+            return 1\r
+        elif self.DefaultValue[0] == 'L':\r
+            return (len(self.DefaultValue) - 2) * 2\r
+        elif self.DefaultValue[0] == '{':\r
+            return len(self.DefaultValue.split(','))\r
+        else:\r
+            return len(self.DefaultValue) - 1\r
+\r
 \r
     ## Convert the class to a string\r
     #\r
@@ -128,16 +170,16 @@ class StructurePcd(PcdClassObject):
         self.StructuredPcdIncludeFile = [] if StructuredPcdIncludeFile is None else StructuredPcdIncludeFile\r
         self.PackageDecs = Packages\r
         self.DefaultStoreName = [default_store]\r
-        self.DefaultValues = collections.OrderedDict()\r
+        self.DefaultValues = OrderedDict()\r
         self.PcdMode = None\r
-        self.SkuOverrideValues = collections.OrderedDict()\r
-        self.FlexibleFieldName = None\r
+        self.SkuOverrideValues = OrderedDict()\r
         self.StructName = None\r
         self.PcdDefineLineNo = 0\r
         self.PkgPath = ""\r
         self.DefaultValueFromDec = ""\r
         self.ValueChain = set()\r
-        self.PcdFieldValueFromComm = collections.OrderedDict()\r
+        self.PcdFieldValueFromComm = OrderedDict()\r
+        self.PcdFieldValueFromFdf = OrderedDict()\r
     def __repr__(self):\r
         return self.TypeName\r
 \r
@@ -147,13 +189,13 @@ class StructurePcd(PcdClassObject):
         self.DefaultValues[FieldName] = [Value.strip(), FileName, LineNo]\r
         return self.DefaultValues[FieldName]\r
 \r
-    def SetDecDefaultValue(self,DefaultValue):\r
+    def SetDecDefaultValue(self, DefaultValue):\r
         self.DefaultValueFromDec = DefaultValue\r
     def AddOverrideValue (self, FieldName, Value, SkuName, DefaultStoreName, FileName="", LineNo=0):\r
         if SkuName not in self.SkuOverrideValues:\r
-            self.SkuOverrideValues[SkuName] = collections.OrderedDict()\r
+            self.SkuOverrideValues[SkuName] = OrderedDict()\r
         if DefaultStoreName not in self.SkuOverrideValues[SkuName]:\r
-            self.SkuOverrideValues[SkuName][DefaultStoreName] = collections.OrderedDict()\r
+            self.SkuOverrideValues[SkuName][DefaultStoreName] = OrderedDict()\r
         if FieldName in self.SkuOverrideValues[SkuName][DefaultStoreName]:\r
             del self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName]\r
         self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName] = [Value.strip(), FileName, LineNo]\r
@@ -162,9 +204,6 @@ class StructurePcd(PcdClassObject):
     def SetPcdMode (self, PcdMode):\r
         self.PcdMode = PcdMode\r
 \r
-    def SetFlexibleFieldName (self, FlexibleFieldName):\r
-        self.FlexibleFieldName = FlexibleFieldName\r
-\r
     def copy(self, PcdObject):\r
         self.TokenCName = PcdObject.TokenCName if PcdObject.TokenCName else self.TokenCName\r
         self.TokenSpaceGuidCName = PcdObject.TokenSpaceGuidCName if PcdObject.TokenSpaceGuidCName else PcdObject.TokenSpaceGuidCName\r
@@ -185,8 +224,10 @@ class StructurePcd(PcdClassObject):
         self.expressions = PcdObject.expressions if PcdObject.expressions else self.expressions\r
         self.DscRawValue = PcdObject.DscRawValue if PcdObject.DscRawValue else self.DscRawValue\r
         self.PcdValueFromComm = PcdObject.PcdValueFromComm if PcdObject.PcdValueFromComm else self.PcdValueFromComm\r
-        self.DefinitionPosition = PcdObject.DefinitionPosition if PcdObject.DefinitionPosition else self.DefinitionPosition\r
-        if type(PcdObject) is StructurePcd:\r
+        self.PcdValueFromFdf = PcdObject.PcdValueFromFdf if PcdObject.PcdValueFromFdf else self.PcdValueFromFdf\r
+        self.CustomAttribute = PcdObject.CustomAttribute if PcdObject.CustomAttribute else self.CustomAttribute\r
+        self.UserDefinedDefaultStoresFlag = PcdObject.UserDefinedDefaultStoresFlag if PcdObject.UserDefinedDefaultStoresFlag else self.UserDefinedDefaultStoresFlag\r
+        if isinstance(PcdObject, StructurePcd):\r
             self.StructuredPcdIncludeFile = PcdObject.StructuredPcdIncludeFile if PcdObject.StructuredPcdIncludeFile else self.StructuredPcdIncludeFile\r
             self.PackageDecs = PcdObject.PackageDecs if PcdObject.PackageDecs else self.PackageDecs\r
             self.DefaultValues = PcdObject.DefaultValues if PcdObject.DefaultValues else self.DefaultValues\r
@@ -194,32 +235,14 @@ class StructurePcd(PcdClassObject):
             self.DefaultFromDSC=None\r
             self.DefaultValueFromDec = PcdObject.DefaultValueFromDec if PcdObject.DefaultValueFromDec else self.DefaultValueFromDec\r
             self.SkuOverrideValues = PcdObject.SkuOverrideValues if PcdObject.SkuOverrideValues else self.SkuOverrideValues\r
-            self.FlexibleFieldName = PcdObject.FlexibleFieldName if PcdObject.FlexibleFieldName else self.FlexibleFieldName\r
             self.StructName = PcdObject.DatumType if PcdObject.DatumType else self.StructName\r
             self.PcdDefineLineNo = PcdObject.PcdDefineLineNo if PcdObject.PcdDefineLineNo else self.PcdDefineLineNo\r
             self.PkgPath = PcdObject.PkgPath if PcdObject.PkgPath else self.PkgPath\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
 \r
-## LibraryClassObject\r
-#\r
-# This Class defines LibraryClassObject used in BuildDatabase\r
-#\r
-# @param object:      Inherited from object class\r
-# @param Name:        Input value for LibraryClassName, default is None\r
-# @param SupModList:  Input value for SupModList, default is []\r
-# @param Type:        Input value for Type, default is None\r
-#\r
-# @var LibraryClass:  To store value for LibraryClass\r
-# @var SupModList:    To store value for SupModList\r
-# @var Type:          To store value for Type\r
-#\r
-class LibraryClassObject(object):\r
-    def __init__(self, Name = None, SupModList = [], Type = None):\r
-        self.LibraryClass = Name\r
-        self.SupModList = SupModList\r
-        if Type is not None:\r
-            self.SupModList = CleanString(Type).split(DataType.TAB_SPACE_SPLIT)\r
+LibraryClassObject = namedtuple('LibraryClassObject', ['LibraryClass','SupModList'], verbose=False)\r
 \r
 ## ModuleBuildClassObject\r
 #\r