]> 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 5d2bb733752a8f593c845e88e2971bed55369264..ef873720f4551d5e912a0f9d9dce4b91f949f180 100644 (file)
@@ -12,8 +12,11 @@ import re
 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
@@ -69,6 +72,7 @@ class PcdClassObject(object):
             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
@@ -227,6 +231,15 @@ class PcdClassObject(object):
     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
@@ -288,6 +301,7 @@ class StructurePcd(PcdClassObject):
         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
@@ -314,6 +328,12 @@ class StructurePcd(PcdClassObject):
         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
@@ -355,6 +375,7 @@ class StructurePcd(PcdClassObject):
             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
@@ -373,11 +394,73 @@ class StructurePcd(PcdClassObject):
         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
@@ -422,7 +505,7 @@ LibraryClassObject = namedtuple('LibraryClassObject', ['LibraryClass','SupModLis
 #                              { [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
@@ -453,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
@@ -505,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
@@ -519,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
@@ -561,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
@@ -575,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
@@ -585,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
@@ -594,31 +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