]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTools: Latter full value should overwrite the former field value.
authorZhao, ZhiqiangX <zhiqiangx.zhao@intel.com>
Wed, 12 Sep 2018 09:19:26 +0000 (17:19 +0800)
committerLiming Gao <liming.gao@intel.com>
Tue, 25 Sep 2018 01:43:51 +0000 (09:43 +0800)
For structure Pcd, the latter full assign value in commandLine should
override the former field assign value. For example in commandLine,
build --pcd Token.pcd.field="haha" --pcd Token.pcd=H"{0x01,0x02}",
the former field value "haha" will be ignored and overwrite by the latter
full value "{0x01,0x02}".

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: ZhiqiangX Zhao <zhiqiangx.zhao@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Yonghong Zhu <yonghong.zhu@intel.com>
Cc: Bob Feng <bob.c.feng@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
BaseTools/Source/Python/Workspace/DscBuildData.py
BaseTools/Source/Python/build/BuildReport.py

index 506ec0688f877d79cea1d3c16956ad2186fe1c5c..ac0f0bee47a9058e4fcdcc6e9a838eee6f98236f 100644 (file)
@@ -1067,6 +1067,23 @@ class DscBuildData(PlatformBuildClassObject):
                         PcdItem = BuildData.Pcds[key]\r
                         if (TokenSpaceGuidCName, TokenCName) == (PcdItem.TokenSpaceGuidCName, PcdItem.TokenCName) and FieldName =="":\r
                             PcdItem.DefaultValue = pcdvalue\r
+        #In command line, the latter full assign value in commandLine should override the former field assign value.\r
+        #For example, --pcd Token.pcd.field="" --pcd Token.pcd=H"{}"\r
+        delete_assign = []\r
+        field_assign = {}\r
+        if GlobalData.BuildOptionPcd:\r
+            for pcdTuple in GlobalData.BuildOptionPcd:\r
+                TokenSpaceGuid, Token, Field = pcdTuple[0], pcdTuple[1], pcdTuple[2]\r
+                if Field:\r
+                    if (TokenSpaceGuid, Token) not in field_assign:\r
+                        field_assign[TokenSpaceGuid, Token] = []\r
+                    field_assign[TokenSpaceGuid, Token].append(pcdTuple)\r
+                else:\r
+                    if (TokenSpaceGuid, Token) in field_assign:\r
+                        delete_assign.extend(field_assign[TokenSpaceGuid, Token])\r
+                        field_assign[TokenSpaceGuid, Token] = []\r
+            for item in delete_assign:\r
+                GlobalData.BuildOptionPcd.remove(item)\r
 \r
     @staticmethod\r
     def HandleFlexiblePcd(TokenSpaceGuidCName, TokenCName, PcdValue, PcdDatumType, GuidDict, FieldName=''):\r
index 49bcd9c0608035e16bf29d283f9563d143b7de1d..4fe29f124d842d3371de129f0a173f7b6b3978f8 100644 (file)
@@ -992,12 +992,16 @@ class PcdReport(object):
                 PcdValue = DecDefaultValue\r
                 if DscDefaultValue:\r
                     PcdValue = DscDefaultValue\r
-                Pcd.DefaultValue = PcdValue\r
+                #The DefaultValue of StructurePcd already be the latest, no need to update.\r
+                if not self.IsStructurePcd(Pcd.TokenCName, Pcd.TokenSpaceGuidCName):\r
+                    Pcd.DefaultValue = PcdValue\r
                 if ModulePcdSet is not None:\r
                     if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type) not in ModulePcdSet:\r
                         continue\r
                     InfDefaultValue, PcdValue = ModulePcdSet[Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type]\r
-                    Pcd.DefaultValue = PcdValue\r
+                    #The DefaultValue of StructurePcd already be the latest, no need to update.\r
+                    if not self.IsStructurePcd(Pcd.TokenCName, Pcd.TokenSpaceGuidCName):\r
+                        Pcd.DefaultValue = PcdValue\r
                     if InfDefaultValue:\r
                         try:\r
                             InfDefaultValue = ValueExpressionEx(InfDefaultValue, Pcd.DatumType, self._GuidDict)(True)\r
@@ -1013,7 +1017,9 @@ class PcdReport(object):
                             if pcd[2]:\r
                                 continue\r
                             PcdValue = pcd[3]\r
-                            Pcd.DefaultValue = PcdValue\r
+                            #The DefaultValue of StructurePcd already be the latest, no need to update.\r
+                            if not self.IsStructurePcd(Pcd.TokenCName, Pcd.TokenSpaceGuidCName):\r
+                                Pcd.DefaultValue = PcdValue\r
                             BuildOptionMatch = True\r
                             break\r
 \r
@@ -1060,7 +1066,7 @@ class PcdReport(object):
                         DscMatch = (DscDefaultValue.strip() == PcdValue.strip())\r
 \r
                 IsStructure = False\r
-                if GlobalData.gStructurePcd and (self.Arch in GlobalData.gStructurePcd) and ((Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in GlobalData.gStructurePcd[self.Arch]):\r
+                if self.IsStructurePcd(Pcd.TokenCName, Pcd.TokenSpaceGuidCName):\r
                     IsStructure = True\r
                     if TypeName in ('DYNVPD', 'DEXVPD'):\r
                         SkuInfoList = Pcd.SkuInfoList\r
@@ -1438,6 +1444,12 @@ class PcdReport(object):
             else:\r
                 return value\r
 \r
+    def IsStructurePcd(self, PcdToken, PcdTokenSpaceGuid):\r
+        if GlobalData.gStructurePcd and (self.Arch in GlobalData.gStructurePcd) and ((PcdToken, PcdTokenSpaceGuid) in GlobalData.gStructurePcd[self.Arch]):\r
+            return True\r
+        else:\r
+            return False\r
+\r
 ##\r
 # Reports platform and module Prediction information\r
 #\r