]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/build/BuildReport.py
BaseTools: Pcds in [Components] are not display correct in the report
[mirror_edk2.git] / BaseTools / Source / Python / build / BuildReport.py
index 75e8ec97ab8a74e224aebc4008627099c8c5384b..e06c352330bcf014cf36c0716ce72fc4c36364ba 100644 (file)
@@ -4,7 +4,7 @@
 # This module contains the functionality to generate build report after\r
 # build all target completes successfully.\r
 #\r
 # This module contains the functionality to generate build report after\r
 # build all target completes successfully.\r
 #\r
-# Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2010 - 2018, 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
 # 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
@@ -37,6 +37,7 @@ from Common.InfClassObject import gComponentType2ModuleType
 from Common.BuildToolError import FILE_WRITE_FAILURE\r
 from Common.BuildToolError import CODE_ERROR\r
 from Common.BuildToolError import COMMAND_FAILURE\r
 from Common.BuildToolError import FILE_WRITE_FAILURE\r
 from Common.BuildToolError import CODE_ERROR\r
 from Common.BuildToolError import COMMAND_FAILURE\r
+from Common.BuildToolError import FORMAT_INVALID\r
 from Common.LongFilePathSupport import OpenLongFilePath as open\r
 from Common.MultipleWorkspace import MultipleWorkspace as mws\r
 import Common.GlobalData as GlobalData\r
 from Common.LongFilePathSupport import OpenLongFilePath as open\r
 from Common.MultipleWorkspace import MultipleWorkspace as mws\r
 import Common.GlobalData as GlobalData\r
@@ -45,6 +46,7 @@ from Common.Misc import PathClass
 from Common.String import NormPath\r
 from Common.DataType import *\r
 import collections\r
 from Common.String import NormPath\r
 from Common.DataType import *\r
 import collections\r
+from Common.Expression import *\r
 \r
 ## Pattern to extract contents in EDK DXS files\r
 gDxsDependencyPattern = re.compile(r"DEPENDENCY_START(.+)DEPENDENCY_END", re.DOTALL)\r
 \r
 ## Pattern to extract contents in EDK DXS files\r
 gDxsDependencyPattern = re.compile(r"DEPENDENCY_START(.+)DEPENDENCY_END", re.DOTALL)\r
@@ -720,7 +722,7 @@ def ReadMessage(From, To, ExitFlag):
         # read one line a time\r
         Line = From.readline()\r
         # empty string means "end"\r
         # read one line a time\r
         Line = From.readline()\r
         # empty string means "end"\r
-        if Line != None and Line != "":\r
+        if Line is not None and Line != "":\r
             To(Line.rstrip())\r
         else:\r
             break\r
             To(Line.rstrip())\r
         else:\r
             break\r
@@ -755,6 +757,13 @@ class PcdReport(object):
         else:\r
             self.FdfPcdSet = {}\r
 \r
         else:\r
             self.FdfPcdSet = {}\r
 \r
+        self.DefaultStoreSingle = True\r
+        self.SkuSingle = True\r
+        if GlobalData.gDefaultStores and len(GlobalData.gDefaultStores) > 1:\r
+            self.DefaultStoreSingle = False\r
+        if GlobalData.gSkuids and len(GlobalData.gSkuids) > 1:\r
+            self.SkuSingle = False\r
+\r
         self.ModulePcdOverride = {}\r
         for Pa in Wa.AutoGenObjectList:\r
             self.Arch = Pa.Arch\r
         self.ModulePcdOverride = {}\r
         for Pa in Wa.AutoGenObjectList:\r
             self.Arch = Pa.Arch\r
@@ -849,8 +858,11 @@ class PcdReport(object):
         # Collect PCD DEC default value.\r
         #\r
         self.DecPcdDefault = {}\r
         # Collect PCD DEC default value.\r
         #\r
         self.DecPcdDefault = {}\r
+        self._GuidDict = {}\r
         for Pa in Wa.AutoGenObjectList:\r
             for Package in Pa.PackageList:\r
         for Pa in Wa.AutoGenObjectList:\r
             for Package in Pa.PackageList:\r
+                Guids = Package.Guids\r
+                self._GuidDict.update(Guids)\r
                 for (TokenCName, TokenSpaceGuidCName, DecType) in Package.Pcds:\r
                     DecDefaultValue = Package.Pcds[TokenCName, TokenSpaceGuidCName, DecType].DefaultValue\r
                     self.DecPcdDefault.setdefault((TokenCName, TokenSpaceGuidCName, DecType), DecDefaultValue)\r
                 for (TokenCName, TokenSpaceGuidCName, DecType) in Package.Pcds:\r
                     DecDefaultValue = Package.Pcds[TokenCName, TokenSpaceGuidCName, DecType].DefaultValue\r
                     self.DecPcdDefault.setdefault((TokenCName, TokenSpaceGuidCName, DecType), DecDefaultValue)\r
@@ -860,15 +872,16 @@ class PcdReport(object):
         self.DscPcdDefault = {}\r
         for Pa in Wa.AutoGenObjectList:\r
             for (TokenCName, TokenSpaceGuidCName) in Pa.Platform.Pcds:\r
         self.DscPcdDefault = {}\r
         for Pa in Wa.AutoGenObjectList:\r
             for (TokenCName, TokenSpaceGuidCName) in Pa.Platform.Pcds:\r
-                DscDefaultValue = Pa.Platform.Pcds[(TokenCName, TokenSpaceGuidCName)].DefaultValue\r
+                DscDefaultValue = Pa.Platform.Pcds[(TokenCName, TokenSpaceGuidCName)].DscDefaultValue\r
                 if DscDefaultValue:\r
                     self.DscPcdDefault[(TokenCName, TokenSpaceGuidCName)] = DscDefaultValue\r
 \r
     def GenerateReport(self, File, ModulePcdSet):\r
                 if DscDefaultValue:\r
                     self.DscPcdDefault[(TokenCName, TokenSpaceGuidCName)] = DscDefaultValue\r
 \r
     def GenerateReport(self, File, ModulePcdSet):\r
-        if self.ConditionalPcds:\r
-            self.GenerateReportDetail(File, ModulePcdSet, 1)\r
-        if self.UnusedPcds:\r
-            self.GenerateReportDetail(File, ModulePcdSet, 2)\r
+        if not ModulePcdSet:\r
+            if self.ConditionalPcds:\r
+                self.GenerateReportDetail(File, ModulePcdSet, 1)\r
+            if self.UnusedPcds:\r
+                self.GenerateReportDetail(File, ModulePcdSet, 2)\r
         self.GenerateReportDetail(File, ModulePcdSet)\r
 \r
     ##\r
         self.GenerateReportDetail(File, ModulePcdSet)\r
 \r
     ##\r
@@ -892,7 +905,7 @@ class PcdReport(object):
         elif ReportSubType == 2:\r
             PcdDict = self.UnusedPcds\r
 \r
         elif ReportSubType == 2:\r
             PcdDict = self.UnusedPcds\r
 \r
-        if ModulePcdSet == None:\r
+        if not ModulePcdSet:\r
             FileWrite(File, gSectionStart)\r
             if ReportSubType == 1:\r
                 FileWrite(File, "Conditional Directives used by the build system")\r
             FileWrite(File, gSectionStart)\r
             if ReportSubType == 1:\r
                 FileWrite(File, "Conditional Directives used by the build system")\r
@@ -941,17 +954,24 @@ class PcdReport(object):
                     #\r
                     DecDefaultValue = self.DecPcdDefault.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName, DecType))\r
                     DscDefaultValue = self.DscPcdDefault.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName))\r
                     #\r
                     DecDefaultValue = self.DecPcdDefault.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName, DecType))\r
                     DscDefaultValue = self.DscPcdDefault.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName))\r
-                    DscDefaultValBak= DscDefaultValue\r
+                    DscDefaultValBak = DscDefaultValue\r
                     DscDefaultValue = self.FdfPcdSet.get((Pcd.TokenCName, Key), DscDefaultValue)\r
                     DscDefaultValue = self.FdfPcdSet.get((Pcd.TokenCName, Key), DscDefaultValue)\r
+                    if DscDefaultValue != DscDefaultValBak:\r
+                        try:\r
+                            DscDefaultValue = ValueExpressionEx(DscDefaultValue, Pcd.DatumType, self._GuidDict)(True)\r
+                        except BadExpression, DscDefaultValue:\r
+                            EdkLogger.error('BuildReport', FORMAT_INVALID, "PCD Value: %s, Type: %s" %(DscDefaultValue, Pcd.DatumType))\r
+\r
                     InfDefaultValue = None\r
                     \r
                     PcdValue = DecDefaultValue\r
                     if DscDefaultValue:\r
                         PcdValue = DscDefaultValue\r
                     InfDefaultValue = None\r
                     \r
                     PcdValue = DecDefaultValue\r
                     if DscDefaultValue:\r
                         PcdValue = DscDefaultValue\r
-                    if ModulePcdSet != None:\r
+                    if ModulePcdSet is not None:\r
                         if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type) not in ModulePcdSet:\r
                             continue\r
                         InfDefault, PcdValue = ModulePcdSet[Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type]\r
                         if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type) not in ModulePcdSet:\r
                             continue\r
                         InfDefault, PcdValue = ModulePcdSet[Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type]\r
+                        Pcd.DefaultValue = PcdValue\r
                         if InfDefault == "":\r
                             InfDefault = None\r
 \r
                         if InfDefault == "":\r
                             InfDefault = None\r
 \r
@@ -959,12 +979,15 @@ class PcdReport(object):
                     if GlobalData.BuildOptionPcd:\r
                         for pcd in GlobalData.BuildOptionPcd:\r
                             if (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) == (pcd[0], pcd[1]):\r
                     if GlobalData.BuildOptionPcd:\r
                         for pcd in GlobalData.BuildOptionPcd:\r
                             if (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) == (pcd[0], pcd[1]):\r
-                                PcdValue = pcd[2]\r
+                                if pcd[2]:\r
+                                    continue\r
+                                PcdValue = pcd[3]\r
+                                Pcd.DefaultValue = PcdValue\r
                                 BuildOptionMatch = True\r
                                 break\r
 \r
                     if First:\r
                                 BuildOptionMatch = True\r
                                 break\r
 \r
                     if First:\r
-                        if ModulePcdSet == None:\r
+                        if ModulePcdSet is None:\r
                             FileWrite(File, "")\r
                         FileWrite(File, Key)\r
                         First = False\r
                             FileWrite(File, "")\r
                         FileWrite(File, Key)\r
                         First = False\r
@@ -972,35 +995,35 @@ class PcdReport(object):
 \r
                     if Pcd.DatumType in ('UINT8', 'UINT16', 'UINT32', 'UINT64'):\r
                         PcdValueNumber = int(PcdValue.strip(), 0)\r
 \r
                     if Pcd.DatumType in ('UINT8', 'UINT16', 'UINT32', 'UINT64'):\r
                         PcdValueNumber = int(PcdValue.strip(), 0)\r
-                        if DecDefaultValue == None:\r
+                        if DecDefaultValue is None:\r
                             DecMatch = True\r
                         else:\r
                             DecDefaultValueNumber = int(DecDefaultValue.strip(), 0)\r
                             DecMatch = (DecDefaultValueNumber == PcdValueNumber)\r
 \r
                             DecMatch = True\r
                         else:\r
                             DecDefaultValueNumber = int(DecDefaultValue.strip(), 0)\r
                             DecMatch = (DecDefaultValueNumber == PcdValueNumber)\r
 \r
-                        if InfDefaultValue == None:\r
+                        if InfDefaultValue is None:\r
                             InfMatch = True\r
                         else:\r
                             InfDefaultValueNumber = int(InfDefaultValue.strip(), 0)\r
                             InfMatch = (InfDefaultValueNumber == PcdValueNumber)\r
 \r
                             InfMatch = True\r
                         else:\r
                             InfDefaultValueNumber = int(InfDefaultValue.strip(), 0)\r
                             InfMatch = (InfDefaultValueNumber == PcdValueNumber)\r
 \r
-                        if DscDefaultValue == None:\r
+                        if DscDefaultValue is None:\r
                             DscMatch = True\r
                         else:\r
                             DscDefaultValueNumber = int(DscDefaultValue.strip(), 0)\r
                             DscMatch = (DscDefaultValueNumber == PcdValueNumber)\r
                     else:\r
                             DscMatch = True\r
                         else:\r
                             DscDefaultValueNumber = int(DscDefaultValue.strip(), 0)\r
                             DscMatch = (DscDefaultValueNumber == PcdValueNumber)\r
                     else:\r
-                        if DecDefaultValue == None:\r
+                        if DecDefaultValue is None:\r
                             DecMatch = True\r
                         else:\r
                             DecMatch = (DecDefaultValue.strip() == PcdValue.strip())\r
 \r
                             DecMatch = True\r
                         else:\r
                             DecMatch = (DecDefaultValue.strip() == PcdValue.strip())\r
 \r
-                        if InfDefaultValue == None:\r
+                        if InfDefaultValue is None:\r
                             InfMatch = True\r
                         else:\r
                             InfMatch = (InfDefaultValue.strip() == PcdValue.strip())\r
 \r
                             InfMatch = True\r
                         else:\r
                             InfMatch = (InfDefaultValue.strip() == PcdValue.strip())\r
 \r
-                        if DscDefaultValue == None:\r
+                        if DscDefaultValue is None:\r
                             DscMatch = True\r
                         else:\r
                             DscMatch = (DscDefaultValue.strip() == PcdValue.strip())\r
                             DscMatch = True\r
                         else:\r
                             DscMatch = (DscDefaultValue.strip() == PcdValue.strip())\r
@@ -1014,26 +1037,59 @@ class PcdReport(object):
                         Pcd.DatumType = Pcd.StructName\r
                         if TypeName in ('DYNVPD', 'DEXVPD'):\r
                             Pcd.SkuInfoList = SkuInfoList\r
                         Pcd.DatumType = Pcd.StructName\r
                         if TypeName in ('DYNVPD', 'DEXVPD'):\r
                             Pcd.SkuInfoList = SkuInfoList\r
-                        if Pcd.SkuOverrideValues:\r
-                            DscMatch = True\r
+                        if Pcd.PcdFieldValueFromComm:\r
+                            BuildOptionMatch = True\r
                             DecMatch = False\r
                             DecMatch = False\r
+                        elif Pcd.SkuOverrideValues:\r
+                            DscOverride = False\r
+                            if not Pcd.SkuInfoList:\r
+                                OverrideValues = Pcd.SkuOverrideValues\r
+                                if OverrideValues:\r
+                                    Keys = OverrideValues.keys()\r
+                                    Data = OverrideValues[Keys[0]]\r
+                                    Struct = Data.values()[0]\r
+                                    DscOverride = self.ParseStruct(Struct)\r
+                            else:\r
+                                SkuList = sorted(Pcd.SkuInfoList.keys())\r
+                                for Sku in SkuList:\r
+                                    SkuInfo = Pcd.SkuInfoList[Sku]\r
+                                    if TypeName in ('DYNHII', 'DEXHII'):\r
+                                        if SkuInfo.DefaultStoreDict:\r
+                                            DefaultStoreList = sorted(SkuInfo.DefaultStoreDict.keys())\r
+                                            for DefaultStore in DefaultStoreList:\r
+                                                OverrideValues = Pcd.SkuOverrideValues[Sku]\r
+                                                DscOverride = self.ParseStruct(OverrideValues[DefaultStore])\r
+                                                if DscOverride:\r
+                                                    break\r
+                                    else:\r
+                                        OverrideValues = Pcd.SkuOverrideValues[Sku]\r
+                                        if OverrideValues:\r
+                                            Keys = OverrideValues.keys()\r
+                                            OverrideFieldStruct = self.OverrideFieldValue(Pcd, OverrideValues[Keys[0]])\r
+                                            DscOverride = self.ParseStruct(OverrideFieldStruct)\r
+                                    if DscOverride:\r
+                                        break\r
+                            if DscOverride:\r
+                                DscMatch = True\r
+                                DecMatch = False\r
+\r
                     #\r
                     # Report PCD item according to their override relationship\r
                     #\r
                     if DecMatch and InfMatch:\r
                     #\r
                     # Report PCD item according to their override relationship\r
                     #\r
                     if DecMatch and InfMatch:\r
-                        self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '  ')\r
+                        self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '  ')\r
                     elif BuildOptionMatch:\r
                     elif BuildOptionMatch:\r
-                        self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*B')\r
+                        self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*B')\r
                     else:\r
                         if DscMatch:\r
                             if (Pcd.TokenCName, Key) in self.FdfPcdSet:\r
                     else:\r
                         if DscMatch:\r
                             if (Pcd.TokenCName, Key) in self.FdfPcdSet:\r
-                                self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*F')\r
+                                self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*F')\r
                             else:\r
                             else:\r
-                                self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*P')\r
+                                self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*P')\r
                         else:\r
                         else:\r
-                            self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*M')\r
+                            self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*M')\r
 \r
 \r
-                    if ModulePcdSet == None:\r
+                    if ModulePcdSet is None:\r
                         if IsStructure:\r
                             continue\r
                         if not TypeName in ('PATCH', 'FLAG', 'FIXED'):\r
                         if IsStructure:\r
                             continue\r
                         if not TypeName in ('PATCH', 'FLAG', 'FIXED'):\r
@@ -1057,15 +1113,23 @@ class PcdReport(object):
                                 else:\r
                                     FileWrite(File, ' *M %-*s = %s' % (self.MaxLen + 19, ModulePath, ModuleDefault.strip()))\r
 \r
                                 else:\r
                                     FileWrite(File, ' *M %-*s = %s' % (self.MaxLen + 19, ModulePath, ModuleDefault.strip()))\r
 \r
-        if ModulePcdSet == None:\r
+        if ModulePcdSet is None:\r
             FileWrite(File, gSectionEnd)\r
         else:\r
             if not ReportSubType and ModulePcdSet:\r
                 FileWrite(File, gSubSectionEnd)\r
 \r
             FileWrite(File, gSectionEnd)\r
         else:\r
             if not ReportSubType and ModulePcdSet:\r
                 FileWrite(File, gSubSectionEnd)\r
 \r
+    def ParseStruct(self, struct):\r
+        HasDscOverride = False\r
+        if struct:\r
+            for _, Values in struct.items():\r
+                if Values[1] and Values[1].endswith('.dsc'):\r
+                    HasDscOverride = True\r
+                    break\r
+        return HasDscOverride\r
 \r
     def PrintPcdDefault(self, File, Pcd, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue):\r
 \r
     def PrintPcdDefault(self, File, Pcd, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue):\r
-        if not DscMatch and DscDefaultValue != None:\r
+        if not DscMatch and DscDefaultValue is not None:\r
             Value = DscDefaultValue.strip()\r
             IsByteArray, ArrayList = ByteArrayForamt(Value)\r
             if IsByteArray:\r
             Value = DscDefaultValue.strip()\r
             IsByteArray, ArrayList = ByteArrayForamt(Value)\r
             if IsByteArray:\r
@@ -1074,7 +1138,7 @@ class PcdReport(object):
                     FileWrite(File, '%s' % (Array))\r
             else:\r
                 FileWrite(File, '    %*s = %s' % (self.MaxLen + 19, 'DSC DEFAULT', Value))\r
                     FileWrite(File, '%s' % (Array))\r
             else:\r
                 FileWrite(File, '    %*s = %s' % (self.MaxLen + 19, 'DSC DEFAULT', Value))\r
-        if not InfMatch and InfDefaultValue != None:\r
+        if not InfMatch and InfDefaultValue is not None:\r
             Value = InfDefaultValue.strip()\r
             IsByteArray, ArrayList = ByteArrayForamt(Value)\r
             if IsByteArray:\r
             Value = InfDefaultValue.strip()\r
             IsByteArray, ArrayList = ByteArrayForamt(Value)\r
             if IsByteArray:\r
@@ -1084,7 +1148,7 @@ class PcdReport(object):
             else:\r
                 FileWrite(File, '    %*s = %s' % (self.MaxLen + 19, 'INF DEFAULT', Value))\r
 \r
             else:\r
                 FileWrite(File, '    %*s = %s' % (self.MaxLen + 19, 'INF DEFAULT', Value))\r
 \r
-        if not DecMatch and DecDefaultValue != None:\r
+        if not DecMatch and DecDefaultValue is not None:\r
             Value = DecDefaultValue.strip()\r
             IsByteArray, ArrayList = ByteArrayForamt(Value)\r
             if IsByteArray:\r
             Value = DecDefaultValue.strip()\r
             IsByteArray, ArrayList = ByteArrayForamt(Value)\r
             if IsByteArray:\r
@@ -1095,6 +1159,8 @@ class PcdReport(object):
                 FileWrite(File, '    %*s = %s' % (self.MaxLen + 19, 'DEC DEFAULT', Value))\r
             if IsStructure:\r
                 self.PrintStructureInfo(File, Pcd.DefaultValues)\r
                 FileWrite(File, '    %*s = %s' % (self.MaxLen + 19, 'DEC DEFAULT', Value))\r
             if IsStructure:\r
                 self.PrintStructureInfo(File, Pcd.DefaultValues)\r
+        if DecMatch and IsStructure:\r
+            self.PrintStructureInfo(File, Pcd.DefaultValues)\r
 \r
     def PrintPcdValue(self, File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, Flag = '  '):\r
         if not Pcd.SkuInfoList:\r
 \r
     def PrintPcdValue(self, File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, Flag = '  '):\r
         if not Pcd.SkuInfoList:\r
@@ -1112,13 +1178,15 @@ class PcdReport(object):
                     Keys = OverrideValues.keys()\r
                     Data = OverrideValues[Keys[0]]\r
                     Struct = Data.values()[0]\r
                     Keys = OverrideValues.keys()\r
                     Data = OverrideValues[Keys[0]]\r
                     Struct = Data.values()[0]\r
-                    self.PrintStructureInfo(File, Struct)\r
+                    OverrideFieldStruct = self.OverrideFieldValue(Pcd, Struct)\r
+                    self.PrintStructureInfo(File, OverrideFieldStruct)\r
             self.PrintPcdDefault(File, Pcd, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue)\r
         else:\r
             FirstPrint = True\r
             SkuList = sorted(Pcd.SkuInfoList.keys())\r
             for Sku in SkuList:\r
                 SkuInfo = Pcd.SkuInfoList[Sku]\r
             self.PrintPcdDefault(File, Pcd, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue)\r
         else:\r
             FirstPrint = True\r
             SkuList = sorted(Pcd.SkuInfoList.keys())\r
             for Sku in SkuList:\r
                 SkuInfo = Pcd.SkuInfoList[Sku]\r
+                SkuIdName = SkuInfo.SkuIdName\r
                 if TypeName in ('DYNHII', 'DEXHII'):\r
                     if SkuInfo.DefaultStoreDict:\r
                         DefaultStoreList = sorted(SkuInfo.DefaultStoreDict.keys())\r
                 if TypeName in ('DYNHII', 'DEXHII'):\r
                     if SkuInfo.DefaultStoreDict:\r
                         DefaultStoreList = sorted(SkuInfo.DefaultStoreDict.keys())\r
@@ -1128,87 +1196,109 @@ class PcdReport(object):
                             if FirstPrint:\r
                                 FirstPrint = False\r
                                 if IsByteArray:\r
                             if FirstPrint:\r
                                 FirstPrint = False\r
                                 if IsByteArray:\r
-                                    FileWrite(File, ' %-*s   : %6s %10s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', '(' + DefaultStore + ')', '{'))\r
+                                    if self.DefaultStoreSingle and self.SkuSingle:\r
+                                        FileWrite(File, ' %-*s   : %6s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '{'))\r
+                                    elif self.DefaultStoreSingle and not self.SkuSingle:\r
+                                        FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + SkuIdName + ')', '{'))\r
+                                    elif not self.DefaultStoreSingle and self.SkuSingle:\r
+                                        FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + DefaultStore + ')', '{'))\r
+                                    else:\r
+                                        FileWrite(File, ' %-*s   : %6s %10s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + SkuIdName + ')', '(' + DefaultStore + ')', '{'))\r
                                     for Array in ArrayList:\r
                                         FileWrite(File, '%s' % (Array))\r
                                 else:\r
                                     for Array in ArrayList:\r
                                         FileWrite(File, '%s' % (Array))\r
                                 else:\r
-                                    FileWrite(File, ' %-*s   : %6s %10s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', '(' + DefaultStore + ')', Value))\r
+                                    if self.DefaultStoreSingle and self.SkuSingle:\r
+                                        FileWrite(File, ' %-*s   : %6s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', Value))\r
+                                    elif self.DefaultStoreSingle and not self.SkuSingle:\r
+                                        FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + SkuIdName + ')', Value))\r
+                                    elif not self.DefaultStoreSingle and self.SkuSingle:\r
+                                        FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + DefaultStore + ')', Value))\r
+                                    else:\r
+                                        FileWrite(File, ' %-*s   : %6s %10s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + SkuIdName + ')', '(' + DefaultStore + ')', Value))\r
                             else:\r
                                 if IsByteArray:\r
                             else:\r
                                 if IsByteArray:\r
-                                    FileWrite(File, ' %-*s   : %6s %10s %10s %10s = %s' % (self.MaxLen, ' ', TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', '(' + DefaultStore + ')', '{'))\r
+                                    if self.DefaultStoreSingle and self.SkuSingle:\r
+                                        FileWrite(File, ' %-*s   : %6s %10s = %s' % (self.MaxLen, ' ', TypeName, '(' + Pcd.DatumType + ')', '{'))\r
+                                    elif self.DefaultStoreSingle and not self.SkuSingle:\r
+                                        FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, ' ', TypeName, '(' + Pcd.DatumType + ')', '(' + SkuIdName + ')', '{'))\r
+                                    elif not self.DefaultStoreSingle and self.SkuSingle:\r
+                                        FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, ' ', TypeName, '(' + Pcd.DatumType + ')', '(' + DefaultStore + ')', '{'))\r
+                                    else:\r
+                                        FileWrite(File, ' %-*s   : %6s %10s %10s %10s = %s' % (self.MaxLen, ' ', TypeName, '(' + Pcd.DatumType + ')', '(' + SkuIdName + ')', '(' + DefaultStore + ')', '{'))\r
                                     for Array in ArrayList:\r
                                         FileWrite(File, '%s' % (Array))\r
                                 else:\r
                                     for Array in ArrayList:\r
                                         FileWrite(File, '%s' % (Array))\r
                                 else:\r
-                                    FileWrite(File, ' %-*s   : %6s %10s %10s %10s = %s' % (self.MaxLen, ' ', TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', '(' + DefaultStore + ')', Value))\r
+                                    if self.DefaultStoreSingle and self.SkuSingle:\r
+                                        FileWrite(File, ' %-*s   : %6s %10s = %s' % (self.MaxLen, ' ', TypeName, '(' + Pcd.DatumType + ')',  Value))\r
+                                    elif self.DefaultStoreSingle and not self.SkuSingle:\r
+                                        FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, ' ', TypeName, '(' + Pcd.DatumType + ')', '(' + SkuIdName + ')', Value))\r
+                                    elif not self.DefaultStoreSingle and self.SkuSingle:\r
+                                        FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, ' ', TypeName, '(' + Pcd.DatumType + ')', '(' + DefaultStore + ')', Value))\r
+                                    else:\r
+                                        FileWrite(File, ' %-*s   : %6s %10s %10s %10s = %s' % (self.MaxLen, ' ', TypeName, '(' + Pcd.DatumType + ')', '(' + SkuIdName + ')', '(' + DefaultStore + ')', Value))\r
                             FileWrite(File, '%*s: %s: %s' % (self.MaxLen + 4, SkuInfo.VariableGuid, SkuInfo.VariableName, SkuInfo.VariableOffset))\r
                             if IsStructure:\r
                                 OverrideValues = Pcd.SkuOverrideValues[Sku]\r
                             FileWrite(File, '%*s: %s: %s' % (self.MaxLen + 4, SkuInfo.VariableGuid, SkuInfo.VariableName, SkuInfo.VariableOffset))\r
                             if IsStructure:\r
                                 OverrideValues = Pcd.SkuOverrideValues[Sku]\r
-                                Struct = OverrideValues[DefaultStore]\r
-                                self.PrintStructureInfo(File, Struct)\r
+                                OverrideFieldStruct = self.OverrideFieldValue(Pcd, OverrideValues[DefaultStore])\r
+                                self.PrintStructureInfo(File, OverrideFieldStruct)\r
                             self.PrintPcdDefault(File, Pcd, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue)\r
                             self.PrintPcdDefault(File, Pcd, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue)\r
-                elif TypeName in ('DYNVPD', 'DEXVPD'):\r
-                    Value = SkuInfo.DefaultValue\r
-                    IsByteArray, ArrayList = ByteArrayForamt(Value)\r
-                    if FirstPrint:\r
-                        FirstPrint = False\r
-                        if IsByteArray:\r
-                            FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', "{"))\r
-                            for Array in ArrayList:\r
-                                FileWrite(File, '%s' % (Array))\r
-                        else:\r
-                            FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', Value))\r
-                    else:\r
-                        if IsByteArray:\r
-                            FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, ' ' , TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', "{"))\r
-                            for Array in ArrayList:\r
-                                FileWrite(File, '%s' % (Array))\r
-                        else:\r
-                            FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, ' ' , TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', Value))\r
-                    FileWrite(File, '%*s' % (self.MaxLen + 4, SkuInfo.VpdOffset))\r
-                    if IsStructure:\r
-                        OverrideValues = Pcd.SkuOverrideValues[Sku]\r
-                        if OverrideValues:\r
-                            Keys = OverrideValues.keys()\r
-                            Struct = OverrideValues[Keys[0]]\r
-                            self.PrintStructureInfo(File, Struct)\r
-                    self.PrintPcdDefault(File, Pcd, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue)\r
                 else:\r
                     Value = SkuInfo.DefaultValue\r
                     IsByteArray, ArrayList = ByteArrayForamt(Value)\r
                     if FirstPrint:\r
                         FirstPrint = False\r
                         if IsByteArray:\r
                 else:\r
                     Value = SkuInfo.DefaultValue\r
                     IsByteArray, ArrayList = ByteArrayForamt(Value)\r
                     if FirstPrint:\r
                         FirstPrint = False\r
                         if IsByteArray:\r
-                            FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', '{'))\r
+                            if self.SkuSingle:\r
+                                FileWrite(File, ' %-*s   : %6s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', "{"))\r
+                            else:\r
+                                FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + SkuIdName + ')', "{"))\r
                             for Array in ArrayList:\r
                                 FileWrite(File, '%s' % (Array))\r
                         else:\r
                             for Array in ArrayList:\r
                                 FileWrite(File, '%s' % (Array))\r
                         else:\r
-                            FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', Value))\r
+                            if self.SkuSingle:\r
+                                FileWrite(File, ' %-*s   : %6s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', Value))\r
+                            else:\r
+                                FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '(' + SkuIdName + ')', Value))\r
                     else:\r
                         if IsByteArray:\r
                     else:\r
                         if IsByteArray:\r
-                            FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, ' ', TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', '{'))\r
+                            if self.SkuSingle:\r
+                                FileWrite(File, ' %-*s   : %6s %10s = %s' % (self.MaxLen, ' ' , TypeName, '(' + Pcd.DatumType + ')', "{"))\r
+                            else:\r
+                                FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, ' ' , TypeName, '(' + Pcd.DatumType + ')', '(' + SkuIdName + ')', "{"))\r
                             for Array in ArrayList:\r
                                 FileWrite(File, '%s' % (Array))\r
                         else:\r
                             for Array in ArrayList:\r
                                 FileWrite(File, '%s' % (Array))\r
                         else:\r
-                            FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, ' ', TypeName, '(' + Pcd.DatumType + ')', '(' + SkuInfo.SkuIdName + ')', Value))\r
+                            if self.SkuSingle:\r
+                                FileWrite(File, ' %-*s   : %6s %10s = %s' % (self.MaxLen, ' ' , TypeName, '(' + Pcd.DatumType + ')', Value))\r
+                            else:\r
+                                FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, ' ' , TypeName, '(' + Pcd.DatumType + ')', '(' + SkuIdName + ')', Value))\r
+                    if TypeName in ('DYNVPD', 'DEXVPD'):\r
+                        FileWrite(File, '%*s' % (self.MaxLen + 4, SkuInfo.VpdOffset))\r
                     if IsStructure:\r
                         OverrideValues = Pcd.SkuOverrideValues[Sku]\r
                         if OverrideValues:\r
                             Keys = OverrideValues.keys()\r
                     if IsStructure:\r
                         OverrideValues = Pcd.SkuOverrideValues[Sku]\r
                         if OverrideValues:\r
                             Keys = OverrideValues.keys()\r
-                            Struct = OverrideValues[Keys[0]]\r
-                            self.PrintStructureInfo(File, Struct)\r
+                            OverrideFieldStruct = self.OverrideFieldValue(Pcd, OverrideValues[Keys[0]])\r
+                            self.PrintStructureInfo(File, OverrideFieldStruct)\r
                     self.PrintPcdDefault(File, Pcd, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue)\r
 \r
                     self.PrintPcdDefault(File, Pcd, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue)\r
 \r
+    def OverrideFieldValue(self, Pcd, OverrideStruct):\r
+        OverrideFieldStruct = collections.OrderedDict()\r
+        if OverrideStruct:\r
+            for Key, Values in OverrideStruct.items():\r
+                if Values[1] and Values[1].endswith('.dsc'):\r
+                    OverrideFieldStruct[Key] = Values\r
+        if Pcd.PcdFieldValueFromComm:\r
+            for Key, Values in Pcd.PcdFieldValueFromComm.items():\r
+                OverrideFieldStruct[Key] = Values\r
+        return OverrideFieldStruct\r
+\r
     def PrintStructureInfo(self, File, Struct):\r
     def PrintStructureInfo(self, File, Struct):\r
-        NewInfo = collections.OrderedDict()\r
         for Key, Value in Struct.items():\r
         for Key, Value in Struct.items():\r
-            if Key not in NewInfo:\r
-                NewInfo[Key] = Value[0]\r
+            if Value[1] and 'build command options' in Value[1]:\r
+                FileWrite(File, '    *B  %-*s = %s' % (self.MaxLen + 4, '.' + Key, Value[0]))\r
             else:\r
             else:\r
-                del NewInfo[Key]\r
-                NewInfo[Key] = Value[0]\r
-        if NewInfo:\r
-            for item in NewInfo:\r
-                FileWrite(File, '        %-*s = %s' % (self.MaxLen + 4, '.' + item, NewInfo[item]))\r
+                FileWrite(File, '        %-*s = %s' % (self.MaxLen + 4, '.' + Key, Value[0]))\r
 \r
     def StrtoHex(self, value):\r
         try:\r
 \r
     def StrtoHex(self, value):\r
         try:\r
@@ -1591,6 +1681,7 @@ class FdRegionReport(object):
         self.FvInfo = {}\r
         self._GuidsDb = {}\r
         self._FvDir = Wa.FvDir\r
         self.FvInfo = {}\r
         self._GuidsDb = {}\r
         self._FvDir = Wa.FvDir\r
+        self._WorkspaceDir = Wa.WorkspaceDir\r
 \r
         #\r
         # If the input FdRegion is not a firmware volume,\r
 \r
         #\r
         # If the input FdRegion is not a firmware volume,\r
@@ -1694,7 +1785,15 @@ class FdRegionReport(object):
             FvTotalSize = 0\r
             FvTakenSize = 0\r
             FvFreeSize  = 0\r
             FvTotalSize = 0\r
             FvTakenSize = 0\r
             FvFreeSize  = 0\r
-            FvReportFileName = os.path.join(self._FvDir, FvName + ".Fv.txt")\r
+            if FvName.upper().endswith('.FV'):\r
+                FileExt = FvName + ".txt"\r
+            else:\r
+                FileExt = FvName + ".Fv.txt"\r
+\r
+            if not os.path.isfile(FileExt):\r
+                FvReportFileName = mws.join(self._WorkspaceDir, FileExt)\r
+                if not os.path.isfile(FvReportFileName):\r
+                    FvReportFileName = os.path.join(self._FvDir, FileExt)\r
             try:\r
                 #\r
                 # Collect size info in the firmware volume.\r
             try:\r
                 #\r
                 # Collect size info in the firmware volume.\r
@@ -1874,7 +1973,7 @@ class PlatformReport(object):
             self.PcdReport = PcdReport(Wa)\r
 \r
         self.FdReportList = []\r
             self.PcdReport = PcdReport(Wa)\r
 \r
         self.FdReportList = []\r
-        if "FLASH" in ReportType and Wa.FdfProfile and MaList == None:\r
+        if "FLASH" in ReportType and Wa.FdfProfile and MaList is None:\r
             for Fd in Wa.FdfProfile.FdDict:\r
                 self.FdReportList.append(FdReport(Wa.FdfProfile.FdDict[Fd], Wa))\r
 \r
             for Fd in Wa.FdfProfile.FdDict:\r
                 self.FdReportList.append(FdReport(Wa.FdfProfile.FdDict[Fd], Wa))\r
 \r
@@ -1887,7 +1986,7 @@ class PlatformReport(object):
             self.DepexParser = DepexParser(Wa)\r
             \r
         self.ModuleReportList = []\r
             self.DepexParser = DepexParser(Wa)\r
             \r
         self.ModuleReportList = []\r
-        if MaList != None:\r
+        if MaList is not None:\r
             self._IsModuleBuild = True\r
             for Ma in MaList:\r
                 self.ModuleReportList.append(ModuleReport(Ma, ReportType))\r
             self._IsModuleBuild = True\r
             for Ma in MaList:\r
                 self.ModuleReportList.append(ModuleReport(Ma, ReportType))\r
@@ -1897,13 +1996,13 @@ class PlatformReport(object):
                 ModuleAutoGenList = []\r
                 for ModuleKey in Pa.Platform.Modules:\r
                     ModuleAutoGenList.append(Pa.Platform.Modules[ModuleKey].M)\r
                 ModuleAutoGenList = []\r
                 for ModuleKey in Pa.Platform.Modules:\r
                     ModuleAutoGenList.append(Pa.Platform.Modules[ModuleKey].M)\r
-                if GlobalData.gFdfParser != None:\r
+                if GlobalData.gFdfParser is not None:\r
                     if Pa.Arch in GlobalData.gFdfParser.Profile.InfDict:\r
                         INFList = GlobalData.gFdfParser.Profile.InfDict[Pa.Arch]\r
                         for InfName in INFList:\r
                             InfClass = PathClass(NormPath(InfName), Wa.WorkspaceDir, Pa.Arch)\r
                             Ma = ModuleAutoGen(Wa, InfClass, Pa.BuildTarget, Pa.ToolChain, Pa.Arch, Wa.MetaFile)\r
                     if Pa.Arch in GlobalData.gFdfParser.Profile.InfDict:\r
                         INFList = GlobalData.gFdfParser.Profile.InfDict[Pa.Arch]\r
                         for InfName in INFList:\r
                             InfClass = PathClass(NormPath(InfName), Wa.WorkspaceDir, Pa.Arch)\r
                             Ma = ModuleAutoGen(Wa, InfClass, Pa.BuildTarget, Pa.ToolChain, Pa.Arch, Wa.MetaFile)\r
-                            if Ma == None:\r
+                            if Ma is None:\r
                                 continue\r
                             if Ma not in ModuleAutoGenList:\r
                                 ModuleAutoGenList.append(Ma)\r
                                 continue\r
                             if Ma not in ModuleAutoGenList:\r
                                 ModuleAutoGenList.append(Ma)\r