]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
Sync EDKII BaseTools to BaseTools project r2042.
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / WorkspaceDatabase.py
index 3aabd545d5d65c9182fae588f13c300998efce99..dad6ecd49a071fb0f81cc6012441698cb22c8bfd 100644 (file)
@@ -18,6 +18,7 @@ import sqlite3
 import os\r
 import os.path\r
 import pickle\r
+import uuid\r
 \r
 import Common.EdkLogger as EdkLogger\r
 import Common.GlobalData as GlobalData\r
@@ -99,6 +100,10 @@ class DscBuildData(PlatformBuildClassObject):
         RecordList = self._RawData[MODEL_META_DATA_DEFINE, self._Arch]\r
         for Record in RecordList:\r
             GlobalData.gEdkGlobal[Record[0]] = Record[1]\r
+        \r
+        RecordList = self._RawData[MODEL_META_DATA_GLOBAL_DEFINE, self._Arch]\r
+        for Record in RecordList:\r
+            GlobalData.gGlobalDefines[Record[0]] = Record[1]\r
 \r
     ## XXX[key] = value\r
     def __setitem__(self, key, value):\r
@@ -135,6 +140,8 @@ class DscBuildData(PlatformBuildClassObject):
         self._Pcds              = None\r
         self._BuildOptions      = None\r
         self._LoadFixAddress    = None\r
+        self._VpdToolGuid       = None\r
+        self._VpdFileName       = None\r
 \r
     ## Get architecture\r
     def _GetArch(self):\r
@@ -188,6 +195,18 @@ class DscBuildData(PlatformBuildClassObject):
                     self._SkuName = Record[1]\r
             elif Name == TAB_FIX_LOAD_TOP_MEMORY_ADDRESS:\r
                 self._LoadFixAddress = Record[1]\r
+            elif Name == TAB_DSC_DEFINES_VPD_TOOL_GUID:\r
+                #\r
+                # try to convert GUID to a real UUID value to see whether the GUID is format \r
+                # for VPD_TOOL_GUID is correct.\r
+                #\r
+                try:\r
+                    uuid.UUID(Record[1])\r
+                except:\r
+                    EdkLogger.error("build", FORMAT_INVALID, "Invalid GUID format for VPD_TOOL_GUID", File=self.MetaFile)\r
+                self._VpdToolGuid = Record[1]               \r
+            elif Name == TAB_DSC_DEFINES_VPD_FILENAME:\r
+                self._VpdFileName = Record[1]       \r
         # set _Header to non-None in order to avoid database re-querying\r
         self._Header = 'DUMMY'\r
 \r
@@ -267,6 +286,8 @@ class DscBuildData(PlatformBuildClassObject):
     def _SetSkuName(self, Value):\r
         if Value in self.SkuIds:\r
             self._SkuName = Value\r
+            # Needs to re-retrieve the PCD information\r
+            self._Pcds = None\r
 \r
     def _GetFdfFile(self):\r
         if self._FlashDefinition == None:\r
@@ -321,6 +342,24 @@ class DscBuildData(PlatformBuildClassObject):
                 self._LoadFixAddress = ''\r
         return self._LoadFixAddress\r
 \r
+    ## Retrieve the GUID string for VPD tool\r
+    def _GetVpdToolGuid(self):\r
+        if self._VpdToolGuid == None:\r
+            if self._Header == None:\r
+                self._GetHeaderInfo()\r
+            if self._VpdToolGuid == None:\r
+                self._VpdToolGuid = ''\r
+        return self._VpdToolGuid\r
+  \r
+    ## Retrieve the VPD file Name, this is optional in DSC file\r
+    def _GetVpdFileName(self):\r
+        if self._VpdFileName == None:\r
+            if self._Header == None:\r
+                self._GetHeaderInfo()\r
+            if self._VpdFileName == None:\r
+                self._VpdFileName = ''\r
+        return self._VpdFileName  \r
+    \r
     ## Retrieve [SkuIds] section information\r
     def _GetSkuIds(self):\r
         if self._SkuIds == None:\r
@@ -418,6 +457,7 @@ class DscBuildData(PlatformBuildClassObject):
                             '',\r
                             MaxDatumSize,\r
                             {},\r
+                            False,\r
                             None\r
                             )\r
                     Module.Pcds[PcdCName, TokenSpaceGuid] = Pcd\r
@@ -576,6 +616,7 @@ class DscBuildData(PlatformBuildClassObject):
                                                 '',\r
                                                 MaxDatumSize,\r
                                                 {},\r
+                                                False,\r
                                                 None\r
                                                 )\r
         return Pcds\r
@@ -619,6 +660,7 @@ class DscBuildData(PlatformBuildClassObject):
                                                 '',\r
                                                 MaxDatumSize,\r
                                                 {self.SkuName : SkuInfo},\r
+                                                False,\r
                                                 None\r
                                                 )\r
         return Pcds\r
@@ -661,6 +703,7 @@ class DscBuildData(PlatformBuildClassObject):
                                                 '',\r
                                                 '',\r
                                                 {self.SkuName : SkuInfo},\r
+                                                False,\r
                                                 None\r
                                                 )\r
         return Pcds\r
@@ -686,15 +729,21 @@ class DscBuildData(PlatformBuildClassObject):
             PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
         # Remove redundant PCD candidates, per the ARCH and SKU\r
         for PcdCName, TokenSpaceGuid in PcdSet:\r
-            ValueList = ['', '']\r
+            ValueList = ['', '', '']\r
             Setting = PcdDict[self._Arch, self.SkuName, PcdCName, TokenSpaceGuid]\r
             if Setting == None:\r
                 continue\r
             TokenList = Setting.split(TAB_VALUE_SPLIT)\r
             ValueList[0:len(TokenList)] = TokenList\r
-            VpdOffset, MaxDatumSize = ValueList\r
-\r
-            SkuInfo = SkuInfoClass(self.SkuName, self.SkuIds[self.SkuName], '', '', '', '', VpdOffset)\r
+            #\r
+            # For the VOID* type, it can have optional data of MaxDatumSize and InitialValue\r
+            # For the Integer & Boolean type, the optional data can only be InitialValue.\r
+            # At this point, we put all the data into the PcdClssObject for we don't know the PCD's datumtype\r
+            # until the DEC parser has been called.\r
+            # \r
+            VpdOffset, MaxDatumSize, InitialValue = ValueList\r
+\r
+            SkuInfo = SkuInfoClass(self.SkuName, self.SkuIds[self.SkuName], '', '', '', '', VpdOffset, InitialValue)\r
             Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
                                                 PcdCName,\r
                                                 TokenSpaceGuid,\r
@@ -704,6 +753,7 @@ class DscBuildData(PlatformBuildClassObject):
                                                 '',\r
                                                 MaxDatumSize,\r
                                                 {self.SkuName : SkuInfo},\r
+                                                False,\r
                                                 None\r
                                                 )\r
         return Pcds\r
@@ -733,7 +783,7 @@ class DscBuildData(PlatformBuildClassObject):
     #\r
     def AddPcd(self, Name, Guid, Value):\r
         if (Name, Guid) not in self.Pcds:\r
-            self.Pcds[Name, Guid] = PcdClassObject(Name, Guid, '', '', '', '', '', {}, None)\r
+            self.Pcds[Name, Guid] = PcdClassObject(Name, Guid, '', '', '', '', '', {}, False, None)\r
         self.Pcds[Name, Guid].DefaultValue = Value\r
 \r
     Arch                = property(_GetArch, _SetArch)\r
@@ -752,7 +802,8 @@ class DscBuildData(PlatformBuildClassObject):
     BsBaseAddress       = property(_GetBsBaseAddress)\r
     RtBaseAddress       = property(_GetRtBaseAddress)\r
     LoadFixAddress      = property(_GetLoadFixAddress)\r
-\r
+    VpdToolGuid         = property(_GetVpdToolGuid)\r
+    VpdFileName         = property(_GetVpdFileName)    \r
     SkuIds              = property(_GetSkuIds)\r
     Modules             = property(_GetModules)\r
     LibraryInstances    = property(_GetLibraryInstances)\r
@@ -760,7 +811,7 @@ class DscBuildData(PlatformBuildClassObject):
     Pcds                = property(_GetPcds)\r
     BuildOptions        = property(_GetBuildOptions)\r
 \r
-## Platform build information from DSC file\r
+## Platform build information from DEC file\r
 #\r
 #  This class is used to retrieve information stored in database and convert them\r
 # into PackageBuildClassObject form for easier use for AutoGen.\r
@@ -789,6 +840,7 @@ class DecBuildData(PackageBuildClassObject):
         TAB_DEC_DEFINES_PACKAGE_NAME                : "_PackageName",\r
         TAB_DEC_DEFINES_PACKAGE_GUID                : "_Guid",\r
         TAB_DEC_DEFINES_PACKAGE_VERSION             : "_Version",\r
+        TAB_DEC_DEFINES_PKG_UNI_FILE                : "_PkgUniFile",\r
     }\r
 \r
 \r
@@ -830,6 +882,7 @@ class DecBuildData(PackageBuildClassObject):
         self._PackageName       = None\r
         self._Guid              = None\r
         self._Version           = None\r
+        self._PkgUniFile        = None\r
         self._Protocols         = None\r
         self._Ppis              = None\r
         self._Guids             = None\r
@@ -1063,6 +1116,7 @@ class DecBuildData(PackageBuildClassObject):
                                                                             TokenNumber,\r
                                                                             '',\r
                                                                             {},\r
+                                                                            False,\r
                                                                             None\r
                                                                             )\r
         return Pcds\r
@@ -1914,6 +1968,7 @@ class InfBuildData(ModuleBuildClassObject):
                     '',\r
                     '',\r
                     {},\r
+                    False,\r
                     self.Guids[TokenSpaceGuid]\r
                     )\r
 \r
@@ -1927,7 +1982,7 @@ class InfBuildData(ModuleBuildClassObject):
                 #   "FixedAtBuild", "PatchableInModule", "FeatureFlag", "Dynamic", "DynamicEx"\r
                 #\r
                 PcdType = self._PCD_TYPE_STRING_[Type]\r
-                if Type in [MODEL_PCD_DYNAMIC, MODEL_PCD_DYNAMIC_EX]:\r
+                if Type == MODEL_PCD_DYNAMIC:\r
                     Pcd.Pending = True\r
                     for T in ["FixedAtBuild", "PatchableInModule", "FeatureFlag", "Dynamic", "DynamicEx"]:\r
                         if (PcdCName, TokenSpaceGuid, T) in Package.Pcds:\r
@@ -1994,7 +2049,7 @@ class InfBuildData(ModuleBuildClassObject):
 \r
 ## Database\r
 #\r
-#   This class defined the build databse for all modules, packages and platform.\r
+#   This class defined the build database for all modules, packages and platform.\r
 # It will call corresponding parser for the given file if it cannot find it in\r
 # the database.\r
 #\r