tools/scons: remove the python 3 compat patch, it is incomplete and breaks with pytho...
authorFelix Fietkau <nbd@openwrt.org>
Tue, 15 May 2012 13:42:36 +0000 (13:42 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Tue, 15 May 2012 13:42:36 +0000 (13:42 +0000)
SVN-Revision: 31741

tools/scons/patches/100-python3-compat.patch [deleted file]

diff --git a/tools/scons/patches/100-python3-compat.patch b/tools/scons/patches/100-python3-compat.patch
deleted file mode 100644 (file)
index 42a0351..0000000
+++ /dev/null
@@ -1,2046 +0,0 @@
---- a/engine/SCons/dblite.py
-+++ b/engine/SCons/dblite.py
-@@ -10,11 +10,11 @@ import pickle
- import shutil
- import time
--keep_all_files = 00000
-+keep_all_files = 0o0
- ignore_corrupt_dbfiles = 0
- def corruption_warning(filename):
--    print "Warning: Discarding corrupt database:", filename
-+    print("Warning: Discarding corrupt database:", filename)
- try: unicode
- except NameError:
-@@ -70,14 +70,14 @@ class dblite(object):
-     self._flag = flag
-     self._mode = mode
-     self._dict = {}
--    self._needs_sync = 00000
-+    self._needs_sync = 0o0
-     if self._os_chown is not None and (os.geteuid()==0 or os.getuid()==0):
-       # running as root; chown back to current owner/group when done
-       try:
-         statinfo = os.stat(self._file_name)
-         self._chown_to = statinfo.st_uid
-         self._chgrp_to = statinfo.st_gid
--      except OSError, e:
-+      except OSError as e:
-         # db file doesn't exist yet.
-         # Check os.environ for SUDO_UID, use if set
-         self._chown_to = int(os.environ.get('SUDO_UID', -1))
-@@ -90,7 +90,7 @@ class dblite(object):
-     else:
-       try:
-         f = self._open(self._file_name, "rb")
--      except IOError, e:
-+      except IOError as e:
-         if (self._flag != "c"):
-           raise e
-         self._open(self._file_name, "wb", self._mode)
-@@ -122,7 +122,7 @@ class dblite(object):
-     # (e.g. from a previous run as root).  We should still be able to
-     # unlink() the file if the directory's writable, though, so ignore
-     # any OSError exception  thrown by the chmod() call.
--    try: self._os_chmod(self._file_name, 0777)
-+    try: self._os_chmod(self._file_name, 0o777)
-     except OSError: pass
-     self._os_unlink(self._file_name)
-     self._os_rename(self._tmp_name, self._file_name)
-@@ -131,7 +131,7 @@ class dblite(object):
-         self._os_chown(self._file_name, self._chown_to, self._chgrp_to)
-       except OSError:
-         pass
--    self._needs_sync = 00000
-+    self._needs_sync = 0o0
-     if (keep_all_files):
-       self._shutil_copyfile(
-         self._file_name,
-@@ -151,7 +151,7 @@ class dblite(object):
-     if (not is_string(value)):
-       raise TypeError("value `%s' must be a string but is %s" % (value, type(value)))
-     self._dict[key] = value
--    self._needs_sync = 0001
-+    self._needs_sync = 0o1
-   def keys(self):
-     return list(self._dict.keys())
-@@ -171,7 +171,7 @@ class dblite(object):
-   def __len__(self):
-     return len(self._dict)
--def open(file, flag=None, mode=0666):
-+def open(file, flag=None, mode=0o666):
-   return dblite(file, flag, mode)
- def _exercise():
-@@ -198,7 +198,7 @@ def _exercise():
-   assert db[unicode("ubar")] == unicode("ufoo")
-   try:
-     db.sync()
--  except IOError, e:
-+  except IOError as e:
-     assert str(e) == "Read-only database: tmp.dblite"
-   else:
-     raise RuntimeError("IOError expected.")
-@@ -208,13 +208,13 @@ def _exercise():
-   db.sync()
-   try:
-     db[(1,2)] = "tuple"
--  except TypeError, e:
-+  except TypeError as e:
-     assert str(e) == "key `(1, 2)' must be a string but is <type 'tuple'>", str(e)
-   else:
-     raise RuntimeError("TypeError exception expected")
-   try:
-     db["list"] = [1,2]
--  except TypeError, e:
-+  except TypeError as e:
-     assert str(e) == "value `[1, 2]' must be a string but is <type 'list'>", str(e)
-   else:
-     raise RuntimeError("TypeError exception expected")
-@@ -238,11 +238,11 @@ def _exercise():
-   os.unlink("tmp.dblite")
-   try:
-     db = open("tmp", "w")
--  except IOError, e:
-+  except IOError as e:
-     assert str(e) == "[Errno 2] No such file or directory: 'tmp.dblite'", str(e)
-   else:
-     raise RuntimeError("IOError expected.")
--  print "OK"
-+  print("OK")
- if (__name__ == "__main__"):
-   _exercise()
---- a/engine/SCons/SConsign.py
-+++ b/engine/SCons/SConsign.py
-@@ -84,7 +84,7 @@ def Get_DataBase(dir):
-         DB_sync_list.append(db)
-         return db, "c"
-     except TypeError:
--        print "DataBase =", DataBase
-+        print("DataBase =", DataBase)
-         raise
- def Reset():
-@@ -215,7 +215,7 @@ class DB(Base):
-                     raise TypeError
-             except KeyboardInterrupt:
-                 raise
--            except Exception, e:
-+            except Exception as e:
-                 SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning,
-                                     "Ignoring corrupt sconsign entry : %s (%s)\n"%(self.dir.tpath, e))
-             for key, entry in self.entries.items():
-@@ -340,7 +340,7 @@ class DirFile(Dir):
-         if fname != self.sconsign:
-             try:
-                 mode = os.stat(self.sconsign)[0]
--                os.chmod(self.sconsign, 0666)
-+                os.chmod(self.sconsign, 0o666)
-                 os.unlink(self.sconsign)
-             except (IOError, OSError):
-                 # Try to carry on in the face of either OSError
---- a/engine/SCons/Util.py
-+++ b/engine/SCons/Util.py
-@@ -264,10 +264,10 @@ def print_tree(root, child_func, prune=0
-     children = child_func(root)
-     if prune and rname in visited and children:
--        sys.stdout.write(''.join(tags + margins + ['+-[', rname, ']']) + u'\n')
-+        sys.stdout.write(''.join(tags + margins + ['+-[', rname, ']']) + '\n')
-         return
--    sys.stdout.write(''.join(tags + margins + ['+-', rname]) + u'\n')
-+    sys.stdout.write(''.join(tags + margins + ['+-', rname]) + '\n')
-     visited[rname] = 1
-@@ -718,7 +718,7 @@ else:
-                     # raised so as to not mask possibly serious disk or
-                     # network issues.
-                     continue
--                if stat.S_IMODE(st[stat.ST_MODE]) & 0111:
-+                if stat.S_IMODE(st[stat.ST_MODE]) & 0o111:
-                     try:
-                         reject.index(f)
-                     except ValueError:
-@@ -1355,9 +1355,9 @@ def AddMethod(obj, function, name=None):
-         self.z = x + y
-       AddMethod(f, A, "add")
-       a.add(2, 4)
--      print a.z
-+      print(a.z)
-       AddMethod(lambda self, i: self.l[i], a, "listIndex")
--      print a.listIndex(5)
-+      print(a.listIndex(5))
-     """
-     if name is None:
-         name = function.func_name
---- a/setup.py
-+++ b/setup.py
-@@ -333,7 +333,7 @@ class install_scripts(_install_scripts):
-                     # log.info("changing mode of %s", file)
-                     pass
-                 else:
--                    mode = ((os.stat(file)[stat.ST_MODE]) | 0555) & 07777
-+                    mode = ((os.stat(file)[stat.ST_MODE]) | 0o555) & 0o7777
-                     # log.info("changing mode of %s to %o", file, mode)
-                     os.chmod(file, mode)
-         # --- /distutils copy/paste ---
-@@ -414,7 +414,7 @@ arguments = {
- distutils.core.setup(**arguments)
- if Installed:
--    print '\n'.join(Installed)
-+    print('\n'.join(Installed))
- # Local Variables:
- # tab-width:4
---- a/engine/SCons/compat/_scons_subprocess.py
-+++ b/engine/SCons/compat/_scons_subprocess.py
-@@ -248,11 +248,11 @@ A more real-world example would look lik
- try:
-     retcode = call("mycmd" + " myarg", shell=True)
-     if retcode < 0:
--        print >>sys.stderr, "Child was terminated by signal", -retcode
-+        print(>>sys.stderr, "Child was terminated by signal", -retcode)
-     else:
--        print >>sys.stderr, "Child returned", retcode
--except OSError, e:
--    print >>sys.stderr, "Execution failed:", e
-+        print(>>sys.stderr, "Child returned", retcode)
-+except OSError as e:
-+    print(>>sys.stderr, "Execution failed:", e)
- Replacing os.spawn*
-@@ -439,7 +439,7 @@ except TypeError:
-     def is_int(obj):
-         return isinstance(obj, type(1))
-     def is_int_or_long(obj):
--        return type(obj) in (type(1), type(1L))
-+        return type(obj) in (type(1), type(1))
- else:
-     def is_int(obj):
-         return isinstance(obj, int)
-@@ -802,7 +802,7 @@ class Popen(object):
-                 startupinfo.wShowWindow = SW_HIDE
-                 comspec = os.environ.get("COMSPEC", "cmd.exe")
-                 args = comspec + " /c " + args
--                if (GetVersion() >= 0x80000000L or
-+                if (GetVersion() >= 0x80000000 or
-                         os.path.basename(comspec).lower() == "command.com"):
-                     # Win9x, or using command.com on NT. We need to
-                     # use the w9xpopen intermediate program. For more
-@@ -830,7 +830,7 @@ class Popen(object):
-                                          env,
-                                          cwd,
-                                          startupinfo)
--            except pywintypes.error, e:
-+            except pywintypes.error as e:
-                 # Translate pywintypes.error to WindowsError, which is
-                 # a subclass of OSError.  FIXME: We should really
-                 # translate errno using _sys_errlist (or simliar), but
-@@ -1215,8 +1215,8 @@ def _demo_posix():
-     # Example 1: Simple redirection: Get process list
-     #
-     plist = Popen(["ps"], stdout=PIPE).communicate()[0]
--    print "Process list:"
--    print plist
-+    print("Process list:")
-+    print(plist)
-     #
-     # Example 2: Change uid before executing child
-@@ -1228,25 +1228,25 @@ def _demo_posix():
-     #
-     # Example 3: Connecting several subprocesses
-     #
--    print "Looking for 'hda'..."
-+    print("Looking for 'hda'...")
-     p1 = Popen(["dmesg"], stdout=PIPE)
-     p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
--    print repr(p2.communicate()[0])
-+    print(repr(p2.communicate()[0]))
-     #
-     # Example 4: Catch execution error
-     #
-     print
--    print "Trying a weird file..."
-+    print("Trying a weird file...")
-     try:
--        print Popen(["/this/path/does/not/exist"]).communicate()
--    except OSError, e:
-+        print(Popen(["/this/path/does/not/exist"]).communicate())
-+    except OSError as e:
-         if e.errno == errno.ENOENT:
--            print "The file didn't exist.  I thought so..."
--            print "Child traceback:"
--            print e.child_traceback
-+            print("The file didn't exist.  I thought so...")
-+            print("Child traceback:")
-+            print(e.child_traceback)
-         else:
--            print "Error", e.errno
-+            print("Error", e.errno)
-     else:
-         sys.stderr.write( "Gosh.  No error.\n" )
-@@ -1255,15 +1255,15 @@ def _demo_windows():
-     #
-     # Example 1: Connecting several subprocesses
-     #
--    print "Looking for 'PROMPT' in set output..."
-+    print("Looking for 'PROMPT' in set output...")
-     p1 = Popen("set", stdout=PIPE, shell=True)
-     p2 = Popen('find "PROMPT"', stdin=p1.stdout, stdout=PIPE)
--    print repr(p2.communicate()[0])
-+    print(repr(p2.communicate()[0]))
-     #
-     # Example 2: Simple execution of program
-     #
--    print "Executing calc..."
-+    print("Executing calc...")
-     p = Popen("calc")
-     p.wait()
---- a/engine/SCons/Memoize.py
-+++ b/engine/SCons/Memoize.py
-@@ -143,7 +143,7 @@ class Counter(object):
-         CounterList.append(self)
-     def display(self):
-         fmt = "    %7d hits %7d misses    %s()"
--        print fmt % (self.hit, self.miss, self.name)
-+        print(fmt % (self.hit, self.miss, self.name))
-     def __cmp__(self, other):
-         try:
-             return cmp(self.name, other.name)
-@@ -215,7 +215,7 @@ class Memoizer(object):
- def Dump(title=None):
-     if title:
--        print title
-+        print(title)
-     CounterList.sort()
-     for counter in CounterList:
-         counter.display()
---- a/engine/SCons/Node/FS.py
-+++ b/engine/SCons/Node/FS.py
-@@ -550,7 +550,7 @@ class EntryProxy(SCons.Util.Proxy):
-         except KeyError:
-             try:
-                 attr = SCons.Util.Proxy.__getattr__(self, name)
--            except AttributeError, e:
-+            except AttributeError as e:
-                 # Raise our own AttributeError subclass with an
-                 # overridden __str__() method that identifies the
-                 # name of the entry that caused the exception.
-@@ -2420,7 +2420,7 @@ class File(Base):
-         fname = self.rfile().abspath
-         try:
-             contents = open(fname, "rb").read()
--        except EnvironmentError, e:
-+        except EnvironmentError as e:
-             if not e.filename:
-                 e.filename = fname
-             raise
-@@ -2455,7 +2455,7 @@ class File(Base):
-         try:
-             cs = SCons.Util.MD5filesignature(fname,
-                 chunksize=SCons.Node.FS.File.md5_chunksize*1024)
--        except EnvironmentError, e:
-+        except EnvironmentError as e:
-             if not e.filename:
-                 e.filename = fname
-             raise
-@@ -2793,7 +2793,7 @@ class File(Base):
-     def _rmv_existing(self):
-         self.clear_memoized_values()
-         if print_duplicate:
--            print "dup: removing existing target %s"%self
-+            print("dup: removing existing target %s"%self)
-         e = Unlink(self, [], None)
-         if isinstance(e, SCons.Errors.BuildError):
-             raise e
-@@ -2817,7 +2817,7 @@ class File(Base):
-             else:
-                 try:
-                     self._createDir()
--                except SCons.Errors.StopError, drive:
-+                except SCons.Errors.StopError as drive:
-                     desc = "No drive `%s' for target `%s'." % (drive, self)
-                     raise SCons.Errors.StopError(desc)
-@@ -2835,7 +2835,7 @@ class File(Base):
-     def do_duplicate(self, src):
-         self._createDir()
-         if print_duplicate:
--            print "dup: relinking variant '%s' from '%s'"%(self, src)
-+            print("dup: relinking variant '%s' from '%s'"%(self, src))
-         Unlink(self, None, None)
-         e = Link(self, src, None)
-         if isinstance(e, SCons.Errors.BuildError):
-@@ -2870,7 +2870,7 @@ class File(Base):
-                         # The source file does not exist.  Make sure no old
-                         # copy remains in the variant directory.
-                         if print_duplicate:
--                            print "dup: no src for %s, unlinking old variant copy"%self
-+                            print("dup: no src for %s, unlinking old variant copy"%self)
-                         if Base.exists(self) or self.islink():
-                             self.fs.unlink(self.path)
-                         # Return None explicitly because the Base.exists() call
-@@ -3199,7 +3199,7 @@ class FileFinder(object):
-         if verbose and not callable(verbose):
-             if not SCons.Util.is_String(verbose):
-                 verbose = "find_file"
--            _verbose = u'  %s: ' % verbose
-+            _verbose = '  %s: ' % verbose
-             verbose = lambda s: sys.stdout.write(_verbose + s)
-         filedir, filename = os.path.split(filename)
---- a/engine/SCons/SConf.py
-+++ b/engine/SCons/SConf.py
-@@ -239,7 +239,7 @@ class SConfBuildTask(SCons.Taskmaster.Al
-                 # Earlier versions of Python don't have sys.excepthook...
-                 def excepthook(type, value, tb):
-                     traceback.print_tb(tb)
--                    print type, value
-+                    print(type, value)
-             excepthook(*self.exc_info())
-         return SCons.Taskmaster.Task.failed(self)
-@@ -332,7 +332,7 @@ class SConfBuildTask(SCons.Taskmaster.Al
-             except SystemExit:
-                 exc_value = sys.exc_info()[1]
-                 raise SCons.Errors.ExplicitExit(self.targets[0],exc_value.code)
--            except Exception, e:
-+            except Exception as e:
-                 for t in self.targets:
-                     binfo = t.get_binfo()
-                     binfo.__class__ = SConfBuildInfo
---- a/engine/SCons/Script/Interactive.py
-+++ b/engine/SCons/Script/Interactive.py
-@@ -129,12 +129,12 @@ class SConsInteractiveCmd(cmd.Cmd):
-             self.shell_variable = 'SHELL'
-     def default(self, argv):
--        print "*** Unknown command: %s" % argv[0]
-+        print("*** Unknown command: %s" % argv[0])
-     def onecmd(self, line):
-         line = line.strip()
-         if not line:
--            print self.lastcmd
-+            print(self.lastcmd)
-             return self.emptyline()
-         self.lastcmd = line
-         if line[0] == '!':
-@@ -274,7 +274,7 @@ class SConsInteractiveCmd(cmd.Cmd):
-         return self.do_build(['build', '--clean'] + argv[1:])
-     def do_EOF(self, argv):
--        print
-+        print()
-         self.do_exit(argv)
-     def _do_one_help(self, arg):
-@@ -357,7 +357,7 @@ class SConsInteractiveCmd(cmd.Cmd):
-             # Doing the right thing with an argument list currently
-             # requires different shell= values on Windows and Linux.
-             p = subprocess.Popen(argv, shell=(sys.platform=='win32'))
--        except EnvironmentError, e:
-+        except EnvironmentError as e:
-             sys.stderr.write('scons: %s: %s\n' % (argv[0], e.strerror))
-         else:
-             p.wait()
---- a/engine/SCons/Script/Main.py
-+++ b/engine/SCons/Script/Main.py
-@@ -224,7 +224,7 @@ class BuildTask(SCons.Taskmaster.OutOfDa
-                     self.exception_set()
-                 self.do_failed()
-             else:
--                print "scons: Nothing to be done for `%s'." % t
-+                print("scons: Nothing to be done for `%s'." % t)
-                 SCons.Taskmaster.OutOfDateTask.executed(self)
-         else:
-             SCons.Taskmaster.OutOfDateTask.executed(self)
-@@ -290,8 +290,8 @@ class BuildTask(SCons.Taskmaster.OutOfDa
-             if self.options.debug_includes:
-                 tree = t.render_include_tree()
-                 if tree:
--                    print
--                    print tree
-+                    print()
-+                    print(tree)
-         SCons.Taskmaster.OutOfDateTask.postprocess(self)
-     def make_ready(self):
-@@ -326,10 +326,10 @@ class CleanTask(SCons.Taskmaster.AlwaysT
-                 else:
-                     errstr = "Path '%s' exists but isn't a file or directory."
-                     raise SCons.Errors.UserError(errstr % (pathstr))
--        except SCons.Errors.UserError, e:
--            print e
--        except (IOError, OSError), e:
--            print "scons: Could not remove '%s':" % pathstr, e.strerror
-+        except SCons.Errors.UserError as e:
-+            print(e)
-+        except (IOError, OSError) as e:
-+            print("scons: Could not remove '%s':" % pathstr, e.strerror)
-     def show(self):
-         target = self.targets[0]
-@@ -348,13 +348,13 @@ class CleanTask(SCons.Taskmaster.AlwaysT
-             for t in self.targets:
-                 try:
-                     removed = t.remove()
--                except OSError, e:
-+                except OSError as e:
-                     # An OSError may indicate something like a permissions
-                     # issue, an IOError would indicate something like
-                     # the file not existing.  In either case, print a
-                     # message and keep going to try to remove as many
-                     # targets aa possible.
--                    print "scons: Could not remove '%s':" % str(t), e.strerror
-+                    print("scons: Could not remove '%s':" % str(t), e.strerror)
-                 else:
-                     if removed:
-                         display("Removed " + str(t))
-@@ -595,7 +595,7 @@ def _scons_internal_error():
-     """Handle all errors but user errors. Print out a message telling
-     the user what to do in this case and print a normal trace.
-     """
--    print 'internal error'
-+    print('internal error')
-     traceback.print_exc()
-     sys.exit(2)
-@@ -707,7 +707,7 @@ def _load_site_scons_dir(topdir, site_di
-                 # the error checking makes it longer.
-                 try:
-                     m = sys.modules['SCons.Script']
--                except Exception, e:
-+                except Exception as e:
-                     fmt = 'cannot import site_init.py: missing SCons.Script module %s'
-                     raise SCons.Errors.InternalError(fmt % repr(e))
-                 try:
-@@ -720,10 +720,10 @@ def _load_site_scons_dir(topdir, site_di
-                             site_m[k] = m.__dict__[k]
-                     # This is the magic.
--                    exec fp in site_m
-+                    exec(fp.read()) in site_m
-                 except KeyboardInterrupt:
-                     raise
--                except Exception, e:
-+                except Exception as e:
-                     fmt = '*** Error loading site_init file %s:\n'
-                     sys.stderr.write(fmt % repr(site_init_file))
-                     raise
-@@ -733,7 +733,7 @@ def _load_site_scons_dir(topdir, site_di
-                             m.__dict__[k] = site_m[k]
-             except KeyboardInterrupt:
-                 raise
--            except ImportError, e:
-+            except ImportError as e:
-                 fmt = '*** cannot import site init file %s:\n'
-                 sys.stderr.write(fmt % repr(site_init_file))
-                 raise
-@@ -785,7 +785,7 @@ def _load_all_site_scons_dirs(topdir, ve
-     dirs=sysdirs + [topdir]
-     for d in dirs:
-         if verbose:    # this is used by unit tests.
--            print "Loading site dir ", d
-+            print("Loading site dir ", d)
-         _load_site_scons_dir(d)
- def test_load_all_site_scons_dirs(d):
-@@ -976,7 +976,7 @@ def _main(parser):
-     try:
-         for script in scripts:
-             SCons.Script._SConscript._SConscript(fs, script)
--    except SCons.Errors.StopError, e:
-+    except SCons.Errors.StopError as e:
-         # We had problems reading an SConscript file, such as it
-         # couldn't be copied in to the VariantDir.  Since we're just
-         # reading SConscript files and haven't started building
-@@ -1032,8 +1032,8 @@ def _main(parser):
-             # SConscript files.  Give them the options usage.
-             raise SConsPrintHelpException
-         else:
--            print help_text
--            print "Use scons -H for help about command-line options."
-+            print(help_text)
-+            print("Use scons -H for help about command-line options.")
-         exit_status = 0
-         return
-@@ -1296,7 +1296,7 @@ def _exec_main(parser, values):
-         prof = Profile()
-         try:
-             prof.runcall(_main, parser)
--        except SConsPrintHelpException, e:
-+        except SConsPrintHelpException as e:
-             prof.dump_stats(options.profile_file)
-             raise e
-         except SystemExit:
-@@ -1340,22 +1340,22 @@ def main():
-     
-     try:
-         _exec_main(parser, values)
--    except SystemExit, s:
-+    except SystemExit as s:
-         if s:
-             exit_status = s
-     except KeyboardInterrupt:
-         print("scons: Build interrupted.")
-         sys.exit(2)
--    except SyntaxError, e:
-+    except SyntaxError as e:
-         _scons_syntax_error(e)
-     except SCons.Errors.InternalError:
-         _scons_internal_error()
--    except SCons.Errors.UserError, e:
-+    except SCons.Errors.UserError as e:
-         _scons_user_error(e)
-     except SConsPrintHelpException:
-         parser.print_help()
-         exit_status = 0
--    except SCons.Errors.BuildError, e:
-+    except SCons.Errors.BuildError as e:
-         exit_status = e.exitstatus
-     except:
-         # An exception here is likely a builtin Python exception Python
-@@ -1391,10 +1391,10 @@ def main():
-             else:
-                 ct = last_command_end - first_command_start
-         scons_time = total_time - sconscript_time - ct
--        print "Total build time: %f seconds"%total_time
--        print "Total SConscript file execution time: %f seconds"%sconscript_time
--        print "Total SCons execution time: %f seconds"%scons_time
--        print "Total command execution time: %f seconds"%ct
-+        print("Total build time: %f seconds"%total_time)
-+        print("Total SConscript file execution time: %f seconds"%sconscript_time)
-+        print("Total SCons execution time: %f seconds"%scons_time)
-+        print("Total command execution time: %f seconds"%ct)
-     sys.exit(exit_status)
---- a/engine/SCons/Script/SConscript.py
-+++ b/engine/SCons/Script/SConscript.py
-@@ -113,7 +113,7 @@ def compute_exports(exports):
-                     retval[export] = loc[export]
-                 except KeyError:
-                     retval[export] = glob[export]
--    except KeyError, x:
-+    except KeyError as x:
-         raise SCons.Errors.UserError("Export of non-existent variable '%s'"%x)
-     return retval
-@@ -145,7 +145,7 @@ def Return(*vars, **kw):
-         for var in fvars:
-             for v in var.split():
-                 retval.append(call_stack[-1].globals[v])
--    except KeyError, x:
-+    except KeyError as x:
-         raise SCons.Errors.UserError("Return of non-existent variable '%s'"%x)
-     if len(retval) == 1:
-@@ -174,7 +174,7 @@ def _SConscript(fs, *files, **kw):
-         try:
-             SCons.Script.sconscript_reading = SCons.Script.sconscript_reading + 1
-             if fn == "-":
--                exec sys.stdin in call_stack[-1].globals
-+                exec(sys.stdin.read()) in call_stack[-1].globals
-             else:
-                 if isinstance(fn, SCons.Node.Node):
-                     f = fn
-@@ -257,7 +257,7 @@ def _SConscript(fs, *files, **kw):
-                         pass
-                     try:
-                         try:
--                            exec _file_ in call_stack[-1].globals
-+                            exec(_file_.read()) in call_stack[-1].globals
-                         except SConscriptReturn:
-                             pass
-                     finally:
-@@ -282,7 +282,7 @@ def _SConscript(fs, *files, **kw):
-                 rdir._create()  # Make sure there's a directory there.
-                 try:
-                     os.chdir(rdir.get_abspath())
--                except OSError, e:
-+                except OSError as e:
-                     # We still couldn't chdir there, so raise the error,
-                     # but only if actions are being executed.
-                     #
-@@ -467,8 +467,8 @@ class SConsEnvironment(SCons.Environment
-                 scons_ver_string = '%d.%d.%d' % (major, minor, revision)
-             else:
-                 scons_ver_string = '%d.%d' % (major, minor)
--            print "SCons %s or greater required, but you have SCons %s" % \
--                  (scons_ver_string, SCons.__version__)
-+            print("SCons %s or greater required, but you have SCons %s" % \
-+                  (scons_ver_string, SCons.__version__))
-             sys.exit(2)
-     def EnsurePythonVersion(self, major, minor):
-@@ -480,7 +480,7 @@ class SConsEnvironment(SCons.Environment
-             python_ver = self._get_major_minor_revision(sys.version)[:2]
-         if python_ver < (major, minor):
-             v = sys.version.split(" ", 1)[0]
--            print "Python %d.%d or greater required, but you have Python %s" %(major,minor,v)
-+            print("Python %d.%d or greater required, but you have Python %s" %(major,minor,v))
-             sys.exit(2)
-     def Exit(self, value=0):
-@@ -519,7 +519,7 @@ class SConsEnvironment(SCons.Environment
-                             globals[v] = exports[v]
-                         else:
-                             globals[v] = global_exports[v]
--        except KeyError,x:
-+        except KeyError as x:
-             raise SCons.Errors.UserError("Import of non-existent variable '%s'"%x)
-     def SConscript(self, *ls, **kw):
---- a/engine/SCons/Taskmaster.py
-+++ b/engine/SCons/Taskmaster.py
-@@ -107,7 +107,7 @@ fmt = "%(considered)3d "\
- def dump_stats():
-     for n in sorted(StatsNodes, key=lambda a: str(a)):
--        print (fmt % n.stats.__dict__) + str(n)
-+        print((fmt % n.stats.__dict__) + str(n))
-@@ -164,7 +164,7 @@ class Task(object):
-         """
-         global print_prepare
-         T = self.tm.trace
--        if T: T.write(self.trace_message(u'Task.prepare()', self.node))
-+        if T: T.write(self.trace_message('Task.prepare()', self.node))
-         # Now that it's the appropriate time, give the TaskMaster a
-         # chance to raise any exceptions it encountered while preparing
-@@ -189,13 +189,13 @@ class Task(object):
-         executor.prepare()
-         for t in executor.get_action_targets():
-             if print_prepare:
--                print "Preparing target %s..."%t
-+                print("Preparing target %s..."%t)
-                 for s in t.side_effects:
--                    print "...with side-effect %s..."%s
-+                    print("...with side-effect %s..."%s)
-             t.prepare()
-             for s in t.side_effects:
-                 if print_prepare:
--                    print "...Preparing side-effect %s..."%s
-+                    print("...Preparing side-effect %s..."%s)
-                 s.prepare()
-     def get_target(self):
-@@ -224,7 +224,7 @@ class Task(object):
-         prepare(), executed() or failed().
-         """
-         T = self.tm.trace
--        if T: T.write(self.trace_message(u'Task.execute()', self.node))
-+        if T: T.write(self.trace_message('Task.execute()', self.node))
-         try:
-             everything_was_cached = 1
-@@ -248,7 +248,7 @@ class Task(object):
-             raise
-         except SCons.Errors.BuildError:
-             raise
--        except Exception, e:
-+        except Exception as e:
-             buildError = SCons.Errors.convert_to_BuildError(e)
-             buildError.node = self.targets[0]
-             buildError.exc_info = sys.exc_info()
-@@ -376,7 +376,7 @@ class Task(object):
-         This is the default behavior for building only what's necessary.
-         """
-         T = self.tm.trace
--        if T: T.write(self.trace_message(u'Task.make_ready_current()',
-+        if T: T.write(self.trace_message('Task.make_ready_current()',
-                                          self.node))
-         self.out_of_date = []
-@@ -386,7 +386,7 @@ class Task(object):
-                 t.disambiguate().make_ready()
-                 is_up_to_date = not t.has_builder() or \
-                                 (not t.always_build and t.is_up_to_date())
--            except EnvironmentError, e:
-+            except EnvironmentError as e:
-                 raise SCons.Errors.BuildError(node=t, errstr=e.strerror, filename=e.filename)
-             if not is_up_to_date:
-@@ -421,7 +421,7 @@ class Task(object):
-         that can be put back on the candidates list.
-         """
-         T = self.tm.trace
--        if T: T.write(self.trace_message(u'Task.postprocess()', self.node))
-+        if T: T.write(self.trace_message('Task.postprocess()', self.node))
-         # We may have built multiple targets, some of which may have
-         # common parents waiting for this build.  Count up how many
-@@ -438,7 +438,7 @@ class Task(object):
-             # A node can only be in the pending_children set if it has
-             # some waiting_parents.
-             if t.waiting_parents:
--                if T: T.write(self.trace_message(u'Task.postprocess()',
-+                if T: T.write(self.trace_message('Task.postprocess()',
-                                                  t,
-                                                  'removing'))
-                 pending_children.discard(t)
-@@ -457,7 +457,7 @@ class Task(object):
-         for p, subtract in parents.items():
-             p.ref_count = p.ref_count - subtract
--            if T: T.write(self.trace_message(u'Task.postprocess()',
-+            if T: T.write(self.trace_message('Task.postprocess()',
-                                              p,
-                                              'adjusted parent ref count'))
-             if p.ref_count == 0:
-@@ -517,7 +517,9 @@ class Task(object):
-         except ValueError:
-             exc_type, exc_value = exc
-             exc_traceback = None
--        raise exc_type, exc_value, exc_traceback
-+        e = exc_type(exc_value)
-+        e.__traceback__ = exc_traceback
-+        raise e
- class AlwaysTask(Task):
-     def needs_execute(self):
-@@ -741,12 +743,12 @@ class Taskmaster(object):
-         self.ready_exc = None
-         T = self.trace
--        if T: T.write(u'\n' + self.trace_message('Looking for a node to evaluate'))
-+        if T: T.write('\n' + self.trace_message('Looking for a node to evaluate'))
-         while True:
-             node = self.next_candidate()
-             if node is None:
--                if T: T.write(self.trace_message('No candidate anymore.') + u'\n')
-+                if T: T.write(self.trace_message('No candidate anymore.') + '\n')
-                 return None
-             node = node.disambiguate()
-@@ -769,7 +771,7 @@ class Taskmaster(object):
-             else:
-                 S = None
--            if T: T.write(self.trace_message(u'    Considering node %s and its children:' % self.trace_node(node)))
-+            if T: T.write(self.trace_message('    Considering node %s and its children:' % self.trace_node(node)))
-             if state == NODE_NO_STATE:
-                 # Mark this node as being on the execution stack:
-@@ -777,7 +779,7 @@ class Taskmaster(object):
-             elif state > NODE_PENDING:
-                 # Skip this node if it has already been evaluated:
-                 if S: S.already_handled = S.already_handled + 1
--                if T: T.write(self.trace_message(u'       already handled (executed)'))
-+                if T: T.write(self.trace_message('       already handled (executed)'))
-                 continue
-             executor = node.get_executor()
-@@ -790,7 +792,7 @@ class Taskmaster(object):
-                 self.ready_exc = (SCons.Errors.ExplicitExit, e)
-                 if T: T.write(self.trace_message('       SystemExit'))
-                 return node
--            except Exception, e:
-+            except Exception as e:
-                 # We had a problem just trying to figure out the
-                 # children (like a child couldn't be linked in to a
-                 # VariantDir, or a Scanner threw something).  Arrange to
-@@ -808,7 +810,7 @@ class Taskmaster(object):
-             for child in chain(executor.get_all_prerequisites(), children):
-                 childstate = child.get_state()
--                if T: T.write(self.trace_message(u'       ' + self.trace_node(child)))
-+                if T: T.write(self.trace_message('       ' + self.trace_node(child)))
-                 if childstate == NODE_NO_STATE:
-                     children_not_visited.append(child)
-@@ -867,7 +869,7 @@ class Taskmaster(object):
-                     # count so we can be put back on the list for
-                     # re-evaluation when they've all finished.
-                     node.ref_count =  node.ref_count + child.add_to_waiting_parents(node)
--                    if T: T.write(self.trace_message(u'     adjusted ref count: %s, child %s' %
-+                    if T: T.write(self.trace_message('     adjusted ref count: %s, child %s' %
-                                   (self.trace_node(node), repr(str(child)))))
-                 if T:
-@@ -893,7 +895,7 @@ class Taskmaster(object):
-             # The default when we've gotten through all of the checks above:
-             # this node is ready to be built.
-             if S: S.build = S.build + 1
--            if T: T.write(self.trace_message(u'Evaluating %s\n' %
-+            if T: T.write(self.trace_message('Evaluating %s\n' %
-                                              self.trace_node(node)))
-             # For debugging only:
---- a/engine/SCons/Tool/FortranCommon.py
-+++ b/engine/SCons/Tool/FortranCommon.py
-@@ -61,7 +61,7 @@ def isfortran(env, source):
- def _fortranEmitter(target, source, env):
-     node = source[0].rfile()
-     if not node.exists() and not node.is_derived():
--       print "Could not locate " + str(node.name)
-+       print("Could not locate " + str(node.name))
-        return ([], [])
-     mod_regex = """(?i)^\s*MODULE\s+(?!PROCEDURE)(\w+)"""
-     cre = re.compile(mod_regex,re.M)
-@@ -167,7 +167,7 @@ def add_fortran_to_env(env):
-     except KeyError:
-         FortranSuffixes = ['.f', '.for', '.ftn']
--    #print "Adding %s to fortran suffixes" % FortranSuffixes
-+    #print("Adding %s to fortran suffixes" % FortranSuffixes)
-     try:
-         FortranPPSuffixes = env['FORTRANPPFILESUFFIXES']
-     except KeyError:
-@@ -191,7 +191,7 @@ def add_f77_to_env(env):
-     except KeyError:
-         F77Suffixes = ['.f77']
--    #print "Adding %s to f77 suffixes" % F77Suffixes
-+    #print("Adding %s to f77 suffixes" % F77Suffixes)
-     try:
-         F77PPSuffixes = env['F77PPFILESUFFIXES']
-     except KeyError:
-@@ -206,7 +206,7 @@ def add_f90_to_env(env):
-     except KeyError:
-         F90Suffixes = ['.f90']
--    #print "Adding %s to f90 suffixes" % F90Suffixes
-+    #print("Adding %s to f90 suffixes" % F90Suffixes)
-     try:
-         F90PPSuffixes = env['F90PPFILESUFFIXES']
-     except KeyError:
-@@ -222,7 +222,7 @@ def add_f95_to_env(env):
-     except KeyError:
-         F95Suffixes = ['.f95']
--    #print "Adding %s to f95 suffixes" % F95Suffixes
-+    #print("Adding %s to f95 suffixes" % F95Suffixes)
-     try:
-         F95PPSuffixes = env['F95PPFILESUFFIXES']
-     except KeyError:
-@@ -238,7 +238,7 @@ def add_f03_to_env(env):
-     except KeyError:
-         F03Suffixes = ['.f03']
--    #print "Adding %s to f95 suffixes" % F95Suffixes
-+    #print("Adding %s to f95 suffixes" % F95Suffixes)
-     try:
-         F03PPSuffixes = env['F03PPFILESUFFIXES']
-     except KeyError:
---- a/engine/SCons/Tool/intelc.py
-+++ b/engine/SCons/Tool/intelc.py
-@@ -205,17 +205,17 @@ def get_all_compiler_versions():
-                         # Registry points to nonexistent dir.  Ignore this
-                         # version.
-                         value = get_intel_registry_value('ProductDir', subkey, 'IA32')
--                    except MissingRegistryError, e:
-+                    except MissingRegistryError as e:
-                         # Registry key is left dangling (potentially
-                         # after uninstalling).
--                        print \
-+                        print(\
-                             "scons: *** Ignoring the registry key for the Intel compiler version %s.\n" \
-                             "scons: *** It seems that the compiler was uninstalled and that the registry\n" \
--                            "scons: *** was not cleaned up properly.\n" % subkey
-+                            "scons: *** was not cleaned up properly.\n" % subkey)
-                     else:
--                        print "scons: *** Ignoring "+str(value)
-+                        print("scons: *** Ignoring "+str(value))
-                 i = i + 1
-         except EnvironmentError:
-@@ -294,7 +294,7 @@ def get_intel_compiler_top(version, abi)
-                     break
-             return top
-         top = find_in_2010style_dir(version) or find_in_2008style_dir(version)
--        print "INTELC: top=",top
-+        print("INTELC: top=",top)
-         if not top:
-             raise MissingDirError("Can't find version %s Intel compiler in %s (abi='%s')"%(version,top, abi))
-     return top
-@@ -394,8 +394,8 @@ def generate(env, version=None, abi=None
-             bindir="bin"
-             libdir="lib"
-         if verbose:
--            print "Intel C compiler: using version %s (%g), abi %s, in '%s/%s'"%\
--                  (repr(version), linux_ver_normalize(version),abi,topdir,bindir)
-+            print("Intel C compiler: using version %s (%g), abi %s, in '%s/%s'"%\
-+                  (repr(version), linux_ver_normalize(version),abi,topdir,bindir))
-             if is_linux:
-                 # Show the actual compiler version by running the compiler.
-                 os.system('%s/%s/icc --version'%(topdir,bindir))
-@@ -439,7 +439,7 @@ def generate(env, version=None, abi=None
-                     env.PrependENVPath(p[0], os.path.join(topdir, p[2]))
-                 else:
-                     env.PrependENVPath(p[0], path.split(os.pathsep))
--                    # print "ICL %s: %s, final=%s"%(p[0], path, str(env['ENV'][p[0]]))
-+                    # print("ICL %s: %s, final=%s"%(p[0], path, str(env['ENV'][p[0]])))
-     if is_windows:
-         env['CC']        = 'icl'
---- a/engine/SCons/Tool/MSCommon/common.py
-+++ b/engine/SCons/Tool/MSCommon/common.py
-@@ -38,7 +38,7 @@ import SCons.Util
- logfile = os.environ.get('SCONS_MSCOMMON_DEBUG')
- if logfile == '-':
-     def debug(x):
--        print x
-+        print(x)
- elif logfile:
-     try:
-         import logging
---- a/engine/SCons/Tool/mslink.py
-+++ b/engine/SCons/Tool/mslink.py
-@@ -186,7 +186,7 @@ def RegServerFunc(target, source, env):
-         if ret:
-             raise SCons.Errors.UserError("Unable to register %s" % target[0])
-         else:
--            print "Registered %s sucessfully" % target[0]
-+            print("Registered %s sucessfully" % target[0])
-         return ret
-     return 0
-@@ -203,10 +203,10 @@ def embedManifestDllCheck(target, source
-         if os.path.exists(manifestSrc):
-             ret = (embedManifestDllAction) ([target[0]],None,env)        
-             if ret:
--                raise SCons.Errors.UserError, "Unable to embed manifest into %s" % (target[0])
-+                raise SCons.Errors.UserError("Unable to embed manifest into %s" % (target[0]))
-             return ret
-         else:
--            print '(embed: no %s.manifest found; not embedding.)'%str(target[0])
-+            print('(embed: no %s.manifest found; not embedding.)'%str(target[0]))
-     return 0
- def embedManifestExeCheck(target, source, env):
-@@ -217,10 +217,10 @@ def embedManifestExeCheck(target, source
-         if os.path.exists(manifestSrc):
-             ret = (embedManifestExeAction) ([target[0]],None,env)
-             if ret:
--                raise SCons.Errors.UserError, "Unable to embed manifest into %s" % (target[0])
-+                raise SCons.Errors.UserError("Unable to embed manifest into %s" % (target[0]))
-             return ret
-         else:
--            print '(embed: no %s.manifest found; not embedding.)'%str(target[0])
-+            print('(embed: no %s.manifest found; not embedding.)'%str(target[0]))
-     return 0
- embedManifestDllCheckAction = SCons.Action.Action(embedManifestDllCheck, None)
---- a/engine/SCons/Tool/msvs.py
-+++ b/engine/SCons/Tool/msvs.py
-@@ -195,7 +195,7 @@ def makeHierarchy(sources):
-                 dict = dict[part]
-             dict[path[-1]] = file
-         #else:
--        #    print 'Warning: failed to decompose path for '+str(file)
-+        #    print('Warning: failed to decompose path for '+str(file))
-     return hierarchy
- class _DSPGenerator(object):
-@@ -351,7 +351,7 @@ class _DSPGenerator(object):
-                 config.platform = 'Win32'
-             self.configs[variant] = config
--            print "Adding '" + self.name + ' - ' + config.variant + '|' + config.platform + "' to '" + str(dspfile) + "'"
-+            print("Adding '" + self.name + ' - ' + config.variant + '|' + config.platform + "' to '" + str(dspfile) + "'")
-         for i in range(len(variants)):
-             AddConfig(self, variants[i], buildtarget[i], outdir[i], runfile[i], cmdargs)
-@@ -551,7 +551,7 @@ class _GenerateV6DSP(_DSPGenerator):
-     def Build(self):
-         try:
-             self.file = open(self.dspabs,'w')
--        except IOError, detail:
-+        except IOError as detail:
-             raise SCons.Errors.InternalError('Unable to open "' + self.dspabs + '" for writing:' + str(detail))
-         else:
-             self.PrintHeader()
-@@ -865,7 +865,7 @@ class _GenerateV7DSP(_DSPGenerator):
-     def Build(self):
-         try:
-             self.file = open(self.dspabs,'w')
--        except IOError, detail:
-+        except IOError as detail:
-             raise SCons.Errors.InternalError('Unable to open "' + self.dspabs + '" for writing:' + str(detail))
-         else:
-             self.PrintHeader()
-@@ -1033,7 +1033,7 @@ class _GenerateV10DSP(_DSPGenerator):
-         self.filtersabs = self.dspabs + '.filters'
-         try:
-             self.filters_file = open(self.filtersabs, 'w')
--        except IOError, detail:
-+        except IOError as detail:
-             raise SCons.Errors.InternalError('Unable to open "' + self.filtersabs + '" for writing:' + str(detail))
-             
-         self.filters_file.write('<?xml version="1.0" encoding="utf-8"?>\n'
-@@ -1105,7 +1105,7 @@ class _GenerateV10DSP(_DSPGenerator):
-         cats = sorted([k for k in categories.keys() if self.sources[k]],
-                             key = lambda a: a.lower())
-         
--        # print vcxproj.filters file first
-+        # print(vcxproj.filters file first)
-         self.filters_file.write('\t<ItemGroup>\n')
-         for kind in cats:
-             self.filters_file.write('\t\t<Filter Include="%s">\n'
-@@ -1135,7 +1135,7 @@ class _GenerateV10DSP(_DSPGenerator):
-             
-         self.filters_file.write('\t</ItemGroup>\n')
-             
--        # then print files and filters
-+        # then print(files and filters)
-         for kind in cats:
-             self.file.write('\t<ItemGroup>\n')
-             self.filters_file.write('\t<ItemGroup>\n')
-@@ -1170,12 +1170,12 @@ class _GenerateV10DSP(_DSPGenerator):
-                         '\t</ItemGroup>\n' % str(self.sconscript))
-     def Parse(self):
--        print "_GenerateV10DSP.Parse()"
-+        print("_GenerateV10DSP.Parse()")
-     def Build(self):
-         try:
-             self.file = open(self.dspabs, 'w')
--        except IOError, detail:
-+        except IOError as detail:
-             raise SCons.Errors.InternalError('Unable to open "' + self.dspabs + '" for writing:' + str(detail))
-         else:
-             self.PrintHeader()
-@@ -1252,7 +1252,7 @@ class _GenerateV7DSW(_DSWGenerator):
-                 config.platform = 'Win32'
-             self.configs[variant] = config
--            print "Adding '" + self.name + ' - ' + config.variant + '|' + config.platform + "' to '" + str(dswfile) + "'"
-+            print("Adding '" + self.name + ' - ' + config.variant + '|' + config.platform + "' to '" + str(dswfile) + "'")
-         if 'variant' not in env:
-             raise SCons.Errors.InternalError("You must specify a 'variant' argument (i.e. 'Debug' or " +\
-@@ -1431,7 +1431,7 @@ class _GenerateV7DSW(_DSWGenerator):
-     def Build(self):
-         try:
-             self.file = open(self.dswfile,'w')
--        except IOError, detail:
-+        except IOError as detail:
-             raise SCons.Errors.InternalError('Unable to open "' + self.dswfile + '" for writing:' + str(detail))
-         else:
-             self.PrintSolution()
-@@ -1480,7 +1480,7 @@ class _GenerateV6DSW(_DSWGenerator):
-     def Build(self):
-         try:
-             self.file = open(self.dswfile,'w')
--        except IOError, detail:
-+        except IOError as detail:
-             raise SCons.Errors.InternalError('Unable to open "' + self.dswfile + '" for writing:' + str(detail))
-         else:
-             self.PrintWorkspace()
-@@ -1537,8 +1537,8 @@ def GenerateProject(target, source, env)
-     if not dspfile is builddspfile:
-         try:
-             bdsp = open(str(builddspfile), "w+")
--        except IOError, detail:
--            print 'Unable to open "' + str(dspfile) + '" for writing:',detail,'\n'
-+        except IOError as detail:
-+            print('Unable to open "' + str(dspfile) + '" for writing:',detail,'\n')
-             raise
-         bdsp.write("This is just a placeholder file.\nThe real project file is here:\n%s\n" % dspfile.get_abspath())
-@@ -1553,8 +1553,8 @@ def GenerateProject(target, source, env)
-             try:
-                 bdsw = open(str(builddswfile), "w+")
--            except IOError, detail:
--                print 'Unable to open "' + str(dspfile) + '" for writing:',detail,'\n'
-+            except IOError as detail:
-+                print('Unable to open "' + str(dspfile) + '" for writing:',detail,'\n')
-                 raise
-             bdsw.write("This is just a placeholder file.\nThe real workspace file is here:\n%s\n" % dswfile.get_abspath())
---- a/engine/SCons/Tool/qt.py
-+++ b/engine/SCons/Tool/qt.py
-@@ -130,12 +130,12 @@ class _Automoc(object):
-             if not obj.has_builder():
-                 # binary obj file provided
-                 if debug:
--                    print "scons: qt: '%s' seems to be a binary. Discarded." % str(obj)
-+                    print("scons: qt: '%s' seems to be a binary. Discarded." % str(obj))
-                 continue
-             cpp = obj.sources[0]
-             if not splitext(str(cpp))[1] in cxx_suffixes:
-                 if debug:
--                    print "scons: qt: '%s' is no cxx file. Discarded." % str(cpp) 
-+                    print("scons: qt: '%s' is no cxx file. Discarded." % str(cpp) )
-                 # c or fortran source
-                 continue
-             #cpp_contents = comment.sub('', cpp.get_text_contents())
-@@ -148,12 +148,12 @@ class _Automoc(object):
-                 h = find_file(hname, (cpp.get_dir(),), env.File)
-                 if h:
-                     if debug:
--                        print "scons: qt: Scanning '%s' (header of '%s')" % (str(h), str(cpp))
-+                        print("scons: qt: Scanning '%s' (header of '%s')" % (str(h), str(cpp)))
-                     #h_contents = comment.sub('', h.get_text_contents())
-                     h_contents = h.get_text_contents()
-                     break
-             if not h and debug:
--                print "scons: qt: no header for '%s'." % (str(cpp))
-+                print("scons: qt: no header for '%s'." % (str(cpp)))
-             if h and q_object_search.search(h_contents):
-                 # h file with the Q_OBJECT macro found -> add moc_cpp
-                 moc_cpp = env.Moc(h)
-@@ -161,14 +161,14 @@ class _Automoc(object):
-                 out_sources.append(moc_o)
-                 #moc_cpp.target_scanner = SCons.Defaults.CScan
-                 if debug:
--                    print "scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(h), str(moc_cpp))
-+                    print("scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(h), str(moc_cpp)))
-             if cpp and q_object_search.search(cpp_contents):
-                 # cpp file with Q_OBJECT macro found -> add moc
-                 # (to be included in cpp)
-                 moc = env.Moc(cpp)
-                 env.Ignore(moc, moc)
-                 if debug:
--                    print "scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(cpp), str(moc))
-+                    print("scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(cpp), str(moc)))
-                 #moc.source_scanner = SCons.Defaults.CScan
-         # restore the original env attributes (FIXME)
-         objBuilder.env = objBuilderEnv
---- a/engine/SCons/Tool/tex.py
-+++ b/engine/SCons/Tool/tex.py
-@@ -147,15 +147,15 @@ def FindFile(name,suffixes,paths,env,req
-         if ext:
-             name = name + ext
-     if Verbose:
--        print " searching for '%s' with extensions: " % name,suffixes
-+        print(" searching for '%s' with extensions: " % name,suffixes)
-     for path in paths:
-         testName = os.path.join(path,name)
-         if Verbose:
--            print " look for '%s'" % testName
-+            print(" look for '%s'" % testName)
-         if os.path.isfile(testName):
-             if Verbose:
--                print " found '%s'" % testName
-+                print(" found '%s'" % testName)
-             return env.fs.File(testName)
-         else:
-             name_ext = SCons.Util.splitext(testName)[1]
-@@ -166,14 +166,14 @@ def FindFile(name,suffixes,paths,env,req
-             for suffix in suffixes:
-                 testNameExt = testName + suffix
-                 if Verbose:
--                    print " look for '%s'" % testNameExt
-+                    print(" look for '%s'" % testNameExt)
-                 if os.path.isfile(testNameExt):
-                     if Verbose:
--                        print " found '%s'" % testNameExt
-+                        print(" found '%s'" % testNameExt)
-                     return env.fs.File(testNameExt)
-     if Verbose:
--        print " did not find '%s'" % name
-+        print(" did not find '%s'" % name)
-     return None
- def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None):
-@@ -232,7 +232,7 @@ def InternalLaTeXAuxAction(XXXLaTeXActio
-         saved_hashes[suffix] = theNode.get_csig()
-     if Verbose:
--        print "hashes: ",saved_hashes
-+        print("hashes: ",saved_hashes)
-     must_rerun_latex = True
-@@ -248,12 +248,12 @@ def InternalLaTeXAuxAction(XXXLaTeXActio
-         if saved_hashes[suffix] == new_md5:
-             if Verbose:
--                print "file %s not changed" % (targetbase+suffix)
-+                print("file %s not changed" % (targetbase+suffix))
-             return False        # unchanged
-         saved_hashes[suffix] = new_md5
-         must_rerun_latex = True
-         if Verbose:
--            print "file %s changed, rerunning Latex, new hash = " % (targetbase+suffix), new_md5
-+            print("file %s changed, rerunning Latex, new hash = " % (targetbase+suffix), new_md5)
-         return True     # changed
-     # generate the file name that latex will generate
-@@ -292,7 +292,7 @@ def InternalLaTeXAuxAction(XXXLaTeXActio
-             auxfiles = list(dups.keys())
-         if Verbose:
--            print "auxfiles ",auxfiles
-+            print("auxfiles ",auxfiles)
-         # Now decide if bibtex will need to be run.
-         # The information that bibtex reads from the .aux file is
-@@ -306,7 +306,7 @@ def InternalLaTeXAuxAction(XXXLaTeXActio
-                     content = open(target_aux, "rb").read()
-                     if content.find("bibdata") != -1:
-                         if Verbose:
--                            print "Need to run bibtex"
-+                            print("Need to run bibtex")
-                         bibfile = env.fs.File(SCons.Util.splitext(target_aux)[0])
-                         result = BibTeXAction(bibfile, bibfile, env)
-                         if result != 0:
-@@ -317,7 +317,7 @@ def InternalLaTeXAuxAction(XXXLaTeXActio
-         if check_MD5(suffix_nodes['.idx'],'.idx') or (count == 1 and run_makeindex):
-             # We must run makeindex
-             if Verbose:
--                print "Need to run makeindex"
-+                print("Need to run makeindex")
-             idxfile = suffix_nodes['.idx']
-             result = MakeIndexAction(idxfile, idxfile, env)
-             if result != 0:
-@@ -335,7 +335,7 @@ def InternalLaTeXAuxAction(XXXLaTeXActio
-         if check_MD5(suffix_nodes['.nlo'],'.nlo') or (count == 1 and run_nomenclature):
-             # We must run makeindex
-             if Verbose:
--                print "Need to run makeindex for nomenclature"
-+                print("Need to run makeindex for nomenclature")
-             nclfile = suffix_nodes['.nlo']
-             result = MakeNclAction(nclfile, nclfile, env)
-             if result != 0:
-@@ -347,7 +347,7 @@ def InternalLaTeXAuxAction(XXXLaTeXActio
-         if check_MD5(suffix_nodes['.glo'],'.glo') or (count == 1 and run_glossaries) or (count == 1 and run_glossary):
-             # We must run makeindex
-             if Verbose:
--                print "Need to run makeindex for glossary"
-+                print("Need to run makeindex for glossary")
-             glofile = suffix_nodes['.glo']
-             result = MakeGlossaryAction(glofile, glofile, env)
-             if result != 0:
-@@ -359,7 +359,7 @@ def InternalLaTeXAuxAction(XXXLaTeXActio
-         if check_MD5(suffix_nodes['.acn'],'.acn') or (count == 1 and run_acronyms):
-             # We must run makeindex
-             if Verbose:
--                print "Need to run makeindex for acronyms"
-+                print("Need to run makeindex for acronyms")
-             acrfile = suffix_nodes['.acn']
-             result = MakeAcronymsAction(acrfile, acrfile, env)
-             if result != 0:
-@@ -371,26 +371,26 @@ def InternalLaTeXAuxAction(XXXLaTeXActio
-         if warning_rerun_re.search(logContent):
-             must_rerun_latex = True
-             if Verbose:
--                print "rerun Latex due to latex or package rerun warning"
-+                print("rerun Latex due to latex or package rerun warning")
-         if rerun_citations_re.search(logContent):
-             must_rerun_latex = True
-             if Verbose:
--                print "rerun Latex due to 'Rerun to get citations correct' warning"
-+                print("rerun Latex due to 'Rerun to get citations correct' warning")
-         if undefined_references_re.search(logContent):
-             must_rerun_latex = True
-             if Verbose:
--                print "rerun Latex due to undefined references or citations"
-+                print("rerun Latex due to undefined references or citations")
-         if (count >= int(env.subst('$LATEXRETRIES')) and must_rerun_latex):
--            print "reached max number of retries on Latex ,",int(env.subst('$LATEXRETRIES'))
-+            print("reached max number of retries on Latex ,",int(env.subst('$LATEXRETRIES')))
- # end of while loop
-     # rename Latex's output to what the target name is
-     if not (str(target[0]) == resultfilename  and  os.path.isfile(resultfilename)):
-         if os.path.isfile(resultfilename):
--            print "move %s to %s" % (resultfilename, str(target[0]), )
-+            print("move %s to %s" % (resultfilename, str(target[0]), ))
-             shutil.move(resultfilename,str(target[0]))
-     # Original comment (when TEXPICTS was not restored):
-@@ -444,27 +444,27 @@ def is_LaTeX(flist,env,abspath):
-     else:
-         env['ENV']['TEXINPUTS'] = savedpath
-     if Verbose:
--        print "is_LaTeX search path ",paths
--        print "files to search :",flist
-+        print("is_LaTeX search path ",paths)
-+        print("files to search :",flist)
-     # Now that we have the search path and file list, check each one
-     for f in flist:
-         if Verbose:
--            print " checking for Latex source ",str(f)
-+            print(" checking for Latex source ",str(f))
-         content = f.get_text_contents()
-         if LaTeX_re.search(content):
-             if Verbose:
--                print "file %s is a LaTeX file" % str(f)
-+                print("file %s is a LaTeX file" % str(f))
-             return 1
-         if Verbose:
--            print "file %s is not a LaTeX file" % str(f)
-+            print("file %s is not a LaTeX file" % str(f))
-         # now find included files
-         inc_files = [ ]
-         inc_files.extend( include_re.findall(content) )
-         if Verbose:
--            print "files included by '%s': "%str(f),inc_files
-+            print("files included by '%s': "%str(f),inc_files)
-         # inc_files is list of file names as given. need to find them
-         # using TEXINPUTS paths.
-@@ -474,7 +474,7 @@ def is_LaTeX(flist,env,abspath):
-             # make this a list since is_LaTeX takes a list.
-             fileList = [srcNode,]
-             if Verbose:
--                print "FindFile found ",srcNode
-+                print("FindFile found ",srcNode)
-             if srcNode is not None:
-                 file_test = is_LaTeX(fileList, env, abspath)
-@@ -483,7 +483,7 @@ def is_LaTeX(flist,env,abspath):
-                 return file_test
-         if Verbose:
--            print " done scanning ",str(f)
-+            print(" done scanning ",str(f))
-     return 0
-@@ -548,7 +548,7 @@ def ScanFiles(theFile, target, paths, fi
-     content = theFile.get_text_contents()
-     if Verbose:
--        print " scanning ",str(theFile)
-+        print(" scanning ",str(theFile))
-     for i in range(len(file_tests_search)):
-         if file_tests[i][0] is None:
-@@ -558,12 +558,12 @@ def ScanFiles(theFile, target, paths, fi
-     if incResult:
-         aux_files.append(os.path.join(targetdir, incResult.group(1)))
-     if Verbose:
--        print "\include file names : ", aux_files
-+        print("\include file names : ", aux_files)
-     # recursively call this on each of the included files
-     inc_files = [ ]
-     inc_files.extend( include_re.findall(content) )
-     if Verbose:
--        print "files included by '%s': "%str(theFile),inc_files
-+        print("files included by '%s': "%str(theFile),inc_files)
-     # inc_files is list of file names as given. need to find them
-     # using TEXINPUTS paths.
-@@ -572,7 +572,7 @@ def ScanFiles(theFile, target, paths, fi
-         if srcNode is not None:
-             file_tests = ScanFiles(srcNode, target, paths, file_tests, file_tests_search, env, graphics_extensions, targetdir, aux_files)
-     if Verbose:
--        print " done scanning ",str(theFile)
-+        print(" done scanning ",str(theFile))
-     return file_tests
- def tex_emitter_core(target, source, env, graphics_extensions):
-@@ -602,7 +602,7 @@ def tex_emitter_core(target, source, env
-     env.SideEffect(logfilename,target[0])
-     env.SideEffect(flsfilename,target[0])
-     if Verbose:
--        print "side effect :",auxfilename,logfilename,flsfilename
-+        print("side effect :",auxfilename,logfilename,flsfilename)
-     env.Clean(target[0],auxfilename)
-     env.Clean(target[0],logfilename)
-     env.Clean(target[0],flsfilename)
-@@ -671,7 +671,7 @@ def tex_emitter_core(target, source, env
-     else:
-         env['ENV']['TEXINPUTS'] = savedpath
-     if Verbose:
--        print "search path ",paths
-+        print("search path ",paths)
-     aux_files = []
-     file_tests = ScanFiles(source[0], target, paths, file_tests, file_tests_search, env, graphics_extensions, targetdir, aux_files)
-@@ -692,14 +692,14 @@ def tex_emitter_core(target, source, env
-                 for suffix in suffix_list[:-1]:
-                     env.SideEffect(file_name + suffix,target[0])
-                     if Verbose:
--                        print "side effect :",file_name + suffix
-+                        print("side effect :",file_name + suffix)
-                     env.Clean(target[0],file_name + suffix)
-     for aFile in aux_files:
-         aFile_base = SCons.Util.splitext(aFile)[0]
-         env.SideEffect(aFile_base + '.aux',target[0])
-         if Verbose:
--            print "side effect :",aFile_base + '.aux'
-+            print("side effect :",aFile_base + '.aux')
-         env.Clean(target[0],aFile_base + '.aux')
-     # read fls file to get all other files that latex creates and will read on the next pass
-     # remove files from list that we explicitly dealt with above
-@@ -712,7 +712,7 @@ def tex_emitter_core(target, source, env
-                 out_files.remove(filename)
-         env.SideEffect(out_files,target[0])
-         if Verbose:
--            print "side effect :",out_files
-+            print("side effect :",out_files)
-         env.Clean(target[0],out_files)
-     return (target, source)
---- a/engine/SCons/Action.py
-+++ b/engine/SCons/Action.py
-@@ -553,7 +553,7 @@ class _ActionAction(ActionBase):
-                 source = executor.get_all_sources()
-             t = ' and '.join(map(str, target))
-             l = '\n  '.join(self.presub_lines(env))
--            out = u"Building %s with action:\n  %s\n" % (t, l)
-+            out = "Building %s with action:\n  %s\n" % (t, l)
-             sys.stdout.write(out)
-         cmd = None
-         if show and self.strfunction:
-@@ -672,7 +672,7 @@ def _subproc(scons_env, cmd, error = 'ig
-     try:
-         return subprocess.Popen(cmd, **kw)
--    except EnvironmentError, e:
-+    except EnvironmentError as e:
-         if error == 'raise': raise
-         # return a dummy Popen instance that only returns error
-         class dummyPopen(object):
-@@ -1060,11 +1060,11 @@ class FunctionAction(_ActionAction):
-             rsources = list(map(rfile, source))
-             try:
-                 result = self.execfunction(target=target, source=rsources, env=env)
--            except KeyboardInterrupt, e:
-+            except KeyboardInterrupt as e:
-                 raise
--            except SystemExit, e:
-+            except SystemExit as e:
-                 raise
--            except Exception, e:
-+            except Exception as e:
-                 result = e
-                 exc_info = sys.exc_info()
---- a/engine/SCons/Builder.py
-+++ b/engine/SCons/Builder.py
-@@ -167,7 +167,7 @@ class DictCmdGenerator(SCons.Util.Select
-         try:
-             ret = SCons.Util.Selector.__call__(self, env, source, ext)
--        except KeyError, e:
-+        except KeyError as e:
-             raise UserError("Ambiguous suffixes after environment substitution: %s == %s == %s" % (e.args[0], e.args[1], e.args[2]))
-         if ret is None:
-             raise UserError("While building `%s' from `%s': Don't know how to build from a source file with suffix `%s'.  Expected a suffix in this list: %s." % \
---- a/engine/SCons/Defaults.py
-+++ b/engine/SCons/Defaults.py
-@@ -221,7 +221,7 @@ def mkdir_func(dest):
-     for entry in dest:
-         try:
-             os.makedirs(str(entry))
--        except os.error, e:
-+        except os.error as e:
-             p = str(entry)
-             if (e.args[0] == errno.EEXIST or
-                     (sys.platform=='win32' and e.args[0]==183)) \
---- a/engine/SCons/Job.py
-+++ b/engine/SCons/Job.py
-@@ -278,14 +278,14 @@ else:
-             try:
-                 prev_size = threading.stack_size(stack_size*1024) 
--            except AttributeError, e:
-+            except AttributeError as e:
-                 # Only print a warning if the stack size has been
-                 # explicitly set.
-                 if not explicit_stack_size is None:
-                     msg = "Setting stack size is unsupported by this version of Python:\n    " + \
-                         e.args[0]
-                     SCons.Warnings.warn(SCons.Warnings.StackSizeWarning, msg)
--            except ValueError, e:
-+            except ValueError as e:
-                 msg = "Setting stack size failed:\n    " + str(e)
-                 SCons.Warnings.warn(SCons.Warnings.StackSizeWarning, msg)
---- a/engine/SCons/Node/__init__.py
-+++ b/engine/SCons/Node/__init__.py
-@@ -370,7 +370,7 @@ class Node(object):
-         """
-         try:
-             self.get_executor()(self, **kw)
--        except SCons.Errors.BuildError, e:
-+        except SCons.Errors.BuildError as e:
-             e.node = self
-             raise
-@@ -826,7 +826,7 @@ class Node(object):
-         """Adds dependencies."""
-         try:
-             self._add_child(self.depends, self.depends_set, depend)
--        except TypeError, e:
-+        except TypeError as e:
-             e = e.args[0]
-             if SCons.Util.is_List(e):
-                 s = list(map(str, e))
-@@ -843,7 +843,7 @@ class Node(object):
-         """Adds dependencies to ignore."""
-         try:
-             self._add_child(self.ignore, self.ignore_set, depend)
--        except TypeError, e:
-+        except TypeError as e:
-             e = e.args[0]
-             if SCons.Util.is_List(e):
-                 s = list(map(str, e))
-@@ -857,7 +857,7 @@ class Node(object):
-             return
-         try:
-             self._add_child(self.sources, self.sources_set, source)
--        except TypeError, e:
-+        except TypeError as e:
-             e = e.args[0]
-             if SCons.Util.is_List(e):
-                 s = list(map(str, e))
---- a/engine/SCons/Platform/posix.py
-+++ b/engine/SCons/Platform/posix.py
-@@ -77,7 +77,7 @@ def exec_fork(l, env): 
-         exitval = 127
-         try:
-             os.execvpe(l[0], l, env)
--        except OSError, e:
-+        except OSError as e:
-             exitval = exitvalmap.get(e[0], e[0])
-             sys.stderr.write("scons: %s: %s\n" % (l[0], e[1]))
-         os._exit(exitval)
-@@ -125,8 +125,8 @@ def process_cmd_output(cmd_stdout, cmd_s
-                 else:
-                     #sys.__stderr__.write( "str(stderr) = %s\n" % str )
-                     stderr.write(str)
--        except select.error, (_errno, _strerror):
--            if _errno != errno.EINTR:
-+        except OSError as e:
-+            if e.errno != errno.EINTR:
-                 raise
- def exec_popen3(l, env, stdout, stderr):
-@@ -164,7 +164,7 @@ def exec_piped_fork(l, env, stdout, stde
-         exitval = 127
-         try:
-             os.execvpe(l[0], l, env)
--        except OSError, e:
-+        except OSError as e:
-             exitval = exitvalmap.get(e[0], e[0])
-             stderr.write("scons: %s: %s\n" % (l[0], e[1]))
-         os._exit(exitval)
---- a/engine/SCons/Platform/win32.py
-+++ b/engine/SCons/Platform/win32.py
-@@ -125,7 +125,7 @@ def piped_spawn(sh, escape, cmd, args, e
-         try:
-             args = [sh, '/C', escape(' '.join(args)) ]
-             ret = os.spawnve(os.P_WAIT, sh, args, env)
--        except OSError, e:
-+        except OSError as e:
-             # catch any error
-             try:
-                 ret = exitvalmap[e[0]]
-@@ -153,7 +153,7 @@ def piped_spawn(sh, escape, cmd, args, e
- def exec_spawn(l, env):
-     try:
-         result = os.spawnve(os.P_WAIT, l[0], l, env)
--    except OSError, e:
-+    except OSError as e:
-         try:
-             result = exitvalmap[e[0]]
-             sys.stderr.write("scons: %s: %s\n" % (l[0], e[1]))
---- a/engine/SCons/Scanner/C.py
-+++ b/engine/SCons/Scanner/C.py
-@@ -59,7 +59,7 @@ class SConsCPPScanner(SCons.cpp.PreProce
-     def read_file(self, file):
-         try:
-             fp = open(str(file.rfile()))
--        except EnvironmentError, e:
-+        except EnvironmentError as e:
-             self.missing.append((file, self.current_file))
-             return ''
-         else:
---- a/engine/SCons/Script/SConsOptions.py
-+++ b/engine/SCons/Script/SConsOptions.py
-@@ -161,7 +161,7 @@ class SConsValues(optparse.Values):
-         elif name == 'diskcheck':
-             try:
-                 value = diskcheck_convert(value)
--            except ValueError, v:
-+            except ValueError as v:
-                 raise SCons.Errors.UserError("Not a valid diskcheck value: %s"%v)
-             if 'diskcheck' not in self.__dict__:
-                 # No --diskcheck= option was specified on the command line.
-@@ -629,7 +629,7 @@ def Parser(version):
-     def opt_diskcheck(option, opt, value, parser):
-         try:
-             diskcheck_value = diskcheck_convert(value)
--        except ValueError, e:
-+        except ValueError as e:
-             raise OptionValueError("Warning: `%s' is not a valid diskcheck type" % e)
-         setattr(parser.values, option.dest, diskcheck_value)
---- a/engine/SCons/Subst.py
-+++ b/engine/SCons/Subst.py
-@@ -438,7 +438,7 @@ def scons_subst(strSubst, env, mode=SUBS
-                             s = eval(key, self.gvars, lvars)
-                         except KeyboardInterrupt:
-                             raise
--                        except Exception, e:
-+                        except Exception as e:
-                             if e.__class__ in AllowableExceptions:
-                                 return ''
-                             raise_exception(e, lvars['TARGETS'], s)
-@@ -653,7 +653,7 @@ def scons_subst_list(strSubst, env, mode
-                             s = eval(key, self.gvars, lvars)
-                         except KeyboardInterrupt:
-                             raise
--                        except Exception, e:
-+                        except Exception as e:
-                             if e.__class__ in AllowableExceptions:
-                                 return
-                             raise_exception(e, lvars['TARGETS'], s)
---- a/engine/SCons/Tool/filesystem.py
-+++ b/engine/SCons/Tool/filesystem.py
-@@ -66,7 +66,7 @@ def generate(env):
-     try:
-         env['BUILDERS']['CopyTo']
-         env['BUILDERS']['CopyAs']
--    except KeyError, e:
-+    except KeyError as e:
-         global copyToBuilder
-         if copyToBuilder is None:
-             copyToBuilder = SCons.Builder.Builder(
---- a/engine/SCons/Tool/__init__.py
-+++ b/engine/SCons/Tool/__init__.py
-@@ -110,7 +110,7 @@ class Tool(object):
-                 finally:
-                     if file:
-                         file.close()
--            except ImportError, e:
-+            except ImportError as e:
-                 if str(e)!="No module named %s"%self.name:
-                     raise SCons.Errors.EnvironmentError(e)
-                 try:
-@@ -122,7 +122,7 @@ class Tool(object):
-                         try:
-                             importer = zipimport.zipimporter(aPath)
-                             return importer.load_module(self.name)
--                        except ImportError, e:
-+                        except ImportError as e:
-                             pass
-         finally:
-             sys.path = oldpythonpath
-@@ -140,7 +140,7 @@ class Tool(object):
-                     if file:
-                         file.close()
-                     return module
--                except ImportError, e:
-+                except ImportError as e:
-                     if str(e)!="No module named %s"%self.name:
-                         raise SCons.Errors.EnvironmentError(e)
-                     try:
-@@ -149,10 +149,10 @@ class Tool(object):
-                         module = importer.load_module(full_name)
-                         setattr(SCons.Tool, self.name, module)
-                         return module
--                    except ImportError, e:
-+                    except ImportError as e:
-                         m = "No tool named '%s': %s" % (self.name, e)
-                         raise SCons.Errors.EnvironmentError(m)
--            except ImportError, e:
-+            except ImportError as e:
-                 m = "No tool named '%s': %s" % (self.name, e)
-                 raise SCons.Errors.EnvironmentError(m)
---- a/engine/SCons/Tool/install.py
-+++ b/engine/SCons/Tool/install.py
-@@ -81,21 +81,21 @@ def scons_copytree(src, dst, symlinks=Fa
-             else:
-                 shutil.copy2(srcname, dstname)
-             # XXX What about devices, sockets etc.?
--        except (IOError, os.error), why:
-+        except (IOError, os.error) as why:
-             errors.append((srcname, dstname, str(why)))
-         # catch the CopytreeError from the recursive copytree so that we can
-         # continue with other files
--        except CopytreeError, err:
-+        except CopytreeError as err:
-             errors.extend(err.args[0])
-     try:
-         shutil.copystat(src, dst)
-     except WindowsError:
-         # can't copy file access times on Windows
-         pass
--    except OSError, why:
-+    except OSError as why:
-         errors.extend((src, dst, str(why)))
-     if errors:
--        raise CopytreeError, errors
-+        raise CopytreeError(errors)
- #
---- a/engine/SCons/Tool/MSCommon/netframework.py
-+++ b/engine/SCons/Tool/MSCommon/netframework.py
-@@ -40,7 +40,7 @@ def find_framework_root():
-     try:
-         froot = read_reg(_FRAMEWORKDIR_HKEY_ROOT)
-         debug("Found framework install root in registry: %s" % froot)
--    except WindowsError, e:
-+    except WindowsError as e:
-         debug("Could not read reg key %s" % _FRAMEWORKDIR_HKEY_ROOT)
-         return None
---- a/engine/SCons/Tool/MSCommon/sdk.py
-+++ b/engine/SCons/Tool/MSCommon/sdk.py
-@@ -80,7 +80,7 @@ class SDKDefinition(object):
-         try:
-             sdk_dir = common.read_reg(hkey)
--        except WindowsError, e:
-+        except WindowsError as e:
-             debug('find_sdk_dir(): no SDK registry key %s' % repr(hkey))
-             return None
-@@ -299,7 +299,7 @@ def get_cur_sdk_dir_from_reg():
-     try:
-         val = common.read_reg(_CURINSTALLED_SDK_HKEY_ROOT)
-         debug("Found current sdk dir in registry: %s" % val)
--    except WindowsError, e:
-+    except WindowsError as e:
-         debug("Did not find current sdk in registry")
-         return None
---- a/engine/SCons/Tool/MSCommon/vc.py
-+++ b/engine/SCons/Tool/MSCommon/vc.py
-@@ -117,13 +117,13 @@ def get_host_target(env):
-         
-     try:
-         host = _ARCH_TO_CANONICAL[host_platform.lower()]
--    except KeyError, e:
-+    except KeyError as e:
-         msg = "Unrecognized host architecture %s"
-         raise ValueError(msg % repr(host_platform))
-     try:
-         target = _ARCH_TO_CANONICAL[target_platform.lower()]
--    except KeyError, e:
-+    except KeyError as e:
-         raise ValueError("Unrecognized target architecture %s" % target_platform)
-     return (host, target,req_target_platform)
-@@ -161,7 +161,7 @@ def msvc_version_to_maj_min(msvc_version
-        maj = int(t[0])
-        min = int(t[1])
-        return maj, min
--   except ValueError, e:
-+   except ValueError as e:
-        raise ValueError("Unrecognized version %s (%s)" % (msvc_version,msvc_version_numeric))
- def is_host_target_supported(host_target, msvc_version):
-@@ -210,7 +210,7 @@ def find_vc_pdir(msvc_version):
-         key = root + key
-         try:
-             comps = common.read_reg(key)
--        except WindowsError, e:
-+        except WindowsError as e:
-             debug('find_vc_dir(): no VC registry key %s' % repr(key))
-         else:
-             debug('find_vc_dir(): found VC in registry: %s' % comps)
-@@ -282,7 +282,7 @@ def get_installed_vcs():
-                 installed_versions.append(ver)
-             else:
-                 debug('find_vc_pdir return None for ver %s' % ver)
--        except VisualCException, e:
-+        except VisualCException as e:
-             debug('did not find VC %s: caught exception %s' % (ver, str(e)))
-     return installed_versions
-@@ -376,7 +376,7 @@ def msvc_find_valid_batch_script(env,ver
-         try:
-             (vc_script,sdk_script) = find_batch_file(env,version,host_platform,tp)
-             debug('vc.py:msvc_find_valid_batch_script() vc_script:%s sdk_script:%s'%(vc_script,sdk_script))
--        except VisualCException, e:
-+        except VisualCException as e:
-             msg = str(e)
-             debug('Caught exception while looking for batch file (%s)' % msg)
-             warn_msg = "VC version %s not installed.  " + \
-@@ -391,14 +391,14 @@ def msvc_find_valid_batch_script(env,ver
-         if vc_script:
-             try:
-                 d = script_env(vc_script, args=arg)
--            except BatchFileExecutionError, e:
-+            except BatchFileExecutionError as e:
-                 debug('vc.py:msvc_find_valid_batch_script() use_script 3: failed running VC script %s: %s: Error:%s'%(repr(vc_script),arg,e))
-                 vc_script=None
-         if not vc_script and sdk_script:
-             debug('vc.py:msvc_find_valid_batch_script() use_script 4: trying sdk script: %s'%(sdk_script))
-             try:
-                 d = script_env(sdk_script,args=[])
--            except BatchFileExecutionError,e:
-+            except BatchFileExecutionError as e:
-                 debug('vc.py:msvc_find_valid_batch_script() use_script 5: failed running SDK script %s: Error:%s'%(repr(sdk_script),e))
-                 continue
-         elif not vc_script and not sdk_script:
---- a/engine/SCons/Tool/MSCommon/vs.py
-+++ b/engine/SCons/Tool/MSCommon/vs.py
-@@ -85,7 +85,7 @@ class VisualStudio(object):
-             key = root + key
-             try:
-                 comps = read_reg(key)
--            except WindowsError, e:
-+            except WindowsError as e:
-                 debug('find_vs_dir_by_reg(): no VS registry key %s' % repr(key))
-             else:
-                 debug('find_vs_dir_by_reg(): found VS in registry: %s' % comps)
---- a/engine/SCons/Tool/packaging/__init__.py
-+++ b/engine/SCons/Tool/packaging/__init__.py
-@@ -120,7 +120,7 @@ def Package(env, target=None, source=Non
-         try:
-             file,path,desc=imp.find_module(type, __path__)
-             return imp.load_module(type, file, path, desc)
--        except ImportError, e:
-+        except ImportError as e:
-             raise EnvironmentError("packager %s not available: %s"%(type,str(e)))
-     packagers=list(map(load_packager, PACKAGETYPE))
-@@ -141,7 +141,7 @@ def Package(env, target=None, source=Non
-         if 'PACKAGEROOT' not in kw:
-             kw['PACKAGEROOT'] = default_name%kw
--    except KeyError, e:
-+    except KeyError as e:
-         raise SCons.Errors.UserError( "Missing Packagetag '%s'"%e.args[0] )
-     # setup the source files
-@@ -157,10 +157,10 @@ def Package(env, target=None, source=Non
-         assert( len(target) == 0 )
--    except KeyError, e:
-+    except KeyError as e:
-         raise SCons.Errors.UserError( "Missing Packagetag '%s' for %s packager"\
-                                       % (e.args[0],packager.__name__) )
--    except TypeError, e:
-+    except TypeError as e:
-         # this exception means that a needed argument for the packager is
-         # missing. As our packagers get their "tags" as named function
-         # arguments we need to find out which one is missing.
---- a/engine/SCons/Tool/packaging/msi.py
-+++ b/engine/SCons/Tool/packaging/msi.py
-@@ -216,7 +216,7 @@ def build_wxsfile(target, source, env):
-         if 'CHANGE_SPECFILE' in env:
-             env['CHANGE_SPECFILE'](target, source)
--    except KeyError, e:
-+    except KeyError as e:
-         raise SCons.Errors.UserError( '"%s" package field for MSI is missing.' % e.args[0] )
- #
---- a/engine/SCons/Tool/packaging/rpm.py
-+++ b/engine/SCons/Tool/packaging/rpm.py
-@@ -115,7 +115,7 @@ def collectintargz(target, source, env):
-     try:
-         #tarball = env['SOURCE_URL'].split('/')[-1]
-         tarball = env['SOURCE_URL'].split('/')[-1]
--    except KeyError, e:
-+    except KeyError as e:
-         raise SCons.Errors.UserError( "Missing PackageTag '%s' for RPM packager" % e.args[0] )
-     tarball = src_targz.package(env, source=sources, target=tarball,
-@@ -151,7 +151,7 @@ def build_specfile(target, source, env):
-         if 'CHANGE_SPECFILE' in env:
-             env['CHANGE_SPECFILE'](target, source)
--    except KeyError, e:
-+    except KeyError as e:
-         raise SCons.Errors.UserError( '"%s" package field for RPM is missing.' % e.args[0] )
-@@ -339,7 +339,7 @@ class SimpleTagCompiler(object):
-         for key, replacement in domestic:
-             try:
-                 str = str + replacement % values[key]
--            except KeyError, e:
-+            except KeyError as e:
-                 if self.mandatory:
-                     raise e
-@@ -352,7 +352,7 @@ class SimpleTagCompiler(object):
-                 int_values_for_key = [(get_country_code(t[0]),t[1]) for t in x]
-                 for v in int_values_for_key:
-                     str = str + replacement % v
--            except KeyError, e:
-+            except KeyError as e:
-                 if self.mandatory:
-                     raise e
---- a/engine/SCons/Tool/textfile.py
-+++ b/engine/SCons/Tool/textfile.py
-@@ -107,7 +107,7 @@ def _action(target, source, env):
-     # write the file
-     try:
-         fd = open(target[0].get_path(), "wb")
--    except (OSError,IOError), e:
-+    except (OSError,IOError) as e:
-         raise SCons.Errors.UserError("Can't write target file %s" % target[0])
-     # separate lines by 'linesep' only if linesep is not empty
-     lsep = None
---- a/engine/SCons/Variables/__init__.py
-+++ b/engine/SCons/Variables/__init__.py
-@@ -170,7 +170,7 @@ class Variables(object):
-                     sys.path.insert(0, dir)
-                 try:
-                     values['__name__'] = filename
--                    exec open(filename, 'rU').read() in {}, values
-+                    exec(open(filename, 'rU').read() in {}, values)
-                 finally:
-                     if dir:
-                         del sys.path[0]
-@@ -206,7 +206,7 @@ class Variables(object):
-                         env[option.key] = option.converter(value)
-                     except TypeError:
-                         env[option.key] = option.converter(value, env)
--                except ValueError, x:
-+                except ValueError as x:
-                     raise SCons.Errors.UserError('Error converting option: %s\n%s'%(option.key, x))
-@@ -268,7 +268,7 @@ class Variables(object):
-             finally:
-                 fh.close()
--        except IOError, x:
-+        except IOError as x:
-             raise SCons.Errors.UserError('Error writing options to file: %s\n%s' % (filename, x))
-     def GenerateHelpText(self, env, sort=None):
---- a/engine/SCons/Script/__init__.py
-+++ b/engine/SCons/Script/__init__.py
-@@ -364,7 +364,7 @@ GlobalDefaultBuilders = [
- ]
- for name in GlobalDefaultEnvironmentFunctions + GlobalDefaultBuilders:
--    exec "%s = _SConscript.DefaultEnvironmentCall(%s)" % (name, repr(name))
-+    exec("%s = _SConscript.DefaultEnvironmentCall(%s)" % (name, repr(name)))
- del name
- # There are a handful of variables that used to live in the