]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/BuildClassObject.py
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / BuildClassObject.py
index 36c2ebf491adeb0dc85cf4cfd4a33717fe48dce9..ef873720f4551d5e912a0f9d9dce4b91f949f180 100644 (file)
@@ -1,21 +1,23 @@
 ## @file\r
 # This file is used to define each component of the build database\r
 #\r
-# Copyright (c) 2007 ~ 2008, Intel Corporation\r
-# All rights reserved. This program and the accompanying materials\r
-# are licensed and made available under the terms and conditions of the BSD License\r
-# which accompanies this distribution.  The full text of the license may be found at\r
-# http://opensource.org/licenses/bsd-license.php\r
+# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
+# SPDX-License-Identifier: BSD-2-Clause-Patent\r
 #\r
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-#\r
-\r
-import os\r
 \r
-from Common.Misc import sdict\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
+import re\r
+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
 #\r
@@ -31,6 +33,7 @@ from Common.BuildToolError import *
 # @param MaxDatumSize:       Input value for MaxDatumSize of Pcd, default is None\r
 # @param SkuInfoList:        Input value for SkuInfoList of Pcd, default is {}\r
 # @param IsOverrided:        Input value for IsOverrided of Pcd, default is False\r
+# @param GuidValue:          Input value for TokenSpaceGuidValue of Pcd, default is None\r
 #\r
 # @var TokenCName:           To store value for TokenCName\r
 # @var TokenSpaceGuidCName:  To store value for TokenSpaceGuidCName\r
@@ -43,23 +46,155 @@ from Common.BuildToolError import *
 # @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 = {}, GuidValue = None):\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
         self.Type = Type\r
-        self.DatumType = DatumType\r
+        self._DatumType = DatumType\r
         self.DefaultValue = Value\r
         self.TokenValue = Token\r
         self.MaxDatumSize = MaxDatumSize\r
-        self.SkuInfoList = SkuInfoList\r
+        self.MaxSizeUserSet = None\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 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 = {}\r
+        self.DscRawValueInfo = {}\r
+        if IsDsc:\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
+\r
+    @property\r
+    def Capacity(self):\r
+        if self._Capacity is None:\r
+            self._Capacity = []\r
+            dimension = ArrayIndex.findall(self._DatumType)\r
+            for item in dimension:\r
+                maxsize = item.lstrip("[").rstrip("]").strip()\r
+                if not maxsize:\r
+                    maxsize = "-1"\r
+                maxsize = str(int(maxsize,16)) if maxsize.startswith(("0x","0X")) else maxsize\r
+                self._Capacity.append(maxsize)\r
+            if hasattr(self, "SkuOverrideValues"):\r
+                for sku in self.SkuOverrideValues:\r
+                    for defaultstore in self.SkuOverrideValues[sku]:\r
+                        fields = self.SkuOverrideValues[sku][defaultstore]\r
+                        for demesionattr in fields:\r
+                            fieldinfo = fields[demesionattr]\r
+                            deme = ArrayIndex.findall(demesionattr)\r
+                            for i in range(len(deme)):\r
+                                if int(deme[i].lstrip("[").rstrip("]").strip()) >= int(self._Capacity[i]):\r
+                                    if self._Capacity[i] != "-1":\r
+                                        firstfieldinfo = list(fieldinfo.values())[0]\r
+                                        EdkLogger.error('Build', OPTION_VALUE_INVALID, "For Pcd %s, Array Index exceed the Array size. From %s Line %s \n " %\r
+                                    (".".join((self.TokenSpaceGuidCName, self.TokenCName)), firstfieldinfo[1],firstfieldinfo[2] ))\r
+            if hasattr(self,"DefaultValues"):\r
+                for demesionattr in self.DefaultValues:\r
+                    fieldinfo = self.DefaultValues[demesionattr]\r
+                    deme = ArrayIndex.findall(demesionattr)\r
+                    for i in range(len(deme)):\r
+                        if int(deme[i].lstrip("[").rstrip("]").strip()) >= int(self._Capacity[i]):\r
+                            if self._Capacity[i] != "-1":\r
+                                firstfieldinfo = list(fieldinfo.values())[0]\r
+                                EdkLogger.error('Build', OPTION_VALUE_INVALID, "For Pcd %s, Array Index exceed the Array size. From %s Line %s \n " %\r
+                                    (".".join((self.TokenSpaceGuidCName, self.TokenCName)), firstfieldinfo[1],firstfieldinfo[2] ))\r
+        return self._Capacity\r
+\r
+    def PcdArraySize(self):\r
+        if self.Capacity[-1] == "-1":\r
+            return -1\r
+        size = 1\r
+        for de in self.Capacity:\r
+            size = size * int(de)\r
+        return size\r
+    @property\r
+    def DatumType(self):\r
+        return self._DatumType\r
+\r
+    @DatumType.setter\r
+    def DatumType(self,DataType):\r
+        self._DatumType = DataType\r
+        self._Capacity = None\r
+\r
+    @property\r
+    def BaseDatumType(self):\r
+        if self.IsArray():\r
+            return self._DatumType[:self._DatumType.index("[")]\r
+        else:\r
+            return self._DatumType\r
+    def IsArray(self):\r
+        return True if len(self.Capacity) else False\r
+\r
+    def IsAggregateDatumType(self):\r
+        if self.DatumType in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, TAB_VOID, "BOOLEAN"]:\r
+            return False\r
+        if self.IsArray() or StructPattern.match(self.DatumType):\r
+            return True\r
+        return False\r
+\r
+    def IsSimpleTypeArray(self):\r
+        if self.IsArray() and self.BaseDatumType in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, "BOOLEAN"]:\r
+            return True\r
+        return False\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
     #  Convert each member of the class to string\r
-    #  Organize to a signle line format string\r
+    #  Organize to a single line format string\r
     #\r
     #  @retval Rtn Formatted String\r
     #\r
@@ -73,7 +208,7 @@ class PcdClassObject(object):
               'MaxDatumSize=' + str(self.MaxDatumSize) + ', '\r
         for Item in self.SkuInfoList.values():\r
             Rtn = Rtn + 'SkuId=' + Item.SkuId + ', ' + 'SkuIdName=' + Item.SkuIdName\r
-        Rtn = Rtn + str(self.IsOverrided)\r
+        Rtn = Rtn + ', IsOverrided=' + str(self.IsOverrided)\r
 \r
         return Rtn\r
 \r
@@ -96,25 +231,235 @@ class PcdClassObject(object):
     def __hash__(self):\r
         return hash((self.TokenCName, self.TokenSpaceGuidCName))\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 != None:\r
-            self.SupModList = CleanString(Type).split(DataType.TAB_SPACE_SPLIT)\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
+        new_pcd.TokenSpaceGuidValue = self.TokenSpaceGuidValue\r
+        new_pcd.Type = self.Type\r
+        new_pcd.DatumType = self.DatumType\r
+        new_pcd.DefaultValue = self.DefaultValue\r
+        new_pcd.TokenValue = self.TokenValue\r
+        new_pcd.MaxDatumSize = self.MaxDatumSize\r
+        new_pcd.MaxSizeUserSet = self.MaxSizeUserSet\r
+\r
+        new_pcd.Phase = self.Phase\r
+        new_pcd.Pending = self.Pending\r
+        new_pcd.IsOverrided = self.IsOverrided\r
+        new_pcd.IsFromBinaryInf = self.IsFromBinaryInf\r
+        new_pcd.IsFromDsc = self.IsFromDsc\r
+        new_pcd.PcdValueFromComm = self.PcdValueFromComm\r
+        new_pcd.PcdValueFromFdf = self.PcdValueFromFdf\r
+        new_pcd.UserDefinedDefaultStoresFlag = self.UserDefinedDefaultStoresFlag\r
+        new_pcd.DscRawValue = self.DscRawValue\r
+        new_pcd.DscRawValueInfo = self.DscRawValueInfo\r
+        new_pcd.CustomAttribute = self.CustomAttribute\r
+        new_pcd.validateranges = [item for item in self.validateranges]\r
+        new_pcd.validlists = [item for item in self.validlists]\r
+        new_pcd.expressions = [item for item in self.expressions]\r
+        new_pcd.SkuInfoList = {key: copy.deepcopy(skuobj) for key,skuobj in self.SkuInfoList.items()}\r
+        return new_pcd\r
+\r
+    def __deepcopy__(self,memo):\r
+        new_pcd = PcdClassObject()\r
+        self.sharedcopy(new_pcd)\r
+        return new_pcd\r
+\r
+class StructurePcd(PcdClassObject):\r
+    def __init__(self, StructuredPcdIncludeFile=None, Packages=None, 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,default_store = TAB_DEFAULT_STORES_DEFAULT):\r
+        if SkuInfoList is None:\r
+            SkuInfoList = {}\r
+        if validateranges is None:\r
+            validateranges = []\r
+        if validlists is None:\r
+            validlists = []\r
+        if expressions is None:\r
+            expressions = []\r
+        if Packages is None:\r
+            Packages = []\r
+        super(StructurePcd, self).__init__(Name, Guid, Type, DatumType, Value, Token, MaxDatumSize, SkuInfoList, IsOverrided, GuidValue, validateranges, validlists, expressions)\r
+        self.StructuredPcdIncludeFile = [] if StructuredPcdIncludeFile is None else StructuredPcdIncludeFile\r
+        self.PackageDecs = Packages\r
+        self.DefaultStoreName = [default_store]\r
+        self.DefaultValues = OrderedDict()\r
+        self.PcdMode = None\r
+        self.SkuOverrideValues = OrderedDict()\r
+        self.StructName = None\r
+        self.PcdDefineLineNo = 0\r
+        self.PkgPath = ""\r
+        self.DefaultValueFromDec = ""\r
+        self.DefaultValueFromDecInfo = None\r
+        self.ValueChain = set()\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
+    def AddDefaultValue (self, FieldName, Value, FileName="", LineNo=0,DimensionAttr ="-1"):\r
+        if DimensionAttr not in self.DefaultValues:\r
+            self.DefaultValues[DimensionAttr] = collections.OrderedDict()\r
+        if FieldName in self.DefaultValues[DimensionAttr]:\r
+            del self.DefaultValues[DimensionAttr][FieldName]\r
+        self.DefaultValues[DimensionAttr][FieldName] = [Value.strip(), FileName, LineNo]\r
+        return self.DefaultValues[DimensionAttr][FieldName]\r
+\r
+    def SetDecDefaultValue(self, DefaultValue,decpath=None,lineno=None):\r
+        self.DefaultValueFromDec = DefaultValue\r
+        self.DefaultValueFromDecInfo = (decpath,lineno)\r
+    def AddOverrideValue (self, FieldName, Value, SkuName, DefaultStoreName, FileName="", LineNo=0, DimensionAttr = '-1'):\r
+        if SkuName not in self.SkuOverrideValues:\r
+            self.SkuOverrideValues[SkuName] = OrderedDict()\r
+        if DefaultStoreName not in self.SkuOverrideValues[SkuName]:\r
+            self.SkuOverrideValues[SkuName][DefaultStoreName] = OrderedDict()\r
+        if DimensionAttr not in self.SkuOverrideValues[SkuName][DefaultStoreName]:\r
+            self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr] = collections.OrderedDict()\r
+        if FieldName in self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr]:\r
+            del self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldName]\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
+    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
+        self.TokenSpaceGuidValue = PcdObject.TokenSpaceGuidValue if PcdObject.TokenSpaceGuidValue else self.TokenSpaceGuidValue\r
+        self.Type = PcdObject.Type if PcdObject.Type else self.Type\r
+        self._DatumType = PcdObject.DatumType if PcdObject.DatumType else self.DatumType\r
+        self.DefaultValue = PcdObject.DefaultValue if  PcdObject.DefaultValue else self.DefaultValue\r
+        self.TokenValue = PcdObject.TokenValue if PcdObject.TokenValue else self.TokenValue\r
+        self.MaxDatumSize = PcdObject.MaxDatumSize if PcdObject.MaxDatumSize else self.MaxDatumSize\r
+        self.SkuInfoList = PcdObject.SkuInfoList if PcdObject.SkuInfoList else self.SkuInfoList\r
+        self.Phase = PcdObject.Phase if PcdObject.Phase else self.Phase\r
+        self.Pending = PcdObject.Pending if PcdObject.Pending else self.Pending\r
+        self.IsOverrided = PcdObject.IsOverrided if PcdObject.IsOverrided else self.IsOverrided\r
+        self.IsFromBinaryInf = PcdObject.IsFromBinaryInf if PcdObject.IsFromBinaryInf else self.IsFromBinaryInf\r
+        self.IsFromDsc = PcdObject.IsFromDsc if PcdObject.IsFromDsc else self.IsFromDsc\r
+        self.validateranges = PcdObject.validateranges if PcdObject.validateranges else self.validateranges\r
+        self.validlists = PcdObject.validlists if PcdObject.validlists else self.validlists\r
+        self.expressions = PcdObject.expressions if PcdObject.expressions else self.expressions\r
+        self.DscRawValue = PcdObject.DscRawValue if PcdObject.DscRawValue else self.DscRawValue\r
+        self.DscRawValueInfo = PcdObject.DscRawValueInfo if PcdObject.DscRawValueInfo else self.DscRawValueInfo\r
+        self.PcdValueFromComm = PcdObject.PcdValueFromComm if PcdObject.PcdValueFromComm else self.PcdValueFromComm\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
+            self.PcdMode = PcdObject.PcdMode if PcdObject.PcdMode else self.PcdMode\r
+            self.DefaultValueFromDec = PcdObject.DefaultValueFromDec if PcdObject.DefaultValueFromDec else self.DefaultValueFromDec\r
+            self.DefaultValueFromDecInfo = PcdObject.DefaultValueFromDecInfo if PcdObject.DefaultValueFromDecInfo else self.DefaultValueFromDecInfo\r
+            self.SkuOverrideValues = PcdObject.SkuOverrideValues if PcdObject.SkuOverrideValues else self.SkuOverrideValues\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
+            self.PcdFiledValueFromDscComponent = PcdObject.PcdFiledValueFromDscComponent if PcdObject.PcdFiledValueFromDscComponent else self.PcdFiledValueFromDscComponent\r
+\r
+    def __deepcopy__(self,memo):\r
+        new_pcd = StructurePcd()\r
+        self.sharedcopy(new_pcd)\r
+\r
+        new_pcd.DefaultValueFromDec = self.DefaultValueFromDec\r
+        new_pcd.DefaultValueFromDecInfo = self.DefaultValueFromDecInfo\r
+        new_pcd.PcdMode = self.PcdMode\r
+        new_pcd.StructName = self.DatumType\r
+        new_pcd.PcdDefineLineNo = self.PcdDefineLineNo\r
+        new_pcd.PkgPath = self.PkgPath\r
+        new_pcd.StructuredPcdIncludeFile = [item for item in self.StructuredPcdIncludeFile]\r
+        new_pcd.PackageDecs = [item for item in self.PackageDecs]\r
+        new_pcd.DefaultValues = CopyDict(self.DefaultValues)\r
+        new_pcd.DefaultFromDSC=CopyDict(self.DefaultFromDSC)\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
@@ -160,7 +505,7 @@ class LibraryClassObject(object):
 #                              { [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
@@ -171,7 +516,6 @@ class ModuleBuildClassObject(object):
         self.PcdIsDriver             = ''\r
         self.BinaryModule            = ''\r
         self.Shadow                  = ''\r
-        self.SourceOverridePath      = ''\r
         self.CustomMakefile          = {}\r
         self.Specification           = {}\r
         self.LibraryClass            = []\r
@@ -182,7 +526,7 @@ class ModuleBuildClassObject(object):
 \r
         self.Binaries                = []\r
         self.Sources                 = []\r
-        self.LibraryClasses          = sdict()\r
+        self.LibraryClasses          = OrderedDict()\r
         self.Libraries               = []\r
         self.Protocols               = []\r
         self.Ppis                    = []\r
@@ -192,34 +536,8 @@ class ModuleBuildClassObject(object):
         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
@@ -244,7 +562,7 @@ class ModuleBuildClassObject(object):
 # @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
@@ -258,34 +576,6 @@ class PackageBuildClassObject(object):
         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
@@ -300,7 +590,6 @@ class PackageBuildClassObject(object):
 # @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
@@ -314,7 +603,7 @@ class PackageBuildClassObject(object):
 # @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
@@ -324,7 +613,6 @@ class PlatformBuildClassObject(object):
         self.OutputDirectory         = ''\r
         self.FlashDefinition         = ''\r
         self.BuildNumber             = ''\r
-        self.MakefileName            = ''\r
 \r
         self.SkuIds                  = {}\r
         self.Modules                 = []\r
@@ -333,32 +621,3 @@ class PlatformBuildClassObject(object):
         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
-\r