]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/build/BuildReport.py
BaseTools: Fix bug about *M value not display decimal and hexadecimal
[mirror_edk2.git] / BaseTools / Source / Python / build / BuildReport.py
index 61ea645f5c43359a504d1294e95f738c60021f2b..5709cde9d6ca9b14b859779ba1c4f3dc3cee22a2 100644 (file)
@@ -28,7 +28,7 @@ import hashlib
 import subprocess\r
 import threading\r
 from datetime import datetime\r
-from StringIO import StringIO\r
+from io import BytesIO\r
 from Common import EdkLogger\r
 from Common.Misc import SaveFileOnChange\r
 from Common.Misc import GuidStructureByteArrayToGuidString\r
@@ -220,7 +220,7 @@ def FindIncludeFiles(Source, IncludePathList, IncludeFiles):
 \r
 ## Split each lines in file\r
 #\r
-#  This method is used to split the lines in file to make the length of each line \r
+#  This method is used to split the lines in file to make the length of each line\r
 #  less than MaxLength.\r
 #\r
 #  @param      Content           The content of file\r
@@ -245,12 +245,12 @@ def FileLinesSplit(Content=None, MaxLength=None):
             NewContentList.append(Line)\r
     for NewLine in NewContentList:\r
         NewContent += NewLine + TAB_LINE_BREAK\r
-    \r
+\r
     NewContent = NewContent.replace(TAB_LINE_BREAK, gEndOfLine).replace('\r\r\n', gEndOfLine)\r
     return NewContent\r
-    \r
-    \r
-    \r
+\r
+\r
+\r
 ##\r
 # Parse binary dependency expression section\r
 #\r
@@ -280,10 +280,15 @@ class DepexParser(object):
                 for Guid in Package.Guids:\r
                     GuidValue = GuidStructureStringToGuidString(Package.Guids[Guid])\r
                     self._GuidDb[GuidValue.upper()] = Guid\r
-    \r
+            for Ma in Pa.ModuleAutoGenList:\r
+                for Pcd in Ma.FixedVoidTypePcds:\r
+                    PcdValue = Ma.FixedVoidTypePcds[Pcd]\r
+                    if len(PcdValue.split(',')) == 16:\r
+                        GuidValue = GuidStructureByteArrayToGuidString(PcdValue)\r
+                        self._GuidDb[GuidValue.upper()] = Pcd\r
     ##\r
     # Parse the binary dependency expression files.\r
-    # \r
+    #\r
     # This function parses the binary dependency expression file and translate it\r
     # to the instruction list.\r
     #\r
@@ -305,7 +310,7 @@ class DepexParser(object):
             OpCode = DepexFile.read(1)\r
 \r
         return DepexStatement\r
-    \r
+\r
 ##\r
 # Reports library information\r
 #\r
@@ -411,7 +416,7 @@ class DepexReport(object):
 \r
         if ModuleType in [SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_DXE_CORE, SUP_MODULE_SMM_CORE, SUP_MODULE_MM_CORE_STANDALONE, SUP_MODULE_UEFI_APPLICATION]:\r
             return\r
-      \r
+\r
         for Source in M.SourceFileList:\r
             if os.path.splitext(Source.Path)[1].lower() == ".dxs":\r
                 Match = gDxsDependencyPattern.search(open(Source.Path).read())\r
@@ -420,7 +425,7 @@ class DepexReport(object):
                     self.Source = "DXS"\r
                     break\r
         else:\r
-            self.Depex = M.DepexExpressionList.get(M.ModuleType, "")\r
+            self.Depex = M.DepexExpressionDict.get(M.ModuleType, "")\r
             self.ModuleDepex = " ".join(M.Module.DepexExpression[M.Arch, M.ModuleType])\r
             if not self.ModuleDepex:\r
                 self.ModuleDepex = "(None)"\r
@@ -457,16 +462,16 @@ class DepexReport(object):
                 FileWrite(File, gSubSectionSep)\r
             except:\r
                 EdkLogger.warn(None, "Dependency expression file is corrupted", self._DepexFileName)\r
-        \r
+\r
         FileWrite(File, "Dependency Expression (DEPEX) from %s" % self.Source)\r
 \r
         if self.Source == "INF":\r
-            FileWrite(File, "%s" % self.Depex, True)\r
+            FileWrite(File, self.Depex, True)\r
             FileWrite(File, gSubSectionSep)\r
             FileWrite(File, "From Module INF:  %s" % self.ModuleDepex, True)\r
             FileWrite(File, "From Library INF: %s" % self.LibraryDepex, True)\r
         else:\r
-            FileWrite(File, "%s" % self.Depex)\r
+            FileWrite(File, self.Depex)\r
         FileWrite(File, gSubSectionEnd)\r
 \r
 ##\r
@@ -649,7 +654,7 @@ class ModuleReport(object):
                 cmd = ["GenFw", "--rebase", str(0), "-o", Tempfile, DefaultEFIfile]\r
                 try:\r
                     PopenObject = subprocess.Popen(' '.join(cmd), stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)\r
-                except Exception, X:\r
+                except Exception as X:\r
                     EdkLogger.error("GenFw", COMMAND_FAILURE, ExtraData="%s: %s" % (str(X), cmd[0]))\r
                 EndOfProcedure = threading.Event()\r
                 EndOfProcedure.clear()\r
@@ -958,11 +963,16 @@ class PcdReport(object):
                 DecDefaultValue = self.DecPcdDefault.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName, DecType))\r
                 DscDefaultValue = self.DscPcdDefault.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName))\r
                 DscDefaultValBak = DscDefaultValue\r
+                Field = ''\r
+                for (CName, Guid, Field) in self.FdfPcdSet:\r
+                    if CName == PcdTokenCName and Guid == Key:\r
+                        DscDefaultValue = self.FdfPcdSet[(CName, Guid, Field)]\r
+                        break\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
+                    except BadExpression as DscDefaultValue:\r
                         EdkLogger.error('BuildReport', FORMAT_INVALID, "PCD Value: %s, Type: %s" %(DscDefaultValue, Pcd.DatumType))\r
 \r
                 InfDefaultValue = None\r
@@ -970,13 +980,14 @@ class PcdReport(object):
                 PcdValue = DecDefaultValue\r
                 if DscDefaultValue:\r
                     PcdValue = DscDefaultValue\r
+                Pcd.DefaultValue = PcdValue\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
+                    InfDefaultValue, PcdValue = ModulePcdSet[Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type]\r
                     Pcd.DefaultValue = PcdValue\r
-                    if InfDefault == "":\r
-                        InfDefault = None\r
+                    if InfDefaultValue == "":\r
+                        InfDefaultValue = None\r
 \r
                 BuildOptionMatch = False\r
                 if GlobalData.BuildOptionPcd:\r
@@ -1079,13 +1090,15 @@ class PcdReport(object):
                 #\r
                 # Report PCD item according to their override relationship\r
                 #\r
-                if DecMatch and InfMatch:\r
+                if DecMatch:\r
                     self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '  ')\r
+                elif InfDefaultValue and InfMatch:\r
+                    self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*M')\r
                 elif BuildOptionMatch:\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
+                    if DscDefaultValue and DscMatch:\r
+                        if (Pcd.TokenCName, Key, Field) in self.FdfPcdSet:\r
                             self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*F')\r
                         else:\r
                             self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*P')\r
@@ -1112,9 +1125,15 @@ class PcdReport(object):
                             if IsByteArray:\r
                                 FileWrite(File, ' *M     %-*s = %s' % (self.MaxLen + 15, ModulePath, '{'))\r
                                 for Array in ArrayList:\r
-                                    FileWrite(File, '%s' % (Array))\r
+                                    FileWrite(File, Array)\r
                             else:\r
-                                FileWrite(File, ' *M     %-*s = %s' % (self.MaxLen + 15, ModulePath, ModuleDefault.strip()))\r
+                                Value =  ModuleDefault.strip()\r
+                                if Pcd.DatumType in TAB_PCD_CLEAN_NUMERIC_TYPES:\r
+                                    if Value.startswith(('0x', '0X')):\r
+                                        Value = '{} ({:d})'.format(Value, int(Value, 0))\r
+                                    else:\r
+                                        Value = "0x{:X} ({})".format(int(Value, 0), Value)\r
+                                FileWrite(File, ' *M     %-*s = %s' % (self.MaxLen + 15, ModulePath, Value))\r
 \r
         if ModulePcdSet is None:\r
             FileWrite(File, gSectionEnd)\r
@@ -1138,7 +1157,7 @@ class PcdReport(object):
             if IsByteArray:\r
                 FileWrite(File, '    %*s = %s' % (self.MaxLen + 19, 'DSC DEFAULT', "{"))\r
                 for Array in ArrayList:\r
-                    FileWrite(File, '%s' % (Array))\r
+                    FileWrite(File, Array)\r
             else:\r
                 if Pcd.DatumType in TAB_PCD_CLEAN_NUMERIC_TYPES:\r
                     if Value.startswith(('0x', '0X')):\r
@@ -1152,7 +1171,7 @@ class PcdReport(object):
             if IsByteArray:\r
                 FileWrite(File, '    %*s = %s' % (self.MaxLen + 19, 'INF DEFAULT', "{"))\r
                 for Array in ArrayList:\r
-                    FileWrite(File, '%s' % (Array))\r
+                    FileWrite(File, Array)\r
             else:\r
                 if Pcd.DatumType in TAB_PCD_CLEAN_NUMERIC_TYPES:\r
                     if Value.startswith(('0x', '0X')):\r
@@ -1167,7 +1186,7 @@ class PcdReport(object):
             if IsByteArray:\r
                 FileWrite(File, '    %*s = %s' % (self.MaxLen + 19, 'DEC DEFAULT', "{"))\r
                 for Array in ArrayList:\r
-                    FileWrite(File, '%s' % (Array))\r
+                    FileWrite(File, Array)\r
             else:\r
                 if Pcd.DatumType in TAB_PCD_CLEAN_NUMERIC_TYPES:\r
                     if Value.startswith(('0x', '0X')):\r
@@ -1187,10 +1206,10 @@ class PcdReport(object):
             if IsByteArray:\r
                 FileWrite(File, ' %-*s   : %6s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '{'))\r
                 for Array in ArrayList:\r
-                    FileWrite(File, '%s' % (Array))\r
+                    FileWrite(File, Array)\r
             else:\r
                 if Pcd.DatumType in TAB_PCD_CLEAN_NUMERIC_TYPES:\r
-                    if Value.startswith(('0x','0X')):\r
+                    if Value.startswith(('0x', '0X')):\r
                         Value = '{} ({:d})'.format(Value, int(Value, 0))\r
                     else:\r
                         Value = "0x{:X} ({})".format(int(Value, 0), Value)\r
@@ -1228,7 +1247,7 @@ class PcdReport(object):
                                     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
+                                        FileWrite(File, Array)\r
                                 else:\r
                                     if Pcd.DatumType in TAB_PCD_CLEAN_NUMERIC_TYPES:\r
                                         if Value.startswith(('0x', '0X')):\r
@@ -1254,7 +1273,7 @@ class PcdReport(object):
                                     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
+                                        FileWrite(File, Array)\r
                                 else:\r
                                     if Pcd.DatumType in TAB_PCD_CLEAN_NUMERIC_TYPES:\r
                                         if Value.startswith(('0x', '0X')):\r
@@ -1286,7 +1305,7 @@ class PcdReport(object):
                             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
+                                FileWrite(File, Array)\r
                         else:\r
                             if Pcd.DatumType in TAB_PCD_CLEAN_NUMERIC_TYPES:\r
                                 if Value.startswith(('0x', '0X')):\r
@@ -1300,11 +1319,11 @@ class PcdReport(object):
                     else:\r
                         if IsByteArray:\r
                             if self.SkuSingle:\r
-                                FileWrite(File, ' %-*s   : %6s %10s = %s' % (self.MaxLen, ' ' , TypeName, '(' + Pcd.DatumType + ')', "{"))\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
+                                FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, ' ', TypeName, '(' + Pcd.DatumType + ')', '(' + SkuIdName + ')', "{"))\r
                             for Array in ArrayList:\r
-                                FileWrite(File, '%s' % (Array))\r
+                                FileWrite(File, Array)\r
                         else:\r
                             if Pcd.DatumType in TAB_PCD_CLEAN_NUMERIC_TYPES:\r
                                 if Value.startswith(('0x', '0X')):\r
@@ -1312,9 +1331,9 @@ class PcdReport(object):
                                 else:\r
                                     Value = "0x{:X} ({})".format(int(Value, 0), Value)\r
                             if self.SkuSingle:\r
-                                FileWrite(File, ' %-*s   : %6s %10s = %s' % (self.MaxLen, ' ' , TypeName, '(' + Pcd.DatumType + ')', Value))\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
+                                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
@@ -1331,6 +1350,9 @@ class PcdReport(object):
             for Key, Values in OverrideStruct.items():\r
                 if Values[1] and Values[1].endswith('.dsc'):\r
                     OverrideFieldStruct[Key] = Values\r
+        if Pcd.PcdFieldValueFromFdf:\r
+            for Key, Values in Pcd.PcdFieldValueFromFdf.items():\r
+                OverrideFieldStruct[Key] = Values\r
         if Pcd.PcdFieldValueFromComm:\r
             for Key, Values in Pcd.PcdFieldValueFromComm.items():\r
                 OverrideFieldStruct[Key] = Values\r
@@ -1548,7 +1570,7 @@ class PredictionReport(object):
             EotEndTime = time.time()\r
             EotDuration = time.strftime("%H:%M:%S", time.gmtime(int(round(EotEndTime - EotStartTime))))\r
             EdkLogger.quiet("EOT run time: %s\n" % EotDuration)\r
-            \r
+\r
             #\r
             # Parse the output of EOT tool\r
             #\r
@@ -1746,7 +1768,7 @@ class FdRegionReport(object):
         PlatformPcds = {}\r
         #\r
         # Collect PCDs declared in DEC files.\r
-        #        \r
+        #\r
         for Pa in Wa.AutoGenObjectList:\r
             for Package in Pa.PackageList:\r
                 for (TokenCName, TokenSpaceGuidCName, DecType) in Package.Pcds:\r
@@ -1865,8 +1887,7 @@ class FdRegionReport(object):
                 for Match in gOffsetGuidPattern.finditer(FvReport):\r
                     Guid = Match.group(2).upper()\r
                     OffsetInfo[Match.group(1)] = self._GuidsDb.get(Guid, Guid)\r
-                OffsetList = OffsetInfo.keys()\r
-                OffsetList.sort()\r
+                OffsetList = sorted(OffsetInfo.keys())\r
                 for Offset in OffsetList:\r
                     FileWrite (File, "%s %s" % (Offset, OffsetInfo[Offset]))\r
             except IOError:\r
@@ -1976,7 +1997,7 @@ class FdReport(object):
                     ValueList[-1] = ' {'\r
                     FileWrite(File, '|'.join(ValueList))\r
                     for Array in ArrayList:\r
-                        FileWrite(File, '%s' % (Array))\r
+                        FileWrite(File, Array)\r
                 else:\r
                     FileWrite(File, item)\r
             FileWrite(File, gSubSectionEnd)\r
@@ -2027,7 +2048,7 @@ class PlatformReport(object):
         self.DepexParser = None\r
         if "DEPEX" in ReportType:\r
             self.DepexParser = DepexParser(Wa)\r
-            \r
+\r
         self.ModuleReportList = []\r
         if MaList is not None:\r
             self._IsModuleBuild = True\r
@@ -2102,7 +2123,7 @@ class PlatformReport(object):
         if not self._IsModuleBuild:\r
             if "PCD" in ReportType:\r
                 self.PcdReport.GenerateReport(File, None)\r
-    \r
+\r
             if "FLASH" in ReportType:\r
                 for FdReportListItem in self.FdReportList:\r
                     FdReportListItem.GenerateReport(File)\r
@@ -2136,7 +2157,7 @@ class BuildReport(object):
         if ReportFile:\r
             self.ReportList = []\r
             self.ReportType = []\r
-            if ReportType: \r
+            if ReportType:\r
                 for ReportTypeItem in ReportType:\r
                     if ReportTypeItem not in self.ReportType:\r
                         self.ReportType.append(ReportTypeItem)\r
@@ -2170,7 +2191,7 @@ class BuildReport(object):
     def GenerateReport(self, BuildDuration, AutoGenTime, MakeTime, GenFdsTime):\r
         if self.ReportFile:\r
             try:\r
-                File = StringIO('')\r
+                File = BytesIO('')\r
                 for (Wa, MaList) in self.ReportList:\r
                     PlatformReport(Wa, MaList, self.ReportType).GenerateReport(File, BuildDuration, AutoGenTime, MakeTime, GenFdsTime, self.ReportType)\r
                 Content = FileLinesSplit(File.getvalue(), gLineMaxLength)\r
@@ -2182,7 +2203,7 @@ class BuildReport(object):
                 EdkLogger.error("BuildReport", CODE_ERROR, "Unknown fatal error when generating build report", ExtraData=self.ReportFile, RaiseError=False)\r
                 EdkLogger.quiet("(Python %s on %s\n%s)" % (platform.python_version(), sys.platform, traceback.format_exc()))\r
             File.close()\r
-            \r
+\r
 # This acts like the main() function for the script, unless it is 'import'ed into another script.\r
 if __name__ == '__main__':\r
     pass\r