]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
Sync BaseTool trunk (version r2640) into EDKII BaseTools.
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / WorkspaceDatabase.py
index 04e3d14dff7c1cf3b1d494aba3c4a925b2dd7c08..262ec65e6490830efdb8c5cc7fc67121feda974f 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to create a database used by build tool\r
 #\r
-# Copyright (c) 2008 - 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2008 - 2014, Intel Corporation. All rights reserved.<BR>\r
 # 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
@@ -36,6 +36,7 @@ from MetaFileParser import *
 from BuildClassObject import *\r
 from WorkspaceCommon import GetDeclaredPcd\r
 from Common.Misc import AnalyzeDscPcd\r
+import re\r
 \r
 ## Platform build information from DSC file\r
 #\r
@@ -328,6 +329,8 @@ class DscBuildData(PlatformBuildClassObject):
             return False\r
             \r
     def _GetSkuIdentifier(self):\r
+        if self._SkuName:\r
+            return self._SkuName\r
         if self._SkuIdentifier == None:\r
             if self._Header == None:\r
                 self._GetHeaderInfo()\r
@@ -337,16 +340,14 @@ class DscBuildData(PlatformBuildClassObject):
         if self._SkuName == None:\r
             if self._Header == None:\r
                 self._GetHeaderInfo()\r
-            if self._SkuName == None or self._SkuName not in self.SkuIds:\r
+            if (self._SkuName == None or self._SkuName not in self.SkuIds):\r
                 self._SkuName = 'DEFAULT'\r
         return self._SkuName\r
 \r
     ## Override SKUID_IDENTIFIER\r
     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
+        self._SkuName = Value\r
+        self._Pcds = None\r
 \r
     def _GetFdfFile(self):\r
         if self._FlashDefinition == None:\r
@@ -460,7 +461,7 @@ class DscBuildData(PlatformBuildClassObject):
                 if Record[1] in [None, '']:\r
                     EdkLogger.error('build', FORMAT_INVALID, 'No Sku ID name',\r
                                     File=self.MetaFile, Line=Record[-1])\r
-                self._SkuIds[Record[1].upper()] = Record[0]\r
+                self._SkuIds[Record[1]] = Record[0]\r
             if 'DEFAULT' not in self._SkuIds:\r
                 self._SkuIds['DEFAULT'] = '0'\r
             if 'COMMON' not in self._SkuIds:\r
@@ -731,7 +732,6 @@ class DscBuildData(PlatformBuildClassObject):
         RecordList = self._RawData[Type, self._Arch]\r
         PcdValueDict = sdict()\r
         for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList:\r
-            SkuName = SkuName.upper()\r
             if SkuName in (SkuObj.SystemSkuId,'DEFAULT','COMMON'):\r
                 PcdSet.add((PcdCName, TokenSpaceGuid, SkuName,Dummy4))\r
                 PcdDict[Arch, PcdCName, TokenSpaceGuid,SkuName] = Setting\r
@@ -798,7 +798,6 @@ class DscBuildData(PlatformBuildClassObject):
         \r
         AvailableSkuIdSet.update({'DEFAULT':0,'COMMON':0})\r
         for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList:\r
-            SkuName = SkuName.upper()\r
             if SkuName not in AvailableSkuIdSet:\r
                 continue\r
             \r
@@ -816,6 +815,16 @@ class DscBuildData(PlatformBuildClassObject):
             if (PcdCName,TokenSpaceGuid) in Pcds.keys(): \r
                 pcdObject = Pcds[PcdCName,TokenSpaceGuid]\r
                 pcdObject.SkuInfoList[SkuName] = SkuInfo\r
+                if MaxDatumSize.strip():\r
+                    CurrentMaxSize = int(MaxDatumSize.strip(),0)\r
+                else:\r
+                    CurrentMaxSize = 0\r
+                if pcdObject.MaxDatumSize:\r
+                    PcdMaxSize = int(pcdObject.MaxDatumSize,0)\r
+                else:\r
+                    PcdMaxSize = 0\r
+                if CurrentMaxSize > PcdMaxSize:\r
+                    pcdObject.MaxDatumSize = str(CurrentMaxSize)\r
             else:               \r
                 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
                                                     PcdCName,\r
@@ -831,8 +840,8 @@ class DscBuildData(PlatformBuildClassObject):
                                                     )\r
         \r
         for pcd in Pcds.values():\r
-            if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():\r
-                pcdDecObject = self._DecPcds[pcd.TokenCName,pcd.TokenSpaceGuidCName]\r
+            pcdDecObject = self._DecPcds[pcd.TokenCName,pcd.TokenSpaceGuidCName]\r
+            if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():                \r
                 valuefromDec = pcdDecObject.DefaultValue\r
                 SkuInfo = SkuInfoClass('DEFAULT', '0', '', '', '', '', '', valuefromDec)\r
                 pcd.SkuInfoList['DEFAULT'] = SkuInfo\r
@@ -845,17 +854,7 @@ class DscBuildData(PlatformBuildClassObject):
                 if 'DEFAULT' in pcd.SkuInfoList.keys() and SkuObj.SystemSkuId not in pcd.SkuInfoList.keys():\r
                     pcd.SkuInfoList[SkuObj.SystemSkuId] = pcd.SkuInfoList['DEFAULT']\r
                 del(pcd.SkuInfoList['DEFAULT'])\r
-            \r
-            if SkuObj.SkuUsageType == SkuObj.MULTIPLE:\r
-                    if pcd.DatumType == "VOID*": \r
-                        MaxSize = int(pcd.MaxDatumSize,0)\r
-                        for (skuname,skuobj) in pcd.SkuInfoList.items():\r
-                            datalen = len(skuobj.DefaultValue)\r
-                            if datalen>MaxSize:\r
-                                MaxSize = datalen\r
-                        pcd.MaxDatumSize = str(MaxSize)\r
-                    \r
-                \r
+               \r
         return Pcds\r
 \r
     ## Retrieve dynamic HII PCD settings\r
@@ -881,7 +880,6 @@ class DscBuildData(PlatformBuildClassObject):
         \r
         AvailableSkuIdSet.update({'DEFAULT':0,'COMMON':0})\r
         for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList:\r
-            SkuName = SkuName.upper()\r
             if SkuName not in AvailableSkuIdSet:\r
                 continue\r
             PcdSet.add((PcdCName, TokenSpaceGuid, SkuName,Dummy4))\r
@@ -893,6 +891,20 @@ class DscBuildData(PlatformBuildClassObject):
             if Setting == None:\r
                 continue\r
             VariableName, VariableGuid, VariableOffset, DefaultValue = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
+            \r
+            ExceedMax = False\r
+            if VariableOffset.isdigit():\r
+                if int(VariableOffset,10) > 0xFFFF:\r
+                    ExceedMax = True\r
+            elif re.match(r'[\t\s]*0[xX][a-fA-F0-9]+$',VariableOffset):\r
+                if int(VariableOffset,16) > 0xFFFF:\r
+                    ExceedMax = True\r
+            else:\r
+                EdkLogger.error('Build', FORMAT_INVALID, "Invalid syntax or format of the variable offset value is incorrect for %s." % ".".join((TokenSpaceGuid,PcdCName)))\r
+            \r
+            if ExceedMax:\r
+                EdkLogger.error('Build', OPTION_VALUE_INVALID, "The variable offset value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid,PcdCName)))\r
+            \r
             SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName], VariableName, VariableGuid, VariableOffset, DefaultValue)\r
             if (PcdCName,TokenSpaceGuid) in Pcds.keys():  \r
                 pcdObject = Pcds[PcdCName,TokenSpaceGuid]\r
@@ -914,8 +926,12 @@ class DscBuildData(PlatformBuildClassObject):
 \r
         for pcd in Pcds.values():\r
             SkuInfoObj = pcd.SkuInfoList.values()[0]\r
-            if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():\r
-                pcdDecObject = self._DecPcds[pcd.TokenCName,pcd.TokenSpaceGuidCName]\r
+            pcdDecObject = self._DecPcds[pcd.TokenCName,pcd.TokenSpaceGuidCName]\r
+            # Only fix the value while no value provided in DSC file.\r
+            for sku in pcd.SkuInfoList.values():\r
+                if (sku.HiiDefaultValue == "" or sku.HiiDefaultValue==None):\r
+                    sku.HiiDefaultValue = pcdDecObject.DefaultValue\r
+            if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():              \r
                 valuefromDec = pcdDecObject.DefaultValue\r
                 SkuInfo = SkuInfoClass('DEFAULT', '0', SkuInfoObj.VariableName, SkuInfoObj.VariableGuid, SkuInfoObj.VariableOffset, valuefromDec)\r
                 pcd.SkuInfoList['DEFAULT'] = SkuInfo\r
@@ -929,6 +945,24 @@ class DscBuildData(PlatformBuildClassObject):
                 if 'DEFAULT' in pcd.SkuInfoList.keys() and SkuObj.SystemSkuId not in pcd.SkuInfoList.keys():\r
                     pcd.SkuInfoList[SkuObj.SystemSkuId] = pcd.SkuInfoList['DEFAULT']\r
                 del(pcd.SkuInfoList['DEFAULT'])\r
+            \r
+            \r
+            if pcd.MaxDatumSize.strip(): \r
+                MaxSize = int(pcd.MaxDatumSize,0)\r
+            else:\r
+                MaxSize = 0\r
+            if pcdDecObject.DatumType == 'VOID*':\r
+                for (skuname,skuobj) in pcd.SkuInfoList.items():\r
+                    datalen = 0\r
+                    if skuobj.HiiDefaultValue.startswith("L"):\r
+                        datalen = (len(skuobj.HiiDefaultValue)- 3 + 1) * 2\r
+                    elif skuobj.HiiDefaultValue.startswith("{"):\r
+                        datalen = len(skuobj.HiiDefaultValue.split(","))\r
+                    else:\r
+                        datalen = len(skuobj.HiiDefaultValue) -2 + 1 \r
+                    if datalen>MaxSize:\r
+                        MaxSize = datalen\r
+                pcd.MaxDatumSize = str(MaxSize)\r
         return Pcds\r
 \r
     ## Retrieve dynamic VPD PCD settings\r
@@ -954,7 +988,6 @@ class DscBuildData(PlatformBuildClassObject):
         \r
         AvailableSkuIdSet.update({'DEFAULT':0,'COMMON':0})\r
         for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList:\r
-            SkuName = SkuName.upper()\r
             if SkuName not in AvailableSkuIdSet:\r
                 continue\r
 \r
@@ -976,6 +1009,16 @@ class DscBuildData(PlatformBuildClassObject):
             if (PcdCName,TokenSpaceGuid) in Pcds.keys():  \r
                 pcdObject = Pcds[PcdCName,TokenSpaceGuid]\r
                 pcdObject.SkuInfoList[SkuName] = SkuInfo\r
+                if MaxDatumSize.strip():\r
+                    CurrentMaxSize = int(MaxDatumSize.strip(),0)\r
+                else:\r
+                    CurrentMaxSize = 0\r
+                if pcdObject.MaxDatumSize:\r
+                    PcdMaxSize = int(pcdObject.MaxDatumSize,0)\r
+                else:\r
+                    PcdMaxSize = 0\r
+                if CurrentMaxSize > PcdMaxSize:\r
+                    pcdObject.MaxDatumSize = str(CurrentMaxSize)\r
             else:\r
                 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
                                                 PcdCName,\r
@@ -991,8 +1034,8 @@ class DscBuildData(PlatformBuildClassObject):
                                                 )\r
         for pcd in Pcds.values():\r
             SkuInfoObj = pcd.SkuInfoList.values()[0]\r
+            pcdDecObject = self._DecPcds[pcd.TokenCName,pcd.TokenSpaceGuidCName]\r
             if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():\r
-                pcdDecObject = self._DecPcds[pcd.TokenCName,pcd.TokenSpaceGuidCName]\r
                 valuefromDec = pcdDecObject.DefaultValue\r
                 SkuInfo = SkuInfoClass('DEFAULT', '0', '', '', '','',SkuInfoObj.VpdOffset, valuefromDec)\r
                 pcd.SkuInfoList['DEFAULT'] = SkuInfo\r
@@ -1006,14 +1049,6 @@ class DscBuildData(PlatformBuildClassObject):
                     pcd.SkuInfoList[SkuObj.SystemSkuId] = pcd.SkuInfoList['DEFAULT']\r
                 del(pcd.SkuInfoList['DEFAULT'])\r
             \r
-            if SkuObj.SkuUsageType == SkuObj.MULTIPLE:\r
-                    if pcd.MaxDatumSize.strip(): \r
-                        MaxSize = int(pcd.MaxDatumSize,0)\r
-                        for (skuname,skuobj) in pcd.SkuInfoList.items():\r
-                            datalen = len(skuobj.DefaultValue)\r
-                            if datalen>MaxSize:\r
-                                MaxSize = datalen\r
-                        pcd.MaxDatumSize = str(MaxSize)\r
         return Pcds\r
 \r
     ## Add external modules\r
@@ -1520,6 +1555,7 @@ class InfBuildData(ModuleBuildClassObject):
     ## Set all internal used members of InfBuildData to None\r
     def _Clear(self):\r
         self._HeaderComments = None\r
+        self._TailComments = None\r
         self._Header_               = None\r
         self._AutoGenVersion        = None\r
         self._BaseName              = None\r
@@ -1612,7 +1648,13 @@ class InfBuildData(ModuleBuildClassObject):
             for Record in RecordList:\r
                 self._HeaderComments.append(Record[0])\r
         return self._HeaderComments\r
-\r
+    def _GetTailComments(self):\r
+        if not self._TailComments:\r
+            self._TailComments = []\r
+            RecordList = self._RawData[MODEL_META_DATA_TAIL_COMMENT]\r
+            for Record in RecordList:\r
+                self._TailComments.append(Record[0])\r
+        return self._TailComments\r
     ## Retrieve all information in [Defines] section\r
     #\r
     #   (Retriving all [Defines] information in one-shot is just to save time.)\r
@@ -1769,7 +1811,7 @@ class InfBuildData(ModuleBuildClassObject):
                         else:\r
                             Tool = ToolList[0]\r
                         ToolChain = "*_*_*_%s_FLAGS" % Tool\r
-                        ToolChainFamily = 'MSFT'    # Edk.x only support MSFT tool chain\r
+                        ToolChainFamily = '\r
                         #ignore not replaced macros in value\r
                         ValueList = GetSplitList(' ' + Value, '/D')\r
                         Dummy = ValueList[0]\r
@@ -2447,6 +2489,7 @@ class InfBuildData(ModuleBuildClassObject):
     Platform = property(_GetPlatform, _SetPlatform)\r
 \r
     HeaderComments = property(_GetHeaderComments)\r
+    TailComments = property(_GetTailComments)\r
     AutoGenVersion          = property(_GetInfVersion)\r
     BaseName                = property(_GetBaseName)\r
     ModuleType              = property(_GetModuleType)\r