]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/build/build.py
BaseTools: Replace StandardError with Expression
[mirror_edk2.git] / BaseTools / Source / Python / build / build.py
index bb130a02cc1cbdf9b5d4cfcdcffc0bf5f4469f31..344b006bc4245f92b1d4b657d8998dfb934f3cb5 100644 (file)
@@ -16,6 +16,7 @@
 ##\r
 # Import Modules\r
 #\r
+from __future__ import print_function\r
 import Common.LongFilePathOs as os\r
 import re\r
 import StringIO\r
@@ -53,6 +54,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
@@ -74,7 +77,7 @@ TmpTableDict = {}
 #   Otherwise, False is returned\r
 #\r
 def IsToolInPath(tool):\r
-    if os.environ.has_key('PATHEXT'):\r
+    if 'PATHEXT' in os.environ:\r
         extns = os.environ['PATHEXT'].split(os.path.pathsep)\r
     else:\r
         extns = ('',)\r
@@ -103,7 +106,7 @@ def CheckEnvVariable():
 \r
     WorkspaceDir = os.path.normcase(os.path.normpath(os.environ["WORKSPACE"]))\r
     if not os.path.exists(WorkspaceDir):\r
-        EdkLogger.error("build", FILE_NOT_FOUND, "WORKSPACE doesn't exist", ExtraData="%s" % WorkspaceDir)\r
+        EdkLogger.error("build", FILE_NOT_FOUND, "WORKSPACE doesn't exist", ExtraData=WorkspaceDir)\r
     elif ' ' in WorkspaceDir:\r
         EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "No space is allowed in WORKSPACE path",\r
                         ExtraData=WorkspaceDir)\r
@@ -115,7 +118,7 @@ def CheckEnvVariable():
     if mws.PACKAGES_PATH:\r
         for Path in mws.PACKAGES_PATH:\r
             if not os.path.exists(Path):\r
-                EdkLogger.error("build", FILE_NOT_FOUND, "One Path in PACKAGES_PATH doesn't exist", ExtraData="%s" % Path)\r
+                EdkLogger.error("build", FILE_NOT_FOUND, "One Path in PACKAGES_PATH doesn't exist", ExtraData=Path)\r
             elif ' ' in Path:\r
                 EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "No space is allowed in PACKAGES_PATH", ExtraData=Path)\r
 \r
@@ -241,7 +244,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 +302,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 +378,8 @@ 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 and self.BuildObject == Other.BuildObject \\r
+                and Other.BuildObject \\r
                 and self.BuildObject.Arch == Other.BuildObject.Arch\r
 \r
     ## hash() method\r
@@ -438,19 +442,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 +526,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
@@ -543,10 +546,10 @@ class BuildTask:
             # while not BuildTask._ErrorFlag.isSet() and \\r
             while len(BuildTask._RunningQueue) > 0:\r
                 EdkLogger.verbose("Waiting for thread ending...(%d)" % len(BuildTask._RunningQueue))\r
-                EdkLogger.debug(EdkLogger.DEBUG_8, "Threads [%s]" % ", ".join([Th.getName() for Th in threading.enumerate()]))\r
+                EdkLogger.debug(EdkLogger.DEBUG_8, "Threads [%s]" % ", ".join(Th.getName() for Th in threading.enumerate()))\r
                 # avoid tense loop\r
                 time.sleep(0.1)\r
-        except BaseException, X:\r
+        except BaseException as X:\r
             #\r
             # TRICK: hide the output of threads left runing, so that the user can\r
             #        catch the error message easily\r
@@ -633,7 +636,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
@@ -772,7 +775,7 @@ class Build():
         self.AutoGenTime    = 0\r
         self.MakeTime       = 0\r
         self.GenFdsTime     = 0\r
-        GlobalData.BuildOptionPcd     = BuildOptions.OptionPcd if BuildOptions.OptionPcd else {}\r
+        GlobalData.BuildOptionPcd     = BuildOptions.OptionPcd if BuildOptions.OptionPcd else []\r
         #Set global flag for build mode\r
         GlobalData.gIgnoreSource = BuildOptions.IgnoreSources\r
         GlobalData.gUseHashCache = BuildOptions.UseHashCache\r
@@ -795,7 +798,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 +807,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 +910,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 +938,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 +1001,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 +1042,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 +1227,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 +1255,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
@@ -1322,7 +1325,7 @@ class Build():
             try:\r
                 #os.rmdir(AutoGenObject.BuildDir)\r
                 RemoveDirectory(AutoGenObject.BuildDir, True)\r
-            except WindowsError, X:\r
+            except WindowsError as X:\r
                 EdkLogger.error("build", FILE_DELETE_FAILURE, ExtraData=str(X))\r
         return True\r
 \r
@@ -1343,7 +1346,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 +1375,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
@@ -1412,7 +1415,7 @@ class Build():
             try:\r
                 #os.rmdir(AutoGenObject.BuildDir)\r
                 RemoveDirectory(AutoGenObject.BuildDir, True)\r
-            except WindowsError, X:\r
+            except WindowsError as X:\r
                 EdkLogger.error("build", FILE_DELETE_FAILURE, ExtraData=str(X))\r
         return True\r
 \r
@@ -1421,9 +1424,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 +1525,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,19 +1537,19 @@ 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
                         GuidString = MatchGuid.group()\r
                         if GuidString.upper() in ModuleList:\r
                             Line = Line.replace(GuidString, ModuleList[GuidString.upper()].Name)\r
-                    MapBuffer.write('%s' % (Line))\r
+                    MapBuffer.write(Line)\r
                     #\r
                     # 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
@@ -1588,25 +1589,23 @@ class Build():
                     if not ImageClass.IsValid:\r
                         EdkLogger.error("build", FILE_PARSE_FAILURE, ExtraData=ImageClass.ErrorInfo)\r
                     ImageInfo = PeImageInfo(Module.Name, Module.Guid, Module.Arch, Module.OutputDir, Module.DebugDir, ImageClass)\r
-                    if Module.ModuleType in ['PEI_CORE', 'PEIM', 'COMBINED_PEIM_DRIVER', 'PIC_PEIM', 'RELOCATABLE_PEIM', 'DXE_CORE']:\r
+                    if Module.ModuleType in [SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM, EDK_COMPONENT_TYPE_COMBINED_PEIM_DRIVER, EDK_COMPONENT_TYPE_PIC_PEIM, EDK_COMPONENT_TYPE_RELOCATABLE_PEIM, SUP_MODULE_DXE_CORE]:\r
                         PeiModuleList[Module.MetaFile] = ImageInfo\r
                         PeiSize += ImageInfo.Image.Size\r
-                    elif Module.ModuleType in ['BS_DRIVER', 'DXE_DRIVER', 'UEFI_DRIVER']:\r
+                    elif Module.ModuleType in [EDK_COMPONENT_TYPE_BS_DRIVER, SUP_MODULE_DXE_DRIVER, SUP_MODULE_UEFI_DRIVER]:\r
                         BtModuleList[Module.MetaFile] = ImageInfo\r
                         BtSize += ImageInfo.Image.Size\r
-                    elif Module.ModuleType in ['DXE_RUNTIME_DRIVER', 'RT_DRIVER', 'DXE_SAL_DRIVER', 'SAL_RT_DRIVER']:\r
+                    elif Module.ModuleType in [SUP_MODULE_DXE_RUNTIME_DRIVER, EDK_COMPONENT_TYPE_RT_DRIVER, SUP_MODULE_DXE_SAL_DRIVER, EDK_COMPONENT_TYPE_SAL_RT_DRIVER]:\r
                         RtModuleList[Module.MetaFile] = ImageInfo\r
                         #IPF runtime driver needs to be at 2 page alignment.\r
                         if IsIpfPlatform and ImageInfo.Image.Size % 0x2000 != 0:\r
                             ImageInfo.Image.Size = (ImageInfo.Image.Size / 0x2000 + 1) * 0x2000\r
                         RtSize += ImageInfo.Image.Size\r
-                    elif Module.ModuleType in ['SMM_CORE', 'DXE_SMM_DRIVER', 'MM_STANDALONE', 'MM_CORE_STANDALONE']:\r
+                    elif Module.ModuleType in [SUP_MODULE_SMM_CORE, SUP_MODULE_DXE_SMM_DRIVER, SUP_MODULE_MM_STANDALONE, SUP_MODULE_MM_CORE_STANDALONE]:\r
                         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
+                        if Module.ModuleType == SUP_MODULE_DXE_SMM_DRIVER:\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
@@ -1619,12 +1618,12 @@ class Build():
             if OutputImageFile != '':\r
                 ModuleIsPatch = False\r
                 for Pcd in Module.ModulePcdList:\r
-                    if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE and Pcd.TokenCName in TAB_PCDS_PATCHABLE_LOAD_FIX_ADDRESS_LIST:\r
+                    if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE and Pcd.TokenCName in TAB_PCDS_PATCHABLE_LOAD_FIX_ADDRESS_SET:\r
                         ModuleIsPatch = True\r
                         break\r
                 if not ModuleIsPatch:\r
                     for Pcd in Module.LibraryPcdList:\r
-                        if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE and Pcd.TokenCName in TAB_PCDS_PATCHABLE_LOAD_FIX_ADDRESS_LIST:\r
+                        if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE and Pcd.TokenCName in TAB_PCDS_PATCHABLE_LOAD_FIX_ADDRESS_SET:\r
                             ModuleIsPatch = True\r
                             break\r
 \r
@@ -1758,7 +1757,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 +1777,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 +1855,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 +1935,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 +1962,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 +2019,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 +2035,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 +2120,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
@@ -2198,7 +2196,7 @@ class Build():
                     toolsFile = os.path.join(FvDir, 'GuidedSectionTools.txt')\r
                     toolsFile = open(toolsFile, 'wt')\r
                     for guidedSectionTool in guidAttribs:\r
-                        print >> toolsFile, ' '.join(guidedSectionTool)\r
+                        print(' '.join(guidedSectionTool), file=toolsFile)\r
                     toolsFile.close()\r
 \r
     ## Returns the full path of the tool.\r
@@ -2263,18 +2261,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 +2401,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 +2470,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 +2485,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
@@ -2503,36 +2501,36 @@ def Main():
         # All job done, no error found and no exception raised\r
         #\r
         BuildError = False\r
-    except FatalError, X:\r
-        if MyBuild != None:\r
+    except FatalError as X:\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
+    except Warning as 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 +2564,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