summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJo-Philipp Wich <jow@openwrt.org>2012-05-06 17:04:37 +0000
committerJo-Philipp Wich <jow@openwrt.org>2012-05-06 17:04:37 +0000
commit9a34f9d01e04ae80e1eba30deaf7fc8382d01706 (patch)
treec922031a86dd7b5a47af5ad9be806dc01f960740
parent30362b90af13efeaa6841293c5bf8c97ebd43035 (diff)
downloadmtk-20170518-9a34f9d01e04ae80e1eba30deaf7fc8382d01706.zip
mtk-20170518-9a34f9d01e04ae80e1eba30deaf7fc8382d01706.tar.gz
mtk-20170518-9a34f9d01e04ae80e1eba30deaf7fc8382d01706.tar.bz2
scons: fix compatibility with python 3, upstream still does not support it...
SVN-Revision: 31624
-rw-r--r--tools/scons/patches/100-python3-compat.patch2046
1 files changed, 2046 insertions, 0 deletions
diff --git a/tools/scons/patches/100-python3-compat.patch b/tools/scons/patches/100-python3-compat.patch
new file mode 100644
index 0000000..42a0351
--- /dev/null
+++ b/tools/scons/patches/100-python3-compat.patch
@@ -0,0 +1,2046 @@
+--- 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