]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/build/build.py
BaseTools: refactor and remove un-needed use of .keys() on dictionaries
[mirror_edk2.git] / BaseTools / Source / Python / build / build.py
index 85612d90ced10cdeffc75e9eb324cec26351f0fc..36bb1fecf7e570143d11e0ac9f9c6568e13ba9b3 100644 (file)
@@ -53,6 +53,8 @@ import Common.EdkLogger
 import Common.GlobalData as GlobalData\r
 from GenFds.GenFds import GenFds\r
 \r
+from collections import OrderedDict,defaultdict\r
+\r
 # Version and Copyright\r
 VersionNumber = "0.60" + ' ' + gBUILD_VERSION\r
 __version__ = "%prog Version " + VersionNumber\r
@@ -241,7 +243,7 @@ def ReadMessage(From, To, ExitFlag):
         # 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
@@ -299,9 +301,9 @@ def LaunchCommand(Command, WorkingDir):
     except: # in case of aborting\r
         # terminate the threads redirecting the program output\r
         EdkLogger.quiet("(Python %s on %s) " % (platform.python_version(), sys.platform) + traceback.format_exc())\r
-        if EndOfProcedure != None:\r
+        if EndOfProcedure is not None:\r
             EndOfProcedure.set()\r
-        if Proc == None:\r
+        if Proc is None:\r
             if type(Command) != type(""):\r
                 Command = " ".join(Command)\r
             EdkLogger.error("build", COMMAND_FAILURE, "Failed to start command", ExtraData="%s [%s]" % (Command, WorkingDir))\r
@@ -375,7 +377,7 @@ class BuildUnit:
     #   @param  Other       The other BuildUnit object compared to\r
     #\r
     def __eq__(self, Other):\r
-        return Other != None and self.BuildObject == Other.BuildObject \\r
+        return Other is not None and self.BuildObject == Other.BuildObject \\r
                 and self.BuildObject.Arch == Other.BuildObject.Arch\r
 \r
     ## hash() method\r
@@ -438,19 +440,19 @@ class PlatformMakeUnit(BuildUnit):
 #\r
 class BuildTask:\r
     # queue for tasks waiting for schedule\r
-    _PendingQueue = sdict()\r
+    _PendingQueue = OrderedDict()\r
     _PendingQueueLock = threading.Lock()\r
 \r
     # queue for tasks ready for running\r
-    _ReadyQueue = sdict()\r
+    _ReadyQueue = OrderedDict()\r
     _ReadyQueueLock = threading.Lock()\r
 \r
     # queue for run tasks\r
-    _RunningQueue = sdict()\r
+    _RunningQueue = OrderedDict()\r
     _RunningQueueLock = threading.Lock()\r
 \r
     # queue containing all build tasks, in case duplicate build\r
-    _TaskQueue = sdict()\r
+    _TaskQueue = OrderedDict()\r
 \r
     # flag indicating error occurs in a running thread\r
     _ErrorFlag = threading.Event()\r
@@ -522,8 +524,7 @@ class BuildTask:
                     BuildTask._Thread.acquire(True)\r
 \r
                     # start a new build thread\r
-                    Bo = BuildTask._ReadyQueue.keys()[0]\r
-                    Bt = BuildTask._ReadyQueue.pop(Bo)\r
+                    Bo,Bt = BuildTask._ReadyQueue.popitem()\r
 \r
                     # move into running queue\r
                     BuildTask._RunningQueueLock.acquire()\r
@@ -633,7 +634,7 @@ class BuildTask:
         self.BuildItem = BuildItem\r
 \r
         self.DependencyList = []\r
-        if Dependency == None:\r
+        if Dependency is None:\r
             Dependency = BuildItem.Dependency\r
         else:\r
             Dependency.extend(BuildItem.Dependency)\r
@@ -795,7 +796,7 @@ class Build():
                 BinCacheSource = mws.join(self.WorkspaceDir, BinCacheSource)\r
             GlobalData.gBinCacheSource = BinCacheSource\r
         else:\r
-            if GlobalData.gBinCacheSource != None:\r
+            if GlobalData.gBinCacheSource is not None:\r
                 EdkLogger.error("build", OPTION_VALUE_INVALID, ExtraData="Invalid value of option --binary-source.")\r
 \r
         if GlobalData.gBinCacheDest:\r
@@ -804,7 +805,7 @@ class Build():
                 BinCacheDest = mws.join(self.WorkspaceDir, BinCacheDest)\r
             GlobalData.gBinCacheDest = BinCacheDest\r
         else:\r
-            if GlobalData.gBinCacheDest != None:\r
+            if GlobalData.gBinCacheDest is not None:\r
                 EdkLogger.error("build", OPTION_VALUE_INVALID, ExtraData="Invalid value of option --binary-destination.")\r
 \r
         if self.ConfDirectory:\r
@@ -907,7 +908,7 @@ class Build():
         # if no tool chain given in command line, get it from target.txt\r
         if not self.ToolChainList:\r
             self.ToolChainList = self.TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_TAG]\r
-            if self.ToolChainList == None or len(self.ToolChainList) == 0:\r
+            if self.ToolChainList is None or len(self.ToolChainList) == 0:\r
                 EdkLogger.error("build", RESOURCE_NOT_AVAILABLE, ExtraData="No toolchain given. Don't know how to build.\n")\r
 \r
         # check if the tool chains are defined or not\r
@@ -935,7 +936,7 @@ class Build():
                 ToolChainFamily.append(ToolDefinition[TAB_TOD_DEFINES_FAMILY][Tool])\r
         self.ToolChainFamily = ToolChainFamily\r
 \r
-        if self.ThreadNumber == None:\r
+        if self.ThreadNumber is None:\r
             self.ThreadNumber = self.TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_MAX_CONCURRENT_THREAD_NUMBER]\r
             if self.ThreadNumber == '':\r
                 self.ThreadNumber = 0\r
@@ -998,7 +999,7 @@ class Build():
             GlobalData.gGlobalDefines['TOOL_CHAIN_TAG'] = self.ToolChainList[0]\r
         if self.ToolChainFamily:\r
             GlobalData.gGlobalDefines['FAMILY'] = self.ToolChainFamily[0]\r
-        if 'PREBUILD' in GlobalData.gCommandLineDefines.keys():\r
+        if 'PREBUILD' in GlobalData.gCommandLineDefines:\r
             self.Prebuild   = GlobalData.gCommandLineDefines.get('PREBUILD')\r
         else:\r
             self.Db.InitDatabase()\r
@@ -1039,7 +1040,7 @@ class Build():
             self.Prebuild += self.PassCommandOption(self.BuildTargetList, self.ArchList, self.ToolChainList, self.PlatformFile, self.Target)\r
 \r
     def InitPostBuild(self):\r
-        if 'POSTBUILD' in GlobalData.gCommandLineDefines.keys():\r
+        if 'POSTBUILD' in GlobalData.gCommandLineDefines:\r
             self.Postbuild = GlobalData.gCommandLineDefines.get('POSTBUILD')\r
         else:\r
             Platform = self.Db._MapPlatform(str(self.PlatformFile))\r
@@ -1224,7 +1225,7 @@ class Build():
     #                                       for dependent modules/Libraries\r
     #\r
     def _BuildPa(self, Target, AutoGenObject, CreateDepsCodeFile=True, CreateDepsMakeFile=True, BuildModule=False, FfsCommand={}):\r
-        if AutoGenObject == None:\r
+        if AutoGenObject is None:\r
             return False\r
 \r
         # skip file generation for cleanxxx targets, run and fds target\r
@@ -1252,7 +1253,7 @@ class Build():
             EdkLogger.quiet("Building ... %s" % repr(AutoGenObject))\r
 \r
         BuildCommand = AutoGenObject.BuildCommand\r
-        if BuildCommand == None or len(BuildCommand) == 0:\r
+        if BuildCommand is None or len(BuildCommand) == 0:\r
             EdkLogger.error("build", OPTION_MISSING,\r
                             "No build command found for this module. "\r
                             "Please check your setting of %s_%s_%s_MAKE_PATH in Conf/tools_def.txt file." %\r
@@ -1343,7 +1344,7 @@ class Build():
     #                                       for dependent modules/Libraries\r
     #\r
     def _Build(self, Target, AutoGenObject, CreateDepsCodeFile=True, CreateDepsMakeFile=True, BuildModule=False):\r
-        if AutoGenObject == None:\r
+        if AutoGenObject is None:\r
             return False\r
 \r
         # skip file generation for cleanxxx targets, run and fds target\r
@@ -1372,7 +1373,7 @@ class Build():
             EdkLogger.quiet("Building ... %s" % repr(AutoGenObject))\r
 \r
         BuildCommand = AutoGenObject.BuildCommand\r
-        if BuildCommand == None or len(BuildCommand) == 0:\r
+        if BuildCommand is None or len(BuildCommand) == 0:\r
             EdkLogger.error("build", OPTION_MISSING,\r
                             "No build command found for this module. "\r
                             "Please check your setting of %s_%s_%s_MAKE_PATH in Conf/tools_def.txt file." %\r
@@ -1421,9 +1422,7 @@ class Build():
     def _RebaseModule (self, MapBuffer, BaseAddress, ModuleList, AddrIsOffset = True, ModeIsSmm = False):\r
         if ModeIsSmm:\r
             AddrIsOffset = False\r
-        InfFileNameList = ModuleList.keys()\r
-        #InfFileNameList.sort()\r
-        for InfFile in InfFileNameList:\r
+        for InfFile in ModuleList:\r
             sys.stdout.write (".")\r
             sys.stdout.flush()\r
             ModuleInfo = ModuleList[InfFile]\r
@@ -1524,7 +1523,7 @@ class Build():
             # First get the XIP base address for FV map file.\r
             GuidPattern = re.compile("[-a-fA-F0-9]+")\r
             GuidName = re.compile("\(GUID=[-a-fA-F0-9]+")\r
-            for FvName in Wa.FdfProfile.FvDict.keys():\r
+            for FvName in Wa.FdfProfile.FvDict:\r
                 FvMapBuffer = os.path.join(Wa.FvDir, FvName + '.Fv.map')\r
                 if not os.path.exists(FvMapBuffer):\r
                     continue\r
@@ -1536,7 +1535,7 @@ class Build():
                 FvMap.readline()\r
                 for Line in FvMap:\r
                     MatchGuid = GuidPattern.match(Line)\r
-                    if MatchGuid != None:\r
+                    if MatchGuid is not None:\r
                         #\r
                         # Replace GUID with module name\r
                         #\r
@@ -1548,7 +1547,7 @@ class Build():
                     # Add the debug image full path.\r
                     #\r
                     MatchGuid = GuidName.match(Line)\r
-                    if MatchGuid != None:\r
+                    if MatchGuid is not None:\r
                         GuidString = MatchGuid.group().split("=")[1]\r
                         if GuidString.upper() in ModuleList:\r
                             MapBuffer.write('(IMAGE=%s)\n' % (os.path.join(ModuleList[GuidString.upper()].DebugDir, ModuleList[GuidString.upper()].Name + '.efi')))\r
@@ -1604,9 +1603,7 @@ class Build():
                         SmmModuleList[Module.MetaFile] = ImageInfo\r
                         SmmSize += ImageInfo.Image.Size\r
                         if Module.ModuleType == 'DXE_SMM_DRIVER':\r
-                            PiSpecVersion = '0x00000000'\r
-                            if 'PI_SPECIFICATION_VERSION' in Module.Module.Specification:\r
-                                PiSpecVersion = Module.Module.Specification['PI_SPECIFICATION_VERSION']\r
+                            PiSpecVersion = Module.Module.Specification.get('PI_SPECIFICATION_VERSION', '0x00000000')\r
                             # for PI specification < PI1.1, DXE_SMM_DRIVER also runs as BOOT time driver.\r
                             if int(PiSpecVersion, 16) < 0x0001000A:\r
                                 BtModuleList[Module.MetaFile] = ImageInfo\r
@@ -1758,7 +1755,7 @@ class Build():
                     for Module in Pa.Platform.Modules:\r
                         # Get ModuleAutoGen object to generate C code file and makefile\r
                         Ma = ModuleAutoGen(Wa, Module, BuildTarget, ToolChain, Arch, self.PlatformFile)\r
-                        if Ma == None:\r
+                        if Ma is None:\r
                             continue\r
                         self.BuildModules.append(Ma)\r
                     self._BuildPa(self.Target, Pa, FfsCommand=CmdListDict)\r
@@ -1778,7 +1775,7 @@ class Build():
                     ModuleList = {}\r
                     for Pa in Wa.AutoGenObjectList:\r
                         for Ma in Pa.ModuleAutoGenList:\r
-                            if Ma == None:\r
+                            if Ma is None:\r
                                 continue\r
                             if not Ma.IsLibrary:\r
                                 ModuleList[Ma.Guid.upper()] = Ma\r
@@ -1856,7 +1853,7 @@ class Build():
                     for Module in Pa.Platform.Modules:\r
                         if self.ModuleFile.Dir == Module.Dir and self.ModuleFile.Name == Module.Name:\r
                             Ma = ModuleAutoGen(Wa, Module, BuildTarget, ToolChain, Arch, self.PlatformFile)\r
-                            if Ma == None: continue\r
+                            if Ma is None: continue\r
                             MaList.append(Ma)\r
                             if Ma.CanSkipbyHash():\r
                                 self.HashSkipModules.append(Ma)\r
@@ -1936,7 +1933,7 @@ class Build():
                     ModuleList = {}\r
                     for Pa in Wa.AutoGenObjectList:\r
                         for Ma in Pa.ModuleAutoGenList:\r
-                            if Ma == None:\r
+                            if Ma is None:\r
                                 continue\r
                             if not Ma.IsLibrary:\r
                                 ModuleList[Ma.Guid.upper()] = Ma\r
@@ -1963,15 +1960,14 @@ class Build():
                     self._SaveMapFile (MapBuffer, Wa)\r
 \r
     def _GenFfsCmd(self):\r
-        CmdListDict = {}\r
+        # convert dictionary of Cmd:(Inf,Arch) \r
+        # to a new dictionary of (Inf,Arch):Cmd,Cmd,Cmd...\r
+        CmdSetDict = defaultdict(set)\r
         GenFfsDict = GenFds.GenFfsMakefile('', GlobalData.gFdfParser, self, self.ArchList, GlobalData)\r
         for Cmd in GenFfsDict:\r
             tmpInf, tmpArch = GenFfsDict[Cmd]\r
-            if (tmpInf, tmpArch) not in CmdListDict.keys():\r
-                CmdListDict[tmpInf, tmpArch] = [Cmd]\r
-            else:\r
-                CmdListDict[tmpInf, tmpArch].append(Cmd)\r
-        return CmdListDict\r
+            CmdSetDict[tmpInf, tmpArch].add(Cmd)\r
+        return CmdSetDict\r
 \r
     ## Build a platform in multi-thread mode\r
     #\r
@@ -2021,13 +2017,13 @@ class Build():
                     AutoGenStart = time.time()\r
                     GlobalData.gGlobalDefines['ARCH'] = Arch\r
                     Pa = PlatformAutoGen(Wa, self.PlatformFile, BuildTarget, ToolChain, Arch)\r
-                    if Pa == None:\r
+                    if Pa is None:\r
                         continue\r
                     ModuleList = []\r
                     for Inf in Pa.Platform.Modules:\r
                         ModuleList.append(Inf)\r
                     # Add the INF only list in FDF\r
-                    if GlobalData.gFdfParser != None:\r
+                    if GlobalData.gFdfParser is not None:\r
                         for InfName in GlobalData.gFdfParser.Profile.InfList:\r
                             Inf = PathClass(NormPath(InfName), self.WorkspaceDir, Arch)\r
                             if Inf in Pa.Platform.Modules:\r
@@ -2037,7 +2033,7 @@ class Build():
                         # Get ModuleAutoGen object to generate C code file and makefile\r
                         Ma = ModuleAutoGen(Wa, Module, BuildTarget, ToolChain, Arch, self.PlatformFile)\r
                         \r
-                        if Ma == None:\r
+                        if Ma is None:\r
                             continue\r
                         if Ma.CanSkipbyHash():\r
                             self.HashSkipModules.append(Ma)\r
@@ -2122,7 +2118,7 @@ class Build():
                     ModuleList = {}\r
                     for Pa in Wa.AutoGenObjectList:\r
                         for Ma in Pa.ModuleAutoGenList:\r
-                            if Ma == None:\r
+                            if Ma is None:\r
                                 continue\r
                             if not Ma.IsLibrary:\r
                                 ModuleList[Ma.Guid.upper()] = Ma\r
@@ -2263,18 +2259,18 @@ class Build():
         FilePath = os.path.join(os.path.dirname(GlobalData.gDatabasePath), "gFileTimeStampCache")\r
         if Utils.gFileTimeStampCache == {} and os.path.isfile(FilePath):\r
             Utils.gFileTimeStampCache = Utils.DataRestore(FilePath)\r
-            if Utils.gFileTimeStampCache == None:\r
+            if Utils.gFileTimeStampCache is None:\r
                 Utils.gFileTimeStampCache = {}\r
 \r
         FilePath = os.path.join(os.path.dirname(GlobalData.gDatabasePath), "gDependencyDatabase")\r
         if Utils.gDependencyDatabase == {} and os.path.isfile(FilePath):\r
             Utils.gDependencyDatabase = Utils.DataRestore(FilePath)\r
-            if Utils.gDependencyDatabase == None:\r
+            if Utils.gDependencyDatabase is None:\r
                 Utils.gDependencyDatabase = {}\r
 \r
 def ParseDefines(DefineList=[]):\r
     DefineDict = {}\r
-    if DefineList != None:\r
+    if DefineList is not None:\r
         for Define in DefineList:\r
             DefineTokenList = Define.split("=", 1)\r
             if not GlobalData.gMacroNamePattern.match(DefineTokenList[0]):\r
@@ -2403,16 +2399,16 @@ def Main():
     GlobalData.gCaseInsensitive = Option.CaseInsensitive\r
 \r
     # Set log level\r
-    if Option.verbose != None:\r
+    if Option.verbose is not None:\r
         EdkLogger.SetLevel(EdkLogger.VERBOSE)\r
-    elif Option.quiet != None:\r
+    elif Option.quiet is not None:\r
         EdkLogger.SetLevel(EdkLogger.QUIET)\r
-    elif Option.debug != None:\r
+    elif Option.debug is not None:\r
         EdkLogger.SetLevel(Option.debug + 1)\r
     else:\r
         EdkLogger.SetLevel(EdkLogger.INFO)\r
 \r
-    if Option.LogFile != None:\r
+    if Option.LogFile is not None:\r
         EdkLogger.SetLogFile(Option.LogFile)\r
 \r
     if Option.WarningAsError == True:\r
@@ -2472,13 +2468,13 @@ def Main():
             if ErrorCode != 0:\r
                 EdkLogger.error("build", ErrorCode, ExtraData=ErrorInfo)\r
 \r
-        if Option.PlatformFile != None:\r
+        if Option.PlatformFile is not None:\r
             if os.path.isabs (Option.PlatformFile):\r
                 if os.path.normcase (os.path.normpath(Option.PlatformFile)).find (Workspace) == 0:\r
                     Option.PlatformFile = NormFile(os.path.normpath(Option.PlatformFile), Workspace)\r
             Option.PlatformFile = PathClass(Option.PlatformFile, Workspace)\r
 \r
-        if Option.FdfFile != None:\r
+        if Option.FdfFile is not None:\r
             if os.path.isabs (Option.FdfFile):\r
                 if os.path.normcase (os.path.normpath(Option.FdfFile)).find (Workspace) == 0:\r
                     Option.FdfFile = NormFile(os.path.normpath(Option.FdfFile), Workspace)\r
@@ -2487,7 +2483,7 @@ def Main():
             if ErrorCode != 0:\r
                 EdkLogger.error("build", ErrorCode, ExtraData=ErrorInfo)\r
 \r
-        if Option.Flag != None and Option.Flag not in ['-c', '-s']:\r
+        if Option.Flag is not None and Option.Flag not in ['-c', '-s']:\r
             EdkLogger.error("build", OPTION_VALUE_INVALID, "UNI flag must be one of -c or -s")\r
 \r
         MyBuild = Build(Target, Workspace, Option)\r
@@ -2504,35 +2500,35 @@ def Main():
         #\r
         BuildError = False\r
     except FatalError, X:\r
-        if MyBuild != None:\r
+        if MyBuild is not None:\r
             # for multi-thread build exits safely\r
             MyBuild.Relinquish()\r
-        if Option != None and Option.debug != None:\r
+        if Option is not None and Option.debug is not None:\r
             EdkLogger.quiet("(Python %s on %s) " % (platform.python_version(), sys.platform) + traceback.format_exc())\r
         ReturnCode = X.args[0]\r
     except Warning, X:\r
         # error from Fdf parser\r
-        if MyBuild != None:\r
+        if MyBuild is not None:\r
             # for multi-thread build exits safely\r
             MyBuild.Relinquish()\r
-        if Option != None and Option.debug != None:\r
+        if Option is not None and Option.debug is not None:\r
             EdkLogger.quiet("(Python %s on %s) " % (platform.python_version(), sys.platform) + traceback.format_exc())\r
         else:\r
             EdkLogger.error(X.ToolName, FORMAT_INVALID, File=X.FileName, Line=X.LineNumber, ExtraData=X.Message, RaiseError=False)\r
         ReturnCode = FORMAT_INVALID\r
     except KeyboardInterrupt:\r
         ReturnCode = ABORT_ERROR\r
-        if Option != None and Option.debug != None:\r
+        if Option is not None and Option.debug is not None:\r
             EdkLogger.quiet("(Python %s on %s) " % (platform.python_version(), sys.platform) + traceback.format_exc())\r
     except:\r
-        if MyBuild != None:\r
+        if MyBuild is not None:\r
             # for multi-thread build exits safely\r
             MyBuild.Relinquish()\r
 \r
         # try to get the meta-file from the object causing exception\r
         Tb = sys.exc_info()[-1]\r
         MetaFile = GlobalData.gProcessingFile\r
-        while Tb != None:\r
+        while Tb is not None:\r
             if 'self' in Tb.tb_frame.f_locals and hasattr(Tb.tb_frame.f_locals['self'], 'MetaFile'):\r
                 MetaFile = Tb.tb_frame.f_locals['self'].MetaFile\r
             Tb = Tb.tb_next\r
@@ -2566,7 +2562,7 @@ def Main():
         BuildDurationStr = time.strftime("%H:%M:%S", BuildDuration) + ", %d day(s)" % (BuildDuration.tm_yday - 1)\r
     else:\r
         BuildDurationStr = time.strftime("%H:%M:%S", BuildDuration)\r
-    if MyBuild != None:\r
+    if MyBuild is not None:\r
         if not BuildError:\r
             MyBuild.BuildReport.GenerateReport(BuildDurationStr, LogBuildTime(MyBuild.AutoGenTime), LogBuildTime(MyBuild.MakeTime), LogBuildTime(MyBuild.GenFdsTime))\r
         MyBuild.Db.Close()\r