From 33a373ba41d978af60c2f0230bcba6ad27357ec8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andreas=20M=C3=BCller?= <schnitzeltony@gmail.com>
Date: Wed, 29 Jan 2020 16:25:11 +0100
Subject: [PATCH] Port build to python3
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* first tool of choice was 2to3
* some parts were taken from [1] but during work it was found that this patch
  introduces interesting effects - see hash functions. Working more on this
  makes me guess that one has never worked...
* Few parts were taken from upstream mirror [2]. Since they use six for porting
  to python3 it adds us a new dependency.
* To get a better overview what is going on or failing some additional messages
  were added. The most verbose one is left disabled - see
  python/mozbuild/mozbuild/configure/__init__.py / Line 310 onwards
* major changes upstream on build are not to expect so upgrading should cause
  little trouble and changes can be tracked by [3]
* some solutions are workarounds/hacks so this patch will not be accepted
  upstream. This should not be a problem for us: once mozjs >= 68 will arrive
  we have to go to rust/cargo based build anyway.

[1] https://code.foxkit.us/adelie/packages/blob/f2b5773da19ab397fbe64fd32dacc383cfe4cd77/user/mozjs/python3.patch
[2] https://github.com/mozilla/gecko-dev
[3] https://github.com/mozilla/gecko-dev/tree/esr60

Upstream-Status: Inappropriate [Some Hacks]

Signed-off-by: Andreas Müller <schnitzeltony@gmail.com>
---
 build/autoconf/config.status.m4               |   2 +-
 build/moz.configure/android-ndk.configure     |   4 +-
 build/moz.configure/checks.configure          |   4 +-
 build/moz.configure/init.configure            |  31 +-
 build/moz.configure/keyfiles.configure        |   4 +-
 build/moz.configure/old.configure             |  32 +-
 build/moz.configure/toolchain.configure       |  18 +-
 build/moz.configure/util.configure            |   9 +-
 build/moz.configure/windows.configure         |  10 +-
 build/templates.mozbuild                      |   2 +-
 config/MozZipFile.py                          |  12 +-
 config/expandlibs.py                          |   6 +-
 config/expandlibs_exec.py                     |  14 +-
 config/expandlibs_gen.py                      |   4 +-
 configure.py                                  |  42 +-
 js/src/build/moz.build                        |   8 +-
 js/src/builtin/embedjs.py                     |  10 +-
 js/src/configure                              |   2 +-
 js/src/frontend/GenerateReservedWords.py      |   6 +-
 js/src/gc/GenerateStatsPhases.py              |   4 +-
 js/src/old-configure.in                       |   2 +
 memory/build/moz.build                        |   8 +-
 mozglue/build/moz.build                       |  22 +-
 .../mozbuild/mozbuild/action/check_binary.py  |   2 +
 .../mozbuild/action/process_define_files.py   |   4 +-
 python/mozbuild/mozbuild/backend/base.py      |   8 +-
 python/mozbuild/mozbuild/backend/common.py    |   8 +-
 .../mozbuild/backend/configenvironment.py     |  14 +-
 .../mozbuild/mozbuild/backend/fastermake.py   |  10 +-
 .../mozbuild/backend/recursivemake.py         | 181 +++----
 python/mozbuild/mozbuild/config_status.py     |   7 +-
 .../mozbuild/mozbuild/configure/__init__.py   |  83 +++-
 .../mozbuild/configure/check_debug_ranges.py  |   6 +-
 python/mozbuild/mozbuild/configure/options.py |  24 +-
 python/mozbuild/mozbuild/configure/util.py    |  12 +-
 .../mozbuild/mozbuild/controller/building.py  |  16 +-
 python/mozbuild/mozbuild/frontend/context.py  |  89 ++--
 python/mozbuild/mozbuild/frontend/data.py     |   8 +-
 python/mozbuild/mozbuild/frontend/emitter.py  |  50 +-
 python/mozbuild/mozbuild/frontend/reader.py   |  49 +-
 python/mozbuild/mozbuild/frontend/sandbox.py  |   3 +-
 python/mozbuild/mozbuild/jar.py               |  12 +-
 python/mozbuild/mozbuild/makeutil.py          |  24 +-
 python/mozbuild/mozbuild/mozinfo.py           |   8 +-
 python/mozbuild/mozbuild/preprocessor.py      |  27 +-
 python/mozbuild/mozbuild/shellutil.py         |   6 +-
 .../test/backend/test_recursivemake.py        |  18 +-
 .../mozbuild/test/configure/common.py         |   8 +-
 .../mozbuild/mozbuild/test/configure/lint.py  |   8 +-
 .../test/configure/test_checks_configure.py   |   8 +-
 .../test/configure/test_compile_checks.py     |   4 +-
 .../mozbuild/test/configure/test_configure.py | 244 +++++-----
 .../mozbuild/test/configure/test_lint.py      |  24 +-
 .../test/configure/test_moz_configure.py      |  32 +-
 .../mozbuild/test/configure/test_options.py   | 450 +++++++++---------
 .../configure/test_toolchain_configure.py     |  22 +-
 .../test/configure/test_toolchain_helpers.py  |  62 +--
 .../configure/test_toolkit_moz_configure.py   |   2 +-
 .../mozbuild/test/configure/test_util.py      |   8 +-
 python/mozbuild/mozbuild/testing.py           |  10 +-
 python/mozbuild/mozbuild/util.py              |  79 ++-
 python/mozbuild/mozbuild/virtualenv.py        |   6 +-
 python/mozbuild/mozpack/chrome/manifest.py    |   6 +-
 python/mozbuild/mozpack/copier.py             |  12 +-
 python/mozbuild/mozpack/files.py              |  22 +-
 python/mozbuild/mozpack/manifests.py          |  16 +-
 python/mozbuild/mozpack/mozjar.py             |  37 +-
 .../manifestparser/manifestparser/ini.py      |  13 +-
 .../manifestparser/manifestparser.py          |  24 +-
 testing/mozbase/mozinfo/mozinfo/mozinfo.py    |  26 +-
 .../mozprocess/mozprocess/processhandler.py   |  10 +-
 third_party/python/which/which.py             |  18 +-
 72 files changed, 1081 insertions(+), 993 deletions(-)

diff --git a/build/autoconf/config.status.m4 b/build/autoconf/config.status.m4
index c75575386..543c2d682 100644
--- a/build/autoconf/config.status.m4
+++ b/build/autoconf/config.status.m4
@@ -122,7 +122,7 @@ trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
 
 dnl We're going to need [ ] for python syntax.
 changequote(<<<, >>>)dnl
-echo creating $CONFIG_STATUS
+echo creating $CONFIG_STATUS in `pwd`
 
 cat > $CONFIG_STATUS <<EOF
 
diff --git a/build/moz.configure/android-ndk.configure b/build/moz.configure/android-ndk.configure
index 1067b8619..3b592a237 100644
--- a/build/moz.configure/android-ndk.configure
+++ b/build/moz.configure/android-ndk.configure
@@ -30,7 +30,7 @@ js_option('--with-android-version',
 
 
 @depends('--with-android-version', min_android_version, '--help')
-@imports(_from='__builtin__', _import='ValueError')
+@imports(_from='builtins', _import='ValueError')
 def android_version(value, min_version, _):
     if not value:
         # Someone has passed --without-android-version.
@@ -68,7 +68,7 @@ add_old_configure_assignment('android_ndk', ndk)
 
 @depends(ndk)
 @checking('for android ndk version')
-@imports(_from='__builtin__', _import='open')
+@imports(_from='builtins', _import='open')
 def ndk_version(ndk):
     if not ndk:
         # Building 'js/src' for non-Android.
diff --git a/build/moz.configure/checks.configure b/build/moz.configure/checks.configure
index 516652da9..11e1091c6 100644
--- a/build/moz.configure/checks.configure
+++ b/build/moz.configure/checks.configure
@@ -14,7 +14,7 @@
 
 
 @template
-@imports(_from='__builtin__', _import='Exception')
+@imports(_from='builtins', _import='Exception')
 def _declare_exceptions():
     class FatalCheckError(Exception):
         '''An exception to throw from a function decorated with @checking.
@@ -57,7 +57,7 @@ def checking(what, callback=None):
                 try:
                     ret = func(*args, **kwargs)
                 except FatalCheckError as e:
-                    error = e.message
+                    error = str(e)
                 display_ret = callback(ret) if callback else ret
                 if display_ret is True:
                     log.info('yes')
diff --git a/build/moz.configure/init.configure b/build/moz.configure/init.configure
index 648ac2ded..4d74547d8 100644
--- a/build/moz.configure/init.configure
+++ b/build/moz.configure/init.configure
@@ -14,7 +14,7 @@ option(env='DIST', nargs=1, help='DIST directory')
 
 
 @depends('--help', 'DIST')
-@imports(_from='__builtin__', _import='open')
+@imports(_from='builtins', _import='open')
 @imports(_from='os.path', _import='exists')
 def check_build_environment(help, dist):
     topobjdir = os.path.realpath(os.path.abspath('.'))
@@ -65,7 +65,7 @@ def check_build_environment(help, dist):
     # Check for CRLF line endings.
     with open(os.path.join(topsrcdir, 'configure.py'), 'rb') as fh:
         data = fh.read()
-        if '\r' in data:
+        if b'\r' in data:
             die('\n ***\n'
                 ' * The source tree appears to have Windows-style line endings.\n'
                 ' *\n'
@@ -269,7 +269,7 @@ def early_options():
     def early_options():
         return set(
             option.env
-            for option in __sandbox__._options.itervalues()
+            for option in __sandbox__._options.values()
             if option.env
         )
     return early_options
@@ -307,15 +307,15 @@ def mozconfig_options(mozconfig, automation, help):
                 log.info('  %s' % arg)
                 helper.add(arg, origin='mozconfig', args=helper._args)
 
-        for key, value in mozconfig['env']['added'].iteritems():
+        for key, value in mozconfig['env']['added'].items():
             add(key, value)
             os.environ[key] = value
-        for key, (_, value) in mozconfig['env']['modified'].iteritems():
+        for key, (_, value) in mozconfig['env']['modified'].items():
             add(key, value)
             os.environ[key] = value
-        for key, value in mozconfig['vars']['added'].iteritems():
+        for key, value in mozconfig['vars']['added'].items():
             add(key, value)
-        for key, (_, value) in mozconfig['vars']['modified'].iteritems():
+        for key, (_, value) in mozconfig['vars']['modified'].items():
             add(key, value)
 
 
@@ -353,7 +353,7 @@ option(env='PYTHON3', nargs=1, help='Python 3 interpreter (3.5 or later)')
 @depends('PYTHON3')
 @checking('for Python 3',
           callback=lambda x: '%s (%s)' % (x.path, x.str_version) if x else 'no')
-@imports(_from='__builtin__', _import='Exception')
+@imports(_from='builtins', _import='Exception')
 @imports(_from='mozbuild.pythonutil', _import='find_python3_executable')
 @imports(_from='mozbuild.pythonutil', _import='python_executable_version')
 def python3(env_python):
@@ -377,9 +377,6 @@ def python3(env_python):
         if not python:
             return None
 
-        # The API returns a bytes whereas everything in configure is unicode.
-        python = python.decode('utf-8')
-
     return namespace(
         path=python,
         version=version,
@@ -481,6 +478,8 @@ def hg_config(build_env, hg, version):
 @imports('re')
 def git_version(git):
     out = check_cmd_output(git, '--version').rstrip()
+    if isinstance(out, bytes):
+        out = out.decode('utf-8')
 
     match = re.search('git version (.*)$', out)
 
@@ -551,8 +550,8 @@ option('--target', nargs=1,
 @imports(_from='mozbuild.configure.constants', _import='Endianness')
 @imports(_from='mozbuild.configure.constants', _import='Kernel')
 @imports(_from='mozbuild.configure.constants', _import='OS')
-@imports(_from='__builtin__', _import='KeyError')
-@imports(_from='__builtin__', _import='ValueError')
+@imports(_from='builtins', _import='KeyError')
+@imports(_from='builtins', _import='ValueError')
 def split_triplet(triplet, allow_unknown=False):
     # The standard triplet is defined as
     #   CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
@@ -562,6 +561,8 @@ def split_triplet(triplet, allow_unknown=False):
     # Additionally, some may omit "unknown" when the manufacturer
     # is not specified and emit
     #   CPU_TYPE-OPERATING_SYSTEM
+    if isinstance(triplet, bytes):
+        triplet = triplet.decode('utf-8')
     parts = triplet.split('-', 2)
     if len(parts) == 3:
         cpu, _, os = parts
@@ -987,7 +988,7 @@ add_old_configure_assignment('MOZ_BUILD_APP', build_project)
 # - otherwise, if we have "a" in GRE_MILESTONE, we're building Nightly or Aurora
 # - otherwise, we're building Release/Beta (define RELEASE_OR_BETA)
 @depends(check_build_environment, '--help')
-@imports(_from='__builtin__', _import='open')
+@imports(_from='builtins', _import='open')
 @imports('re')
 def milestone(build_env, _):
     milestone_path = os.path.join(build_env.topsrcdir,
@@ -1105,7 +1106,7 @@ def enabled_in_nightly(milestone, _):
 def all_configure_options():
     result = []
     previous = None
-    for option in __sandbox__._options.itervalues():
+    for option in __sandbox__._options.values():
         # __sandbox__._options contains items for both option.name and
         # option.env. But it's also an OrderedDict, meaning both are
         # consecutive.
diff --git a/build/moz.configure/keyfiles.configure b/build/moz.configure/keyfiles.configure
index 5d51cccea..14a35a3c6 100644
--- a/build/moz.configure/keyfiles.configure
+++ b/build/moz.configure/keyfiles.configure
@@ -16,8 +16,8 @@ def keyfile(desc, default=None, help=None, callback=lambda x: x):
 
     @depends('--with-%s-keyfile' % name)
     @checking('for the %s key' % desc, lambda x: x and x is not no_key)
-    @imports(_from='__builtin__', _import='open')
-    @imports(_from='__builtin__', _import='IOError')
+    @imports(_from='builtins', _import='open')
+    @imports(_from='builtins', _import='IOError')
     def keyfile(value):
         if value:
             try:
diff --git a/build/moz.configure/old.configure b/build/moz.configure/old.configure
index 81c10b91f..29b496bae 100644
--- a/build/moz.configure/old.configure
+++ b/build/moz.configure/old.configure
@@ -64,9 +64,9 @@ set_config('AUTOCONF', autoconf)
 
 @depends('OLD_CONFIGURE', mozconfig, autoconf, check_build_environment, shell,
          old_configure_assignments, build_project)
-@imports(_from='__builtin__', _import='open')
-@imports(_from='__builtin__', _import='print')
-@imports(_from='__builtin__', _import='sorted')
+@imports(_from='builtins', _import='open')
+@imports(_from='builtins', _import='print')
+@imports(_from='builtins', _import='sorted')
 @imports('glob')
 @imports('itertools')
 @imports('subprocess')
@@ -113,7 +113,7 @@ def prepare_configure(old_configure, mozconfig, autoconf, build_env, shell,
 
         # Make old-configure append to config.log, where we put our own log.
         # This could be done with a m4 macro, but it's way easier this way
-        script = script.replace('>./config.log', '>>./config.log')
+        script = script.replace(b'>./config.log', b'>>./config.log')
 
         with open(old_configure, 'wb') as fh:
             fh.write(script)
@@ -282,8 +282,8 @@ def old_configure_options(*options):
     '--x-includes',
     '--x-libraries',
 )
-@imports(_from='__builtin__', _import='compile')
-@imports(_from='__builtin__', _import='open')
+@imports(_from='builtins', _import='compile')
+@imports(_from='builtins', _import='open')
 @imports('logging')
 @imports('os')
 @imports('subprocess')
@@ -326,7 +326,7 @@ def old_configure(prepare_configure, extra_old_configure_args, all_options,
     log.debug('Running %s', quote(*cmd))
     if extra_env:
         log.debug('with extra environment: %s',
-                  ' '.join('%s=%s' % pair for pair in extra_env.iteritems()))
+                  ' '.join('%s=%s' % pair for pair in extra_env.items()))
 
     # Our logging goes to config.log, the same file old.configure uses.
     # We can't share the handle on the file, so close it. We assume nothing
@@ -359,7 +359,7 @@ def old_configure(prepare_configure, extra_old_configure_args, all_options,
         # Every variation of the exec() function I tried led to:
         # SyntaxError: unqualified exec is not allowed in function 'main' it
         # contains a nested function with free variables
-        exec code in raw_config # noqa
+        exec(code, raw_config) # noqa
 
     # Ensure all the flags known to old-configure appear in the
     # @old_configure_options above.
@@ -393,16 +393,24 @@ def set_old_configure_define(name, value):
 @depends(old_configure)
 @imports('types')
 def post_old_configure(raw_config):
+    log.info('post_old_configure started')
+
     for k, v in raw_config['substs']:
         set_old_configure_config(
-            k[1:-1], v[1:-1] if isinstance(v, types.StringTypes) else v)
+            k[1:-1], v[1:-1] if isinstance(v, str) else v)
+
+    log.info('post_old_configure 1 finished')
 
-    for k, v in dict(raw_config['defines']).iteritems():
+    for k, v in dict(raw_config['defines']).items():
         set_old_configure_define(k[1:-1], v[1:-1])
 
+    log.info('post_old_configure 2 finished')
+
     set_old_configure_config('non_global_defines',
                              raw_config['non_global_defines'])
 
+    log.info('post_old_configure 3 finished')
+
 
 # Assuming no other option is declared after this function, handle the
 # env options that were injected by mozconfig_options by creating dummy
@@ -414,6 +422,7 @@ def post_old_configure(raw_config):
 @imports('__sandbox__')
 @imports(_from='mozbuild.configure.options', _import='Option')
 def remaining_mozconfig_options(_):
+    log.info('remaining_mozconfig_options started')
     helper = __sandbox__._helper
     for arg in helper:
         if helper._origins[arg] != 'mozconfig':
@@ -422,5 +431,6 @@ def remaining_mozconfig_options(_):
         if name.isupper() and name not in __sandbox__._options:
             option = Option(env=name, nargs='*', help=name)
             helper.handle(option)
+    log.info('remaining_mozconfig_options finished')
 
 # Please do not add anything after remaining_mozconfig_options()
diff --git a/build/moz.configure/toolchain.configure b/build/moz.configure/toolchain.configure
index fc640c75e..c5508dfb7 100755
--- a/build/moz.configure/toolchain.configure
+++ b/build/moz.configure/toolchain.configure
@@ -391,7 +391,7 @@ def get_compiler_info(compiler, language):
         ('CPU', CPU_preprocessor_checks),
         ('KERNEL', kernel_preprocessor_checks),
     ):
-        for n, (value, condition) in enumerate(preprocessor_checks.iteritems()):
+        for n, (value, condition) in enumerate(preprocessor_checks.items()):
             check += dedent('''\
                 #%(if)s %(condition)s
                 %%%(name)s "%(value)s"
@@ -425,9 +425,9 @@ def get_compiler_info(compiler, language):
     data = {}
     for line in result.splitlines():
         if line.startswith(b'%'):
-            k, _, v = line.partition(' ')
-            k = k.lstrip('%')
-            data[k] = v.replace(' ', '').lstrip('"').rstrip('"')
+            k, _, v = line.partition(b' ')
+            k = k.lstrip(b'%').decode('utf-8')
+            data[k] = v.replace(b' ', b'').lstrip(b'"').rstrip(b'"').decode('utf-8')
             log.debug('%s = %s', k, data[k])
 
     try:
@@ -551,7 +551,7 @@ def check_compiler(compiler, language, target):
     )
 
 
-@imports(_from='__builtin__', _import='open')
+@imports(_from='builtins', _import='open')
 @imports('json')
 @imports('subprocess')
 @imports('sys')
@@ -606,7 +606,7 @@ def vs_major_version(value):
 
 
 @depends(host, target, vs_major_version, check_build_environment, '--with-visual-studio-version')
-@imports(_from='__builtin__', _import='sorted')
+@imports(_from='builtins', _import='sorted')
 @imports(_from='operator', _import='itemgetter')
 @imports('platform')
 def vc_compiler_path(host, target, vs_major_version, env, vs_release_name):
@@ -807,7 +807,7 @@ def compiler(language, host_or_target, c_compiler=None, other_compiler=None,
                     target.os != 'Android':
                 return namespace(**{
                     k: [] if k == 'flags' else v
-                    for k, v in other_compiler.__dict__.iteritems()
+                    for k, v in other_compiler.__dict__.items()
                 })
 
     # Normally, we'd use `var` instead of `_var`, but the interaction with
@@ -1238,7 +1238,7 @@ set_config('VISIBILITY_FLAGS', visibility_flags)
 
 @depends(c_compiler)
 @imports('multiprocessing')
-@imports(_from='__builtin__', _import='min')
+@imports(_from='builtins', _import='min')
 def pgo_flags(compiler):
     if compiler.type in ('gcc', 'clang'):
         return namespace(
@@ -1517,6 +1517,8 @@ def enable_gnu_linker(enable_gold_option, c_compiler, developer_options, build_e
         gold = check_cmd_output(*detection_cmd).strip()
         if not gold:
             return
+        if isinstance(gold, bytes):
+            gold = gold.decode('utf-8')
 
         goldFullPath = find_program(gold)
         if goldFullPath is None:
diff --git a/build/moz.configure/util.configure b/build/moz.configure/util.configure
index 3284fd8b5..218813e2d 100644
--- a/build/moz.configure/util.configure
+++ b/build/moz.configure/util.configure
@@ -25,7 +25,6 @@ def configure_error(message):
 # does not.
 
 
-@imports(_from='__builtin__', _import='unicode')
 @imports('subprocess')
 @imports('sys')
 @imports(_from='mozbuild.configure.util', _import='LineIO')
@@ -39,10 +38,10 @@ def check_cmd_output(*args, **kwargs):
     if 'env' in kwargs:
         normalized_env = {}
         for k, v in kwargs['env'].items():
-            if isinstance(k, unicode):
+            if isinstance(k, str):
                 k = k.encode('utf-8', 'strict')
 
-            if isinstance(v, unicode):
+            if isinstance(v, str):
                 v = v.encode('utf-8', 'strict')
 
             normalized_env[k] = v
@@ -285,7 +284,7 @@ def unique_list(l):
 #     ('19.0', 'x64', r'C:\...\amd64\cl.exe')
 #     ('19.0', 'x86', r'C:\...\amd64_x86\cl.exe')
 @imports(_import='_winreg', _as='winreg')
-@imports(_from='__builtin__', _import='WindowsError')
+@imports(_from='builtins', _import='WindowsError')
 @imports(_from='fnmatch', _import='fnmatch')
 def get_registry_values(pattern, get_32_and_64_bit=False):
     def enum_helper(func, key):
@@ -360,6 +359,8 @@ def get_registry_values(pattern, get_32_and_64_bit=False):
 @imports(_from='mozbuild.configure.util', _import='Version', _as='_Version')
 def Version(v):
     'A version number that can be compared usefully.'
+    if isinstance(v, bytes):
+        v = v.decode('utf-8')
     return _Version(v)
 
 # Denotes a deprecated option. Combines option() and @depends:
diff --git a/build/moz.configure/windows.configure b/build/moz.configure/windows.configure
index a5b790e3b..2b88fc447 100644
--- a/build/moz.configure/windows.configure
+++ b/build/moz.configure/windows.configure
@@ -10,7 +10,7 @@ option('--with-windows-version', nargs=1, default='603',
 
 
 @depends('--with-windows-version')
-@imports(_from='__builtin__', _import='ValueError')
+@imports(_from='builtins', _import='ValueError')
 def valid_windows_version(value):
     if not value:
         die('Cannot build with --without-windows-version')
@@ -50,8 +50,8 @@ def windows_sdk_dir(value, host):
 
 @imports('os')
 @imports('re')
-@imports(_from='__builtin__', _import='sorted')
-@imports(_from='__builtin__', _import='WindowsError')
+@imports(_from='builtins', _import='sorted')
+@imports(_from='builtins', _import='WindowsError')
 def get_sdk_dirs(sdk, subdir):
     def get_dirs_containing(sdk, stem, subdir):
         base = os.path.join(sdk, stem)
@@ -96,7 +96,7 @@ def valid_windows_sdk_dir_result(value):
 
 @depends(c_compiler, windows_sdk_dir, valid_windows_version, 'WINDOWSSDKDIR')
 @checking('for Windows SDK', valid_windows_sdk_dir_result)
-@imports(_from='__builtin__', _import='sorted')
+@imports(_from='builtins', _import='sorted')
 @imports(_from='textwrap', _import='dedent')
 def valid_windows_sdk_dir(compiler, windows_sdk_dir, target_version,
                           windows_sdk_dir_env):
@@ -174,7 +174,7 @@ def valid_ucrt_sdk_dir_result(value):
 @depends(windows_sdk_dir, 'WINDOWSSDKDIR', c_compiler)
 @checking('for Universal CRT SDK', valid_ucrt_sdk_dir_result)
 @imports('os')
-@imports(_from='__builtin__', _import='sorted')
+@imports(_from='builtins', _import='sorted')
 @imports(_import='mozpack.path', _as='mozpath')
 def valid_ucrt_sdk_dir(windows_sdk_dir, windows_sdk_dir_env, c_compiler):
     if windows_sdk_dir_env:
diff --git a/build/templates.mozbuild b/build/templates.mozbuild
index 3da850ce5..ae5e410fe 100644
--- a/build/templates.mozbuild
+++ b/build/templates.mozbuild
@@ -10,7 +10,7 @@ def Binary():
     templates.'''
 
     # Add -llog by default, since we use it all over the place.
-    if CONFIG['OS_TARGET'] == 'Android':
+    if str(CONFIG['OS_TARGET']) == 'Android':
         OS_LIBS += ['log']
 
 
diff --git a/config/MozZipFile.py b/config/MozZipFile.py
index 337fe0521..dc7add4c3 100644
--- a/config/MozZipFile.py
+++ b/config/MozZipFile.py
@@ -18,7 +18,7 @@ class ZipFile(zipfile.ZipFile):
   def __init__(self, file, mode="r", compression=zipfile.ZIP_STORED,
                lock = False):
     if lock:
-      assert isinstance(file, basestring)
+      assert isinstance(file, str)
       self.lockfile = lock_file(file + '.lck')
     else:
       self.lockfile = None
@@ -46,7 +46,7 @@ class ZipFile(zipfile.ZipFile):
                               date_time=time.localtime(time.time()))
       zinfo.compress_type = self.compression
       # Add some standard UNIX file access permissions (-rw-r--r--).
-      zinfo.external_attr = (0x81a4 & 0xFFFF) << 16L
+      zinfo.external_attr = (0x81a4 & 0xFFFF) << 16
     else:
       zinfo = zinfo_or_arcname
 
@@ -58,7 +58,7 @@ class ZipFile(zipfile.ZipFile):
     # as the old, reuse the existing entry.
 
     doSeek = False # store if we need to seek to the eof after overwriting
-    if self.NameToInfo.has_key(zinfo.filename):
+    if zinfo.filename in self.NameToInfo:
       # Find the last ZipInfo with our name.
       # Last, because that's catching multiple overwrites
       i = len(self.filelist)
@@ -109,14 +109,14 @@ class ZipFile(zipfile.ZipFile):
       # adjust file mode if we originally just wrote, now we rewrite
       self.fp.close()
       self.fp = open(self.filename, 'r+b')
-    all = map(lambda zi: (zi, True), self.filelist) + \
-        map(lambda zi: (zi, False), self._remove)
+    all = [(zi, True) for zi in self.filelist] + \
+        [(zi, False) for zi in self._remove]
     all.sort(lambda l, r: cmp(l[0].header_offset, r[0].header_offset))
     # empty _remove for multiple closes
     self._remove = []
 
     lengths = [all[i+1][0].header_offset - all[i][0].header_offset
-               for i in xrange(len(all)-1)]
+               for i in range(len(all)-1)]
     lengths.append(self.end - all[-1][0].header_offset)
     to_pos = 0
     for (zi, keep), length in zip(all, lengths):
diff --git a/config/expandlibs.py b/config/expandlibs.py
index ac06c432f..df1fed15d 100644
--- a/config/expandlibs.py
+++ b/config/expandlibs.py
@@ -26,7 +26,7 @@ ${LIB_PREFIX}${ROOT}.${LIB_SUFFIX} following these rules:
   descriptor contains. And for each of these LIBS, also apply the same
   rules.
 '''
-from __future__ import with_statement
+
 import sys, os, errno
 import expandlibs_config as conf
 
@@ -36,7 +36,7 @@ def ensureParentDir(file):
     if dir and not os.path.exists(dir):
         try:
             os.makedirs(dir)
-        except OSError, error:
+        except OSError as error:
             if error.errno != errno.EEXIST:
                 raise
 
@@ -140,4 +140,4 @@ class ExpandArgs(list):
         return [relativize(arg)]
 
 if __name__ == '__main__':
-    print " ".join(ExpandArgs(sys.argv[1:]))
+    print(" ".join(ExpandArgs(sys.argv[1:])))
diff --git a/config/expandlibs_exec.py b/config/expandlibs_exec.py
index df656016c..fb786a6a8 100644
--- a/config/expandlibs_exec.py
+++ b/config/expandlibs_exec.py
@@ -20,7 +20,7 @@ With the --symbol-order argument, followed by a file name, it will add the
 relevant linker options to change the order in which the linker puts the
 symbols appear in the resulting binary. Only works for ELF targets.
 '''
-from __future__ import with_statement
+
 import sys
 import os
 from expandlibs import (
@@ -304,11 +304,11 @@ class SectionFinder(object):
         return syms
 
 def print_command(out, args):
-    print >>out, "Executing: " + " ".join(args)
+    print("Executing: " + " ".join(args), file=out)
     for tmp in [f for f in args.tmp if os.path.isfile(f)]:
-        print >>out, tmp + ":"
+        print(tmp + ":", file=out)
         with open(tmp) as file:
-            print >>out, "".join(["    " + l for l in file.readlines()])
+            print("".join(["    " + l for l in file.readlines()]), file=out)
     out.flush()
 
 def main(args, proc_callback=None):
@@ -338,13 +338,13 @@ def main(args, proc_callback=None):
             proc = subprocess.Popen(args, stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
             if proc_callback:
                 proc_callback(proc)
-        except Exception, e:
-            print >>sys.stderr, 'error: Launching', args, ':', e
+        except Exception as e:
+            print('error: Launching', args, ':', e, file=sys.stderr)
             raise e
         (stdout, stderr) = proc.communicate()
         if proc.returncode and not options.verbose:
             print_command(sys.stderr, args)
-        sys.stderr.write(stdout)
+        sys.stderr.write(stdout.decode("utf-8"))
         sys.stderr.flush()
         if proc.returncode:
             return proc.returncode
diff --git a/config/expandlibs_gen.py b/config/expandlibs_gen.py
index b1de63cd0..dc62bd184 100644
--- a/config/expandlibs_gen.py
+++ b/config/expandlibs_gen.py
@@ -5,7 +5,7 @@
 '''Given a list of object files and library names, prints a library
 descriptor to standard output'''
 
-from __future__ import with_statement
+
 import sys
 import os
 import expandlibs_config as conf
@@ -38,4 +38,4 @@ if __name__ == '__main__':
 
     ensureParentDir(options.output)
     with open(options.output, 'w') as outfile:
-        print >>outfile, generate(args)
+        print(generate(args), file=outfile)
diff --git a/configure.py b/configure.py
index 771e34e38..bee329d7c 100644
--- a/configure.py
+++ b/configure.py
@@ -2,10 +2,11 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import print_function, unicode_literals
+
 
 import codecs
 import itertools
+import logging
 import os
 import sys
 import textwrap
@@ -34,7 +35,9 @@ from mozbuild.util import (
 def main(argv):
     config = {}
     sandbox = ConfigureSandbox(config, os.environ, argv)
+    print('sandbox.run started')
     sandbox.run(os.path.join(os.path.dirname(__file__), 'moz.configure'))
+    print('sandbox.run finished')
 
     if sandbox._help:
         return 0
@@ -56,12 +59,21 @@ def config_status(config):
 
     sanitized_config = {}
     sanitized_config['substs'] = {
-        k: sanitized_bools(v) for k, v in config.iteritems()
+        k: sanitized_bools(v) for k, v in config.items()
         if k not in ('DEFINES', 'non_global_defines', 'TOPSRCDIR', 'TOPOBJDIR',
                      'ALL_CONFIGURE_PATHS')
     }
+
+    # Hack around OptionValue entries unknown during compile
+    for opt in ('BUILD_BACKENDS', 'MOZ_UI_LOCALE', 'RUSTFLAGS' ):
+        old = sanitized_config['substs'][opt]
+        new = []
+        for setting in old:
+            new.append(setting)
+        sanitized_config['substs'][opt] = new
+
     sanitized_config['defines'] = {
-        k: sanitized_bools(v) for k, v in config['DEFINES'].iteritems()
+        k: sanitized_bools(v) for k, v in config['DEFINES'].items()
     }
     sanitized_config['non_global_defines'] = config['non_global_defines']
     sanitized_config['topsrcdir'] = config['TOPSRCDIR']
@@ -71,20 +83,17 @@ def config_status(config):
     # Create config.status. Eventually, we'll want to just do the work it does
     # here, when we're able to skip configure tests/use cached results/not rely
     # on autoconf.
-    print("Creating config.status", file=sys.stderr)
-    encoding = 'mbcs' if sys.platform == 'win32' else 'utf-8'
-    with codecs.open('config.status', 'w', encoding) as fh:
+    logging.getLogger('moz.configure').info('Creating config.status')
+    with codecs.open('config.status', 'w', 'utf-8') as fh:
         fh.write(textwrap.dedent('''\
             #!%(python)s
-            # coding=%(encoding)s
-            from __future__ import unicode_literals
-            from mozbuild.util import encode
-            encoding = '%(encoding)s'
-        ''') % {'python': config['PYTHON'], 'encoding': encoding})
+            # coding=utf-8
+            print("config.status started")
+        ''') % {'python': config['PYTHON']})
         # A lot of the build backend code is currently expecting byte
         # strings and breaks in subtle ways with unicode strings. (bug 1296508)
-        for k, v in sanitized_config.iteritems():
-            fh.write('%s = encode(%s, encoding)\n' % (k, indented_repr(v)))
+        for k, v in sanitized_config.items():
+            fh.write('%s = %s\n' % (k, indented_repr(v)))
         fh.write("__all__ = ['topobjdir', 'topsrcdir', 'defines', "
                  "'non_global_defines', 'substs', 'mozconfig']")
 
@@ -97,6 +106,9 @@ def config_status(config):
                     args = dict([(name, globals()[name]) for name in __all__])
                     config_status(**args)
             '''))
+        fh.write(textwrap.dedent('''
+            print("config.status finished")
+        '''))
 
     partial_config = PartialConfigEnvironment(config['TOPOBJDIR'])
     partial_config.write_vars(sanitized_config)
@@ -116,7 +128,7 @@ def config_status(config):
     # executable permissions.
     os.chmod('config.status', 0o755)
     if config.get('MOZ_BUILD_APP') != 'js' or config.get('JS_STANDALONE'):
-        os.environ[b'WRITE_MOZINFO'] = b'1'
+        os.environ['WRITE_MOZINFO'] = '1'
         from mozbuild.config_status import config_status
 
         # Some values in sanitized_config also have more complex types, such as
@@ -127,7 +139,7 @@ def config_status(config):
 
         # A lot of the build backend code is currently expecting byte strings
         # and breaks in subtle ways with unicode strings.
-        return config_status(args=[], **encode(sanitized_config, encoding))
+        return config_status(args=[], **sanitized_config)
     return 0
 
 
diff --git a/js/src/build/moz.build b/js/src/build/moz.build
index a7f5fa4ce..856cae32d 100644
--- a/js/src/build/moz.build
+++ b/js/src/build/moz.build
@@ -47,22 +47,22 @@ USE_LIBS += [
     'zlib',
 ]
 
-if CONFIG['OS_ARCH'] not in ('WINNT', 'HP-UX'):
+if str(CONFIG['OS_ARCH']) not in ('WINNT', 'HP-UX'):
     OS_LIBS += [
         'm',
     ]
 
-if CONFIG['OS_ARCH'] == 'FreeBSD':
+if str(CONFIG['OS_ARCH']) == 'FreeBSD':
     OS_LIBS += [
         '-pthread',
     ]
 
-if CONFIG['OS_ARCH'] == 'Linux':
+if str(CONFIG['OS_ARCH']) == 'Linux':
     OS_LIBS += [
         'dl',
     ]
 
-if CONFIG['OS_ARCH'] == 'SunOS':
+if str(CONFIG['OS_ARCH']) == 'SunOS':
     OS_LIBS += [
         'posix4',
         'dl',
diff --git a/js/src/builtin/embedjs.py b/js/src/builtin/embedjs.py
index ba25e71c1..d4f2de122 100644
--- a/js/src/builtin/embedjs.py
+++ b/js/src/builtin/embedjs.py
@@ -36,7 +36,7 @@
 #
 # It uses the C preprocessor to process its inputs.
 
-from __future__ import with_statement
+
 import re, sys, os, subprocess
 import shlex
 import which
@@ -52,8 +52,8 @@ def ToCAsciiArray(lines):
 
 def ToCArray(lines):
   result = []
-  for chr in lines:
-    result.append(str(ord(chr)))
+  for char in lines:
+    result.append("0x%0.2X" % char)
   return ", ".join(result)
 
 HEADER_TEMPLATE = """\
@@ -87,7 +87,7 @@ def embed(cxx, preprocessorOption, cppflags, msgs, sources, c_out, js_out, names
 
   js_out.write(processed)
   import zlib
-  compressed = zlib.compress(processed)
+  compressed = zlib.compress(processed.encode('utf-8'))
   data = ToCArray(compressed)
   c_out.write(HEADER_TEMPLATE % {
     'sources_type': 'unsigned char',
@@ -107,7 +107,7 @@ def preprocess(cxx, preprocessorOption, source, args = []):
   tmpOut = 'self-hosting-preprocessed.pp';
   outputArg = shlex.split(preprocessorOption + tmpOut)
 
-  with open(tmpIn, 'wb') as input:
+  with open(tmpIn, 'w') as input:
     input.write(source)
   print(' '.join(cxx + outputArg + args + [tmpIn]))
   result = subprocess.Popen(cxx + outputArg + args + [tmpIn]).wait()
diff --git a/js/src/configure b/js/src/configure
index 3b3a39af3..8f5ea41d0 100755
--- a/js/src/configure
+++ b/js/src/configure
@@ -24,4 +24,4 @@ export OLD_CONFIGURE="$SRCDIR"/old-configure
 
 set -- "$@" --enable-project=js
 
-which python2.7 > /dev/null && exec python2.7 "$TOPSRCDIR/configure.py" "$@" || exec python "$TOPSRCDIR/configure.py" "$@"
+which python3 > /dev/null && exec python3 "$TOPSRCDIR/configure.py" "$@" || exec python "$TOPSRCDIR/configure.py" "$@"
diff --git a/js/src/frontend/GenerateReservedWords.py b/js/src/frontend/GenerateReservedWords.py
index 3aa2307b9..381c8e2b4 100644
--- a/js/src/frontend/GenerateReservedWords.py
+++ b/js/src/frontend/GenerateReservedWords.py
@@ -80,14 +80,14 @@ def split_list_per_column(reserved_word_list, column):
         per_column = column_dict.setdefault(word[column], [])
         per_column.append(item)
 
-    return sorted(column_dict.items(), key=lambda (char, word): ord(char))
+    return sorted(list(column_dict.items()), key=lambda char_word: ord(char_word[0]))
 
 def generate_letter_switch(opt, unprocessed_columns, reserved_word_list,
                            columns=None):
     assert(len(reserved_word_list) != 0);
 
     if not columns:
-        columns = range(0, unprocessed_columns)
+        columns = list(range(0, unprocessed_columns))
 
     if len(reserved_word_list) == 1:
         index, word = reserved_word_list[0]
@@ -161,7 +161,7 @@ def split_list_per_length(reserved_word_list):
         per_length = length_dict.setdefault(len(word), [])
         per_length.append(item)
 
-    return sorted(length_dict.items(), key=lambda (length, word): length)
+    return sorted(list(length_dict.items()), key=lambda length_word: length_word[0])
 
 def generate_switch(opt, reserved_word_list):
     assert(len(reserved_word_list) != 0);
diff --git a/js/src/gc/GenerateStatsPhases.py b/js/src/gc/GenerateStatsPhases.py
index 2daf83555..e39a26a4b 100644
--- a/js/src/gc/GenerateStatsPhases.py
+++ b/js/src/gc/GenerateStatsPhases.py
@@ -267,7 +267,7 @@ def generateHeader(out):
     #
     # Generate PhaseKind enum.
     #
-    phaseKindNames = map(lambda phaseKind: phaseKind.name, AllPhaseKinds)
+    phaseKindNames = [phaseKind.name for phaseKind in AllPhaseKinds]
     extraPhaseKinds = [
         "NONE = LIMIT",
         "EXPLICIT_SUSPENSION = LIMIT",
@@ -279,7 +279,7 @@ def generateHeader(out):
     #
     # Generate Phase enum.
     #
-    phaseNames = map(lambda phase: phase.name, AllPhases)
+    phaseNames = [phase.name for phase in AllPhases]
     extraPhases = [
         "NONE = LIMIT",
         "EXPLICIT_SUSPENSION = LIMIT",
diff --git a/js/src/old-configure.in b/js/src/old-configure.in
index 11c3d5a2e..389265404 100644
--- a/js/src/old-configure.in
+++ b/js/src/old-configure.in
@@ -1884,3 +1884,5 @@ if test "$JS_STANDALONE"; then
 fi
 
 rm -fr confdefs* $ac_clean_files
+echo confdefs* $ac_clean_files removed
+echo "old-configure done"
diff --git a/memory/build/moz.build b/memory/build/moz.build
index e2c715271..f09ce7935 100644
--- a/memory/build/moz.build
+++ b/memory/build/moz.build
@@ -30,7 +30,7 @@ else:
         'fallback.cpp',
     ]
 
-if CONFIG['OS_TARGET'] == 'Darwin' and (CONFIG['MOZ_REPLACE_MALLOC'] or
+if str(CONFIG['OS_TARGET']) == 'Darwin' and (CONFIG['MOZ_REPLACE_MALLOC'] or
         CONFIG['MOZ_MEMORY']):
     SOURCES += [
         'zone.c',
@@ -38,15 +38,15 @@ if CONFIG['OS_TARGET'] == 'Darwin' and (CONFIG['MOZ_REPLACE_MALLOC'] or
 
 Library('memory')
 
-if CONFIG['OS_TARGET'] == 'Android' and CONFIG['CC_TYPE'] == 'clang':
+if str(CONFIG['OS_TARGET']) == 'Android' and str(CONFIG['CC_TYPE']) == 'clang':
     CXXFLAGS += [
         '-Wno-tautological-pointer-compare',
     ]
 
-if CONFIG['MOZ_BUILD_APP'] != 'memory':
+if str(CONFIG['MOZ_BUILD_APP']) != 'memory':
     FINAL_LIBRARY = 'mozglue'
 
-if CONFIG['CC_TYPE'] in ('msvc', 'clang-cl'):
+if str(CONFIG['CC_TYPE']) in ('msvc', 'clang-cl'):
     CXXFLAGS += ['-wd4273'] # inconsistent dll linkage (bug 558163)
 
 if CONFIG['MOZ_REPLACE_MALLOC_STATIC']:
diff --git a/mozglue/build/moz.build b/mozglue/build/moz.build
index 53758485a..5e9308802 100644
--- a/mozglue/build/moz.build
+++ b/mozglue/build/moz.build
@@ -9,12 +9,12 @@
 # If this is ever changed, update MOZ_SHARED_MOZGLUE in browser/installer/Makefile.in
 if CONFIG['JS_STANDALONE'] and not CONFIG['MOZ_MEMORY']:
     Library('mozglue')
-elif CONFIG['OS_TARGET'] in ('WINNT', 'Darwin', 'Android'):
+elif str(CONFIG['OS_TARGET']) in ('WINNT', 'Darwin', 'Android'):
     SharedLibrary('mozglue')
 else:
     Library('mozglue')
 
-if CONFIG['OS_TARGET'] == 'Android':
+if str(CONFIG['OS_TARGET']) == 'Android':
     SOURCES += [
         'BionicGlue.cpp',
     ]
@@ -24,14 +24,14 @@ if CONFIG['MOZ_ASAN']:
         'AsanOptions.cpp',
     ]
 
-if CONFIG['OS_TARGET'] == 'WINNT':
+if str(CONFIG['OS_TARGET']) == 'WINNT':
     DEFFILE = 'mozglue.def'
     # We'll break the DLL blocklist if we immediately load user32.dll
     DELAYLOAD_DLLS += [
         'user32.dll',
     ]
 
-    if CONFIG['CC_TYPE'] == "msvc":
+    if str(CONFIG['CC_TYPE']) == "msvc":
         CFLAGS += ['-guard:cf']
         CXXFLAGS += ['-guard:cf']
         LDFLAGS += ['-guard:cf']
@@ -48,12 +48,12 @@ if CONFIG['MOZ_WIDGET_TOOLKIT']:
             'dummy.cpp',
         ]
 
-    if CONFIG['OS_TARGET'] == 'WINNT':
+    if str(CONFIG['OS_TARGET']) == 'WINNT':
         LOCAL_INCLUDES += [
             '/memory/build',
         ]
 
-        if CONFIG['CC_TYPE'] == "msvc":
+        if str(CONFIG['CC_TYPE']) == "msvc":
             SOURCES += ['WindowsCFGStatus.cpp']
         SOURCES += [
             'Authenticode.cpp',
@@ -85,17 +85,17 @@ if CONFIG['MOZ_WIDGET_TOOLKIT']:
         'WindowsDllBlocklist.h',
     ]
 
-    if CONFIG['CPU_ARCH'].startswith('x86'):
+    if str(CONFIG['CPU_ARCH']).startswith('x86'):
         SOURCES += [
             'SSE.cpp',
         ]
 
-    if CONFIG['CPU_ARCH'] == 'arm':
+    if str(CONFIG['CPU_ARCH']) == 'arm':
         SOURCES += [
             'arm.cpp',
         ]
 
-    if CONFIG['CPU_ARCH'].startswith('mips'):
+    if str(CONFIG['CPU_ARCH']).startswith('mips'):
         SOURCES += [
             'mips.cpp',
         ]
@@ -114,7 +114,7 @@ LIBRARY_DEFINES['MOZ_HAS_MOZGLUE'] = True
 
 LDFLAGS += CONFIG['MOZ_GLUE_WRAP_LDFLAGS']
 
-if CONFIG['OS_TARGET'] == 'Darwin':
+if str(CONFIG['OS_TARGET']) == 'Darwin':
     # On OSX 10.10.3, a dead lock happens in some cases involving dynamic
     # symbol resolution for symbols that jemalloc itself uses. While it
     # might be possible to find a way to avoid all such symbol resolutions,
@@ -124,7 +124,7 @@ if CONFIG['OS_TARGET'] == 'Darwin':
     # for TLS.
     LDFLAGS += ['-Wl,-bind_at_load']
 
-if CONFIG['MOZ_LINKER'] and CONFIG['TARGET_CPU'] == 'arm':
+if CONFIG['MOZ_LINKER'] and str(CONFIG['TARGET_CPU']) == 'arm':
     LDFLAGS += ['-Wl,-version-script,%s/arm-eabi-filter' % SRCDIR]
 
 DIST_INSTALL = True
diff --git a/python/mozbuild/mozbuild/action/check_binary.py b/python/mozbuild/mozbuild/action/check_binary.py
index 5665ef053..b696f73d6 100644
--- a/python/mozbuild/mozbuild/action/check_binary.py
+++ b/python/mozbuild/mozbuild/action/check_binary.py
@@ -104,6 +104,8 @@ def iter_readelf_symbols(target, binary):
 
 def iter_readelf_dynamic(target, binary):
     for line in get_output(target['readelf'], '-d', binary):
+        if isinstance(line, bytes):
+            line=line.decode('utf-8')
         data = line.split(None, 2)
         if data and len(data) == 3 and data[0].startswith('0x'):
             yield data[1].rstrip(')').lstrip('('), data[2]
diff --git a/python/mozbuild/mozbuild/action/process_define_files.py b/python/mozbuild/mozbuild/action/process_define_files.py
index 563fbb8fa..c3df2869b 100644
--- a/python/mozbuild/mozbuild/action/process_define_files.py
+++ b/python/mozbuild/mozbuild/action/process_define_files.py
@@ -2,7 +2,7 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, print_function, unicode_literals
+
 
 import argparse
 import os
@@ -53,7 +53,7 @@ def process_define_file(output, input):
                                 'CONFIGURE_DEFINE_FILE')
                         defines = '\n'.join(sorted(
                             '#define %s %s' % (name, val)
-                            for name, val in config.defines['ALLDEFINES'].iteritems()))
+                            for name, val in config.defines['ALLDEFINES'].items()))
                         l = l[:m.start('cmd') - 1] \
                             + defines + l[m.end('name'):]
                     elif cmd == 'define':
diff --git a/python/mozbuild/mozbuild/backend/base.py b/python/mozbuild/mozbuild/backend/base.py
index a8d5c94e0..7cda63475 100644
--- a/python/mozbuild/mozbuild/backend/base.py
+++ b/python/mozbuild/mozbuild/backend/base.py
@@ -2,7 +2,7 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, unicode_literals
+
 
 from abc import (
     ABCMeta,
@@ -31,7 +31,7 @@ from .configenvironment import ConfigEnvironment
 from mozbuild.base import ExecutionSummary
 
 
-class BuildBackend(LoggingMixin):
+class BuildBackend(LoggingMixin, metaclass=ABCMeta):
     """Abstract base class for build backends.
 
     A build backend is merely a consumer of the build configuration (the output
@@ -39,8 +39,6 @@ class BuildBackend(LoggingMixin):
     is the discretion of the specific implementation.
     """
 
-    __metaclass__ = ABCMeta
-
     def __init__(self, environment):
         assert isinstance(environment, (ConfigEnvironment, EmptyConfig))
         self.populate_logger()
@@ -311,7 +309,7 @@ class BuildBackend(LoggingMixin):
         srcdir = mozpath.dirname(obj.input_path)
         pp.context.update({
             k: ' '.join(v) if isinstance(v, list) else v
-            for k, v in obj.config.substs.iteritems()
+            for k, v in obj.config.substs.items()
         })
         pp.context.update(
             top_srcdir=obj.topsrcdir,
diff --git a/python/mozbuild/mozbuild/backend/common.py b/python/mozbuild/mozbuild/backend/common.py
index d00cbbcaf..f747df446 100644
--- a/python/mozbuild/mozbuild/backend/common.py
+++ b/python/mozbuild/mozbuild/backend/common.py
@@ -2,7 +2,7 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, unicode_literals
+
 
 import json
 import os
@@ -174,7 +174,7 @@ class CommonBackend(BuildBackend):
         if len(self._idl_manager.idls):
             self._write_rust_xpidl_summary(self._idl_manager)
             self._handle_idl_manager(self._idl_manager)
-            self._handle_generated_sources(mozpath.join(self.environment.topobjdir, 'dist/include/%s.h' % idl['root']) for idl in self._idl_manager.idls.values())
+            self._handle_generated_sources(mozpath.join(self.environment.topobjdir, 'dist/include/%s.h' % idl['root']) for idl in list(self._idl_manager.idls.values()))
 
 
         for config in self._configs:
@@ -372,14 +372,14 @@ class CommonBackend(BuildBackend):
 
         with self._write_file(mozpath.join(topobjdir, 'dist', 'xpcrs', 'rt', 'all.rs')) as fh:
             fh.write("// THIS FILE IS GENERATED - DO NOT EDIT\n\n")
-            for idl in manager.idls.values():
+            for idl in list(manager.idls.values()):
                 fh.write(include_tmpl % ("rt", idl['root']))
                 fh.write(";\n")
 
         with self._write_file(mozpath.join(topobjdir, 'dist', 'xpcrs', 'bt', 'all.rs')) as fh:
             fh.write("// THIS FILE IS GENERATED - DO NOT EDIT\n\n")
             fh.write("&[\n")
-            for idl in manager.idls.values():
+            for idl in list(manager.idls.values()):
                 fh.write(include_tmpl % ("bt", idl['root']))
                 fh.write(",\n")
             fh.write("]\n")
diff --git a/python/mozbuild/mozbuild/backend/configenvironment.py b/python/mozbuild/mozbuild/backend/configenvironment.py
index 3676a7d18..f0896cea4 100644
--- a/python/mozbuild/mozbuild/backend/configenvironment.py
+++ b/python/mozbuild/mozbuild/backend/configenvironment.py
@@ -2,14 +2,14 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import
+
 
 import os
 import sys
 import json
 
 from collections import Iterable, OrderedDict
-from types import StringTypes, ModuleType
+from types import ModuleType
 
 import mozpack.path as mozpath
 
@@ -22,7 +22,7 @@ from mozbuild.shellutil import quote as shell_quote
 
 
 if sys.version_info.major == 2:
-    text_type = unicode
+    text_type = str
 else:
     text_type = str
 
@@ -151,7 +151,7 @@ class ConfigEnvironment(object):
             shell_quote(self.defines[name]).replace('$', '$$'))
             for name in sorted(global_defines)])
         def serialize(name, obj):
-            if isinstance(obj, StringTypes):
+            if isinstance(obj, str):
                 return obj
             if isinstance(obj, Iterable):
                 return ' '.join(obj)
@@ -185,8 +185,8 @@ class ConfigEnvironment(object):
                 except UnicodeDecodeError:
                     return v.decode('utf-8', 'replace')
 
-        for k, v in self.substs.items():
-            if not isinstance(v, StringTypes):
+        for k, v in list(self.substs.items()):
+            if not isinstance(v, str):
                 if isinstance(v, Iterable):
                     type(v)(decode(i) for i in v)
             elif not isinstance(v, text_type):
@@ -255,7 +255,7 @@ class PartialConfigDict(object):
         existing_files = self._load_config_track()
 
         new_files = set()
-        for k, v in values.iteritems():
+        for k, v in values.items():
             new_files.add(self._write_file(k, v))
 
         for filename in existing_files - new_files:
diff --git a/python/mozbuild/mozbuild/backend/fastermake.py b/python/mozbuild/mozbuild/backend/fastermake.py
index b029aa10f..b66ade64f 100644
--- a/python/mozbuild/mozbuild/backend/fastermake.py
+++ b/python/mozbuild/mozbuild/backend/fastermake.py
@@ -2,7 +2,7 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, unicode_literals, print_function
+
 
 from mozbuild.backend.base import PartialBackend
 from mozbuild.backend.common import CommonBackend
@@ -140,7 +140,7 @@ class FasterMakeBackend(CommonBackend, PartialBackend):
         # Add information for chrome manifest generation
         manifest_targets = []
 
-        for target, entries in self._manifest_entries.iteritems():
+        for target, entries in self._manifest_entries.items():
             manifest_targets.append(target)
             install_target = mozpath.basedir(target, install_manifests_bases)
             self._install_manifests[install_target].add_content(
@@ -152,13 +152,13 @@ class FasterMakeBackend(CommonBackend, PartialBackend):
                          % ' '.join(self._install_manifests.keys()))
 
         # Add dependencies we infered:
-        for target, deps in self._dependencies.iteritems():
+        for target, deps in self._dependencies.items():
             mk.create_rule([target]).add_dependencies(
                 '$(TOPOBJDIR)/%s' % d for d in deps)
 
         mk.add_statement('include $(TOPSRCDIR)/config/faster/rules.mk')
 
-        for base, install_manifest in self._install_manifests.iteritems():
+        for base, install_manifest in self._install_manifests.items():
             with self._write_file(
                     mozpath.join(self.environment.topobjdir, 'faster',
                                  'install_%s' % base.replace('/', '_'))) as fh:
@@ -167,7 +167,7 @@ class FasterMakeBackend(CommonBackend, PartialBackend):
         # For artifact builds only, write a single unified manifest for consumption by |mach watch|.
         if self.environment.is_artifact_build:
             unified_manifest = InstallManifest()
-            for base, install_manifest in self._install_manifests.iteritems():
+            for base, install_manifest in self._install_manifests.items():
                 # Expect 'dist/bin/**', which includes 'dist/bin' with no trailing slash.
                 assert base.startswith('dist/bin')
                 base = base[len('dist/bin'):]
diff --git a/python/mozbuild/mozbuild/backend/recursivemake.py b/python/mozbuild/mozbuild/backend/recursivemake.py
index dd9020d62..aa89cc297 100644
--- a/python/mozbuild/mozbuild/backend/recursivemake.py
+++ b/python/mozbuild/mozbuild/backend/recursivemake.py
@@ -2,7 +2,7 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, unicode_literals
+
 
 import logging
 import os
@@ -12,7 +12,7 @@ from collections import (
     defaultdict,
     namedtuple,
 )
-from StringIO import StringIO
+from io import StringIO
 from itertools import chain
 
 from mozpack.manifests import (
@@ -80,75 +80,76 @@ from ..util import (
 )
 from ..makeutil import Makefile
 from mozbuild.shellutil import quote as shell_quote
+from functools import reduce
 
 MOZBUILD_VARIABLES = [
-    b'ASFLAGS',
-    b'CMSRCS',
-    b'CMMSRCS',
-    b'CPP_UNIT_TESTS',
-    b'DIRS',
-    b'DIST_INSTALL',
-    b'EXTRA_DSO_LDOPTS',
-    b'EXTRA_JS_MODULES',
-    b'EXTRA_PP_COMPONENTS',
-    b'EXTRA_PP_JS_MODULES',
-    b'FORCE_SHARED_LIB',
-    b'FORCE_STATIC_LIB',
-    b'FINAL_LIBRARY',
-    b'HOST_CFLAGS',
-    b'HOST_CSRCS',
-    b'HOST_CMMSRCS',
-    b'HOST_CXXFLAGS',
-    b'HOST_EXTRA_LIBS',
-    b'HOST_LIBRARY_NAME',
-    b'HOST_PROGRAM',
-    b'HOST_SIMPLE_PROGRAMS',
-    b'JAR_MANIFEST',
-    b'JAVA_JAR_TARGETS',
-    b'LIBRARY_NAME',
-    b'LIBS',
-    b'MAKE_FRAMEWORK',
-    b'MODULE',
-    b'NO_DIST_INSTALL',
-    b'NO_EXPAND_LIBS',
-    b'NO_INTERFACES_MANIFEST',
-    b'NO_JS_MANIFEST',
-    b'OS_LIBS',
-    b'PARALLEL_DIRS',
-    b'PREF_JS_EXPORTS',
-    b'PROGRAM',
-    b'RESOURCE_FILES',
-    b'SHARED_LIBRARY_LIBS',
-    b'SHARED_LIBRARY_NAME',
-    b'SIMPLE_PROGRAMS',
-    b'SONAME',
-    b'STATIC_LIBRARY_NAME',
-    b'TEST_DIRS',
-    b'TOOL_DIRS',
+    'ASFLAGS',
+    'CMSRCS',
+    'CMMSRCS',
+    'CPP_UNIT_TESTS',
+    'DIRS',
+    'DIST_INSTALL',
+    'EXTRA_DSO_LDOPTS',
+    'EXTRA_JS_MODULES',
+    'EXTRA_PP_COMPONENTS',
+    'EXTRA_PP_JS_MODULES',
+    'FORCE_SHARED_LIB',
+    'FORCE_STATIC_LIB',
+    'FINAL_LIBRARY',
+    'HOST_CFLAGS',
+    'HOST_CSRCS',
+    'HOST_CMMSRCS',
+    'HOST_CXXFLAGS',
+    'HOST_EXTRA_LIBS',
+    'HOST_LIBRARY_NAME',
+    'HOST_PROGRAM',
+    'HOST_SIMPLE_PROGRAMS',
+    'JAR_MANIFEST',
+    'JAVA_JAR_TARGETS',
+    'LIBRARY_NAME',
+    'LIBS',
+    'MAKE_FRAMEWORK',
+    'MODULE',
+    'NO_DIST_INSTALL',
+    'NO_EXPAND_LIBS',
+    'NO_INTERFACES_MANIFEST',
+    'NO_JS_MANIFEST',
+    'OS_LIBS',
+    'PARALLEL_DIRS',
+    'PREF_JS_EXPORTS',
+    'PROGRAM',
+    'RESOURCE_FILES',
+    'SHARED_LIBRARY_LIBS',
+    'SHARED_LIBRARY_NAME',
+    'SIMPLE_PROGRAMS',
+    'SONAME',
+    'STATIC_LIBRARY_NAME',
+    'TEST_DIRS',
+    'TOOL_DIRS',
     # XXX config/Makefile.in specifies this in a make invocation
     #'USE_EXTENSION_MANIFEST',
-    b'XPCSHELL_TESTS',
-    b'XPIDL_MODULE',
+    'XPCSHELL_TESTS',
+    'XPIDL_MODULE',
 ]
 
 DEPRECATED_VARIABLES = [
-    b'EXPORT_LIBRARY',
-    b'EXTRA_LIBS',
-    b'HOST_LIBS',
-    b'LIBXUL_LIBRARY',
-    b'MOCHITEST_A11Y_FILES',
-    b'MOCHITEST_BROWSER_FILES',
-    b'MOCHITEST_BROWSER_FILES_PARTS',
-    b'MOCHITEST_CHROME_FILES',
-    b'MOCHITEST_FILES',
-    b'MOCHITEST_FILES_PARTS',
-    b'MOCHITEST_METRO_FILES',
-    b'MOCHITEST_ROBOCOP_FILES',
-    b'MODULE_OPTIMIZE_FLAGS',
-    b'MOZ_CHROME_FILE_FORMAT',
-    b'SHORT_LIBNAME',
-    b'TESTING_JS_MODULES',
-    b'TESTING_JS_MODULE_DIR',
+    'EXPORT_LIBRARY',
+    'EXTRA_LIBS',
+    'HOST_LIBS',
+    'LIBXUL_LIBRARY',
+    'MOCHITEST_A11Y_FILES',
+    'MOCHITEST_BROWSER_FILES',
+    'MOCHITEST_BROWSER_FILES_PARTS',
+    'MOCHITEST_CHROME_FILES',
+    'MOCHITEST_FILES',
+    'MOCHITEST_FILES_PARTS',
+    'MOCHITEST_METRO_FILES',
+    'MOCHITEST_ROBOCOP_FILES',
+    'MODULE_OPTIMIZE_FLAGS',
+    'MOZ_CHROME_FILE_FORMAT',
+    'SHORT_LIBNAME',
+    'TESTING_JS_MODULES',
+    'TESTING_JS_MODULE_DIR',
 ]
 
 MOZBUILD_VARIABLES_MESSAGE = 'It should only be defined in moz.build files.'
@@ -207,7 +208,7 @@ class BackendMakeFile(object):
         self.fh.write(buf)
 
     def write_once(self, buf):
-        if isinstance(buf, unicode):
+        if isinstance(buf, str):
             buf = buf.encode('utf-8')
         if b'\n' + buf not in self.fh.getvalue():
             self.write(buf)
@@ -280,7 +281,7 @@ class RecursiveMakeTraversal(object):
         Helper function to call a filter from compute_dependencies and
         traverse.
         """
-        return filter(current, self.get_subdirs(current))
+        return list(filter(current, self.get_subdirs(current)))
 
     def compute_dependencies(self, filter=None):
         """
@@ -710,7 +711,7 @@ class RecursiveMakeBackend(CommonBackend):
         convenience variables, and the other dependency definitions for a
         hopefully proper directory traversal.
         """
-        for tier, no_skip in self._no_skip.items():
+        for tier, no_skip in list(self._no_skip.items()):
             self.log(logging.DEBUG, 'fill_root_mk', {
                 'number': len(no_skip), 'tier': tier
                 }, 'Using {number} directories during {tier}')
@@ -757,7 +758,7 @@ class RecursiveMakeBackend(CommonBackend):
         for tier, filter in filters:
             main, all_deps = \
                 self._traversal.compute_dependencies(filter)
-            for dir, deps in all_deps.items():
+            for dir, deps in list(all_deps.items()):
                 if deps is not None or (dir in self._idl_dirs \
                                         and tier == 'export'):
                     rule = root_deps_mk.create_rule(['%s/%s' % (dir, tier)])
@@ -770,7 +771,7 @@ class RecursiveMakeBackend(CommonBackend):
                 rule.add_dependencies('%s/%s' % (d, tier) for d in main)
 
         all_compile_deps = reduce(lambda x,y: x|y,
-            self._compile_graph.values()) if self._compile_graph else set()
+            list(self._compile_graph.values())) if self._compile_graph else set()
         # Include the following as dependencies of the top recursion target for
         # compilation:
         # - nodes that are not dependended upon by anything. Typically, this
@@ -783,7 +784,7 @@ class RecursiveMakeBackend(CommonBackend):
         #   as direct dependencies of the top recursion target, to somehow
         #   prioritize them.
         #   1. See bug 1262241 comment 5.
-        compile_roots = [t for t, deps in self._compile_graph.iteritems()
+        compile_roots = [t for t, deps in list(self._compile_graph.items())
                          if not deps or t not in all_compile_deps]
 
         rule = root_deps_mk.create_rule(['recurse_compile'])
@@ -845,14 +846,14 @@ class RecursiveMakeBackend(CommonBackend):
             rule.add_dependencies(['$(CURDIR)/%: %'])
 
     def _check_blacklisted_variables(self, makefile_in, makefile_content):
-        if b'EXTERNALLY_MANAGED_MAKE_FILE' in makefile_content:
+        if 'EXTERNALLY_MANAGED_MAKE_FILE' in makefile_content:
             # Bypass the variable restrictions for externally managed makefiles.
             return
 
         for l in makefile_content.splitlines():
             l = l.strip()
             # Don't check comments
-            if l.startswith(b'#'):
+            if l.startswith('#'):
                 continue
             for x in chain(MOZBUILD_VARIABLES, DEPRECATED_VARIABLES):
                 if x not in l:
@@ -909,11 +910,11 @@ class RecursiveMakeBackend(CommonBackend):
                     # Directories with a Makefile containing a tools target, or
                     # XPI_PKGNAME or INSTALL_EXTENSION_ID can't be skipped and
                     # must run during the 'tools' tier.
-                    for t in (b'XPI_PKGNAME', b'INSTALL_EXTENSION_ID',
-                            b'tools'):
+                    for t in ('XPI_PKGNAME', 'INSTALL_EXTENSION_ID',
+                            'tools'):
                         if t not in content:
                             continue
-                        if t == b'tools' and not re.search('(?:^|\s)tools.*::', content, re.M):
+                        if t == 'tools' and not re.search('(?:^|\s)tools.*::', content, re.M):
                             continue
                         if objdir == self.environment.topobjdir:
                             continue
@@ -933,7 +934,7 @@ class RecursiveMakeBackend(CommonBackend):
         self._fill_root_mk()
 
         # Make the master test manifest files.
-        for flavor, t in self._test_manifests.items():
+        for flavor, t in list(self._test_manifests.items()):
             install_prefix, manifests = t
             manifest_stem = mozpath.join(install_prefix, '%s.ini' % flavor)
             self._write_master_test_manifest(mozpath.join(
@@ -1039,7 +1040,7 @@ class RecursiveMakeBackend(CommonBackend):
         for p in ('Makefile', 'backend.mk', '.deps/.mkdir.done'):
             build_files.add_optional_exists(p)
 
-        for idl in manager.idls.values():
+        for idl in list(manager.idls.values()):
             self._install_manifests['dist_idl'].add_link(idl['source'],
                 idl['basename'])
             self._install_manifests['dist_include'].add_optional_exists('%s.h'
@@ -1086,7 +1087,7 @@ class RecursiveMakeBackend(CommonBackend):
 
         interfaces_manifests = []
         dist_dir = mozpath.join(self.environment.topobjdir, 'dist')
-        for manifest, entries in manager.interface_manifests.items():
+        for manifest, entries in list(manager.interface_manifests.items()):
             interfaces_manifests.append(mozpath.join('$(DEPTH)', manifest))
             for xpt in sorted(entries):
                 registered_xpt_files.add(mozpath.join(
@@ -1194,7 +1195,7 @@ class RecursiveMakeBackend(CommonBackend):
         # Don't allow files to be defined multiple times unless it is allowed.
         # We currently allow duplicates for non-test files or test files if
         # the manifest is listed as a duplicate.
-        for source, (dest, is_test) in obj.installs.items():
+        for source, (dest, is_test) in list(obj.installs.items()):
             try:
                 self._install_manifests['_test_files'].add_link(source, dest)
             except ValueError:
@@ -1558,7 +1559,7 @@ class RecursiveMakeBackend(CommonBackend):
         man_dir = mozpath.join(self.environment.topobjdir, '_build_manifests',
             dest)
 
-        for k, manifest in manifests.items():
+        for k, manifest in list(manifests.items()):
             with self._write_file(mozpath.join(man_dir, k)) as fh:
                 manifest.write(fileobj=fh)
 
@@ -1593,20 +1594,20 @@ class RecursiveMakeBackend(CommonBackend):
                 pp.context.update(extra)
             if not pp.context.get('autoconfmk', ''):
                 pp.context['autoconfmk'] = 'autoconf.mk'
-            pp.handleLine(b'# THIS FILE WAS AUTOMATICALLY GENERATED. DO NOT MODIFY BY HAND.\n');
-            pp.handleLine(b'DEPTH := @DEPTH@\n')
-            pp.handleLine(b'topobjdir := @topobjdir@\n')
-            pp.handleLine(b'topsrcdir := @top_srcdir@\n')
-            pp.handleLine(b'srcdir := @srcdir@\n')
-            pp.handleLine(b'VPATH := @srcdir@\n')
-            pp.handleLine(b'relativesrcdir := @relativesrcdir@\n')
-            pp.handleLine(b'include $(DEPTH)/config/@autoconfmk@\n')
+            pp.handleLine('# THIS FILE WAS AUTOMATICALLY GENERATED. DO NOT MODIFY BY HAND.\n');
+            pp.handleLine('DEPTH := @DEPTH@\n')
+            pp.handleLine('topobjdir := @topobjdir@\n')
+            pp.handleLine('topsrcdir := @top_srcdir@\n')
+            pp.handleLine('srcdir := @srcdir@\n')
+            pp.handleLine('VPATH := @srcdir@\n')
+            pp.handleLine('relativesrcdir := @relativesrcdir@\n')
+            pp.handleLine('include $(DEPTH)/config/@autoconfmk@\n')
             if not stub:
                 pp.do_include(obj.input_path)
             # Empty line to avoid failures when last line in Makefile.in ends
             # with a backslash.
-            pp.handleLine(b'\n')
-            pp.handleLine(b'include $(topsrcdir)/config/recurse.mk\n')
+            pp.handleLine('\n')
+            pp.handleLine('include $(topsrcdir)/config/recurse.mk\n')
         if not stub:
             # Adding the Makefile.in here has the desired side-effect
             # that if the Makefile.in disappears, this will force
diff --git a/python/mozbuild/mozbuild/config_status.py b/python/mozbuild/mozbuild/config_status.py
index d46f1332d..a9a27a699 100644
--- a/python/mozbuild/mozbuild/config_status.py
+++ b/python/mozbuild/mozbuild/config_status.py
@@ -77,6 +77,7 @@ def config_status(topobjdir='.', topsrcdir='.', defines=None,
     See build/autoconf/config.status.m4.
     '''
 
+    print("config_status started")
     if 'CONFIG_FILES' in os.environ:
         raise Exception('Using the CONFIG_FILES environment variable is not '
             'supported.')
@@ -119,7 +120,7 @@ def config_status(topobjdir='.', topsrcdir='.', defines=None,
     if 'WRITE_MOZINFO' in os.environ:
         write_mozinfo(os.path.join(topobjdir, 'mozinfo.json'), env, os.environ)
 
-    cpu_start = time.clock()
+    cpu_start = time.perf_counter()
     time_start = time.time()
 
     # Make appropriate backend instances, defaulting to RecursiveMakeBackend,
@@ -155,7 +156,7 @@ def config_status(topobjdir='.', topsrcdir='.', defines=None,
             summary = obj.gyp_summary()
             print(summary, file=sys.stderr)
 
-    cpu_time = time.clock() - cpu_start
+    cpu_time = time.perf_counter() - cpu_start
     wall_time = time.time() - time_start
     efficiency = cpu_time / wall_time if wall_time else 100
     untracked = wall_time - execution_time
@@ -179,3 +180,5 @@ def config_status(topobjdir='.', topsrcdir='.', defines=None,
     # Advertise Android Studio if it is appropriate.
     if MachCommandConditions.is_android(env):
         print(ANDROID_IDE_ADVERTISEMENT)
+
+    print("config_status finished")
diff --git a/python/mozbuild/mozbuild/configure/__init__.py b/python/mozbuild/mozbuild/configure/__init__.py
index d03615707..13d623d4f 100644
--- a/python/mozbuild/mozbuild/configure/__init__.py
+++ b/python/mozbuild/mozbuild/configure/__init__.py
@@ -2,9 +2,9 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, print_function, unicode_literals
 
-import __builtin__
+
+import builtins
 import inspect
 import logging
 import os
@@ -38,6 +38,8 @@ from mozbuild.util import (
 
 import mozpack.path as mozpath
 
+import traceback
+
 
 class ConfigureError(Exception):
     pass
@@ -69,7 +71,7 @@ class SandboxDependsFunction(object):
     def __getattr__(self, key):
         return self._getattr(key).sandboxed
 
-    def __nonzero__(self):
+    def __bool__(self):
         raise ConfigureError(
             'Cannot do boolean operations on @depends functions.')
 
@@ -96,6 +98,7 @@ class DependsFunction(object):
             sandbox._value_for(self)
         elif not sandbox._help:
             sandbox._execution_queue.append((sandbox._value_for, (self,)))
+            sandbox.tasks_debug_out("DependsFunction.__init %s" % func.__name__)
 
     @property
     def name(self):
@@ -206,6 +209,15 @@ class CombinedDependsFunction(DependsFunction):
     def __ne__(self, other):
         return not self == other
 
+    def __hash__(self):
+        # This was one was taken from [1] initially. Should not have done that:
+        # it causes explosion of ConfigureSandbox._execution_queue with 100%
+        # CPU load and eating all avaliable memory...
+        #
+        # [1] https://code.foxkit.us/adelie/packages/blob/f2b5773da19ab397fbe64fd32dacc383cfe4cd77/user/mozjs/python3.patch#L8068
+        return hash((self._name, tuple(self.dependencies)))
+
+
 class SandboxedGlobal(dict):
     '''Identifiable dict type for use as function global'''
 
@@ -253,11 +265,12 @@ class ConfigureSandbox(dict):
     # The default set of builtins. We expose unicode as str to make sandboxed
     # files more python3-ready.
     BUILTINS = ReadOnlyDict({
-        b: getattr(__builtin__, b)
+        b: getattr(builtins, b)
         for b in ('None', 'False', 'True', 'int', 'bool', 'any', 'all', 'len',
                   'list', 'tuple', 'set', 'dict', 'isinstance', 'getattr',
-                  'hasattr', 'enumerate', 'range', 'zip')
-    }, __import__=forbidden_import, str=unicode)
+                  'hasattr', 'enumerate', 'range', 'zip', '__build_class__',
+                  'bytes', 'exec')
+    }, __import__=forbidden_import, str=str)
 
     # Expose a limited set of functions from os.path
     OS = ReadOnlyNamespace(path=ReadOnlyNamespace(**{
@@ -294,6 +307,11 @@ class ConfigureSandbox(dict):
         # Queue of functions to execute, with their arguments
         self._execution_queue = []
 
+        # For debugging: Show number of tasks started in run() / added elsewhere
+        # and some additional info
+        self.task_debug = False # set True to enable
+        self.tasks_started = 0
+
         # Store the `when`s associated to some options.
         self._conditions = {}
 
@@ -331,7 +349,7 @@ class ConfigureSandbox(dict):
                 return method
             def wrapped(*args, **kwargs):
                 out_args = [
-                    arg.decode(encoding) if isinstance(arg, str) else arg
+                    arg.decode(encoding) if isinstance(arg, bytes) else arg
                     for arg in args
                 ]
                 return method(*out_args, **kwargs)
@@ -360,6 +378,14 @@ class ConfigureSandbox(dict):
             handler.setFormatter(formatter)
             logger.addHandler(handler)
 
+    def tasks_debug_out(self, text):
+        if self.task_debug:
+            print("%s / queued %i / done %i" %(text, len(self._execution_queue), self.tasks_started))
+            #if len(self._execution_queue) > 5000:
+            #    traceback.print_stack(file=sys.stdout)
+            #if len(self._execution_queue) > 5010:
+            #    raise Exception("Too many tasks")
+
     def include_file(self, path):
         '''Include one file in the sandbox. Users of this class probably want
         to use `run` instead.
@@ -380,6 +406,9 @@ class ConfigureSandbox(dict):
         if path in self._all_paths:
             raise ConfigureError(
                 'Cannot include `%s` because it was included already.' % path)
+
+        if self.task_debug:
+            print("include_file", path)
         self._paths.append(path)
         self._all_paths.add(path)
 
@@ -398,7 +427,7 @@ class ConfigureSandbox(dict):
         if path:
             self.include_file(path)
 
-        for option in self._options.itervalues():
+        for option in self._options.values():
             # All options must be referenced by some @depends function
             if option not in self._seen:
                 raise ConfigureError(
@@ -425,6 +454,8 @@ class ConfigureSandbox(dict):
 
         # Run the execution queue
         for func, args in self._execution_queue:
+            self.tasks_started += 1
+            self.tasks_debug_out("ConfigureSandbox.run(%s)" % func.__name__)
             func(*args)
 
         if self._help:
@@ -504,7 +535,7 @@ class ConfigureSandbox(dict):
                     value = PositiveOptionValue()
                 elif value is False or value == ():
                     value = NegativeOptionValue()
-                elif isinstance(value, types.StringTypes):
+                elif isinstance(value, (str,)):
                     value = PositiveOptionValue((value,))
                 elif isinstance(value, tuple):
                     value = PositiveOptionValue(value)
@@ -544,7 +575,7 @@ class ConfigureSandbox(dict):
         return value
 
     def _dependency(self, arg, callee_name, arg_name=None):
-        if isinstance(arg, types.StringTypes):
+        if isinstance(arg, (str,)):
             prefix, name, values = Option.split_option(arg)
             if values != ():
                 raise ConfigureError("Option must not contain an '='")
@@ -608,7 +639,7 @@ class ConfigureSandbox(dict):
         '''
         when = self._normalize_when(kwargs.get('when'), 'option')
         args = [self._resolve(arg) for arg in args]
-        kwargs = {k: self._resolve(v) for k, v in kwargs.iteritems()
+        kwargs = {k: self._resolve(v) for k, v in kwargs.items()
                                       if k != 'when'}
         option = Option(*args, **kwargs)
         if when:
@@ -689,7 +720,7 @@ class ConfigureSandbox(dict):
         with self.only_when_impl(when):
             what = self._resolve(what)
             if what:
-                if not isinstance(what, types.StringTypes):
+                if not isinstance(what, (str,)):
                     raise TypeError("Unexpected type: '%s'" % type(what).__name__)
                 self.include_file(what)
 
@@ -707,7 +738,7 @@ class ConfigureSandbox(dict):
             (k[:-len('_impl')], getattr(self, k))
             for k in dir(self) if k.endswith('_impl') and k != 'template_impl'
         )
-        glob.update((k, v) for k, v in self.iteritems() if k not in glob)
+        glob.update((k, v) for k, v in self.items() if k not in glob)
 
         # Any function argument to the template must be prepared to be sandboxed.
         # If the template itself returns a function (in which case, it's very
@@ -731,7 +762,7 @@ class ConfigureSandbox(dict):
             def wrapper(*args, **kwargs):
                 args = [maybe_prepare_function(arg) for arg in args]
                 kwargs = {k: maybe_prepare_function(v)
-                          for k, v in kwargs.iteritems()}
+                          for k, v in kwargs.items()}
                 ret = template(*args, **kwargs)
                 if isfunction(ret):
                     # We can't expect the sandboxed code to think about all the
@@ -766,7 +797,7 @@ class ConfigureSandbox(dict):
         for value, required in (
                 (_import, True), (_from, False), (_as, False)):
 
-            if not isinstance(value, types.StringTypes) and (
+            if not isinstance(value, (str,)) and (
                     required or value is not None):
                 raise TypeError("Unexpected type: '%s'" % type(value).__name__)
             if value is not None and not self.RE_MODULE.match(value):
@@ -807,7 +838,7 @@ class ConfigureSandbox(dict):
         # Special case for the open() builtin, because otherwise, using it
         # fails with "IOError: file() constructor not accessible in
         # restricted mode"
-        if what == '__builtin__.open':
+        if what == 'builtins.open':
             return lambda *args, **kwargs: open(*args, **kwargs)
         # Until this proves to be a performance problem, just construct an
         # import statement and execute it.
@@ -829,7 +860,7 @@ class ConfigureSandbox(dict):
         name = self._resolve(name, need_help_dependency=False)
         if name is None:
             return
-        if not isinstance(name, types.StringTypes):
+        if not isinstance(name, (str,)):
             raise TypeError("Unexpected type: '%s'" % type(name).__name__)
         if name in data:
             raise ConfigureError(
@@ -850,6 +881,7 @@ class ConfigureSandbox(dict):
 
         self._execution_queue.append((
             self._resolve_and_set, (self._config, name, value, when)))
+        self.tasks_debug_out("ConfigureSandbox.set_config_impl / %s(%s" % (name, value))
 
     def set_define_impl(self, name, value, when=None):
         '''Implementation of set_define().
@@ -864,6 +896,7 @@ class ConfigureSandbox(dict):
         defines = self._config.setdefault('DEFINES', {})
         self._execution_queue.append((
             self._resolve_and_set, (defines, name, value, when)))
+        self.tasks_debug_out("ConfigureSandbox.set_define_impl / %s(%s)" % (name, value))
 
     def imply_option_impl(self, option, value, reason=None, when=None):
         '''Implementation of imply_option().
@@ -922,7 +955,7 @@ class ConfigureSandbox(dict):
                 if isinstance(possible_reasons[0], Option):
                     reason = possible_reasons[0]
         if not reason and (isinstance(value, (bool, tuple)) or
-                           isinstance(value, types.StringTypes)):
+                           isinstance(value, (str,))):
             # A reason can be provided automatically when imply_option
             # is called with an immediate value.
             _, filename, line, _, _, _ = inspect.stack()[1]
@@ -955,10 +988,10 @@ class ConfigureSandbox(dict):
         if not inspect.isfunction(func):
             raise TypeError("Unexpected type: '%s'" % type(func).__name__)
         if func in self._prepared_functions:
-            return func, func.func_globals
+            return func, func.__globals__
 
         glob = SandboxedGlobal(
-            (k, v) for k, v in func.func_globals.iteritems()
+            (k, v) for k, v in func.__globals__.items()
             if (inspect.isfunction(v) and v not in self._templates) or (
                 inspect.isclass(v) and issubclass(v, Exception))
         )
@@ -979,20 +1012,20 @@ class ConfigureSandbox(dict):
         # Note this is not entirely bullet proof (if the value is e.g. a list,
         # the list contents could have changed), but covers the bases.
         closure = None
-        if func.func_closure:
+        if func.__closure__:
             def makecell(content):
                 def f():
                     content
-                return f.func_closure[0]
+                return f.__closure__[0]
 
             closure = tuple(makecell(cell.cell_contents)
-                            for cell in func.func_closure)
+                            for cell in func.__closure__)
 
         new_func = self.wraps(func)(types.FunctionType(
-            func.func_code,
+            func.__code__,
             glob,
             func.__name__,
-            func.func_defaults,
+            func.__defaults__,
             closure
         ))
         @self.wraps(new_func)
diff --git a/python/mozbuild/mozbuild/configure/check_debug_ranges.py b/python/mozbuild/mozbuild/configure/check_debug_ranges.py
index c0caa9cc5..a3e1f37e1 100644
--- a/python/mozbuild/mozbuild/configure/check_debug_ranges.py
+++ b/python/mozbuild/mozbuild/configure/check_debug_ranges.py
@@ -6,7 +6,7 @@
 # to a given compilation unit. This is used as a helper to find a bug in some
 # versions of GNU ld.
 
-from __future__ import absolute_import
+
 
 import subprocess
 import sys
@@ -45,6 +45,8 @@ def get_range_length(range, debug_ranges):
 def main(bin, compilation_unit):
     p = subprocess.Popen(['objdump', '-W', bin], stdout = subprocess.PIPE, stderr = subprocess.PIPE)
     (out, err) = p.communicate()
+    if isinstance(out, bytes):
+        out = out.decode('utf-8')
     sections = re.split('\n(Contents of the|The section) ', out)
     debug_info = [s for s in sections if s.startswith('.debug_info')]
     debug_ranges = [s for s in sections if s.startswith('.debug_ranges')]
@@ -59,4 +61,4 @@ def main(bin, compilation_unit):
 
 
 if __name__ == '__main__':
-    print(main(*sys.argv[1:]))
+    print((main(*sys.argv[1:])))
diff --git a/python/mozbuild/mozbuild/configure/options.py b/python/mozbuild/mozbuild/configure/options.py
index 53ae2ae6d..4d80cad86 100644
--- a/python/mozbuild/mozbuild/configure/options.py
+++ b/python/mozbuild/mozbuild/configure/options.py
@@ -2,7 +2,7 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, print_function, unicode_literals
+
 
 import os
 import sys
@@ -12,7 +12,7 @@ from collections import OrderedDict
 
 def istupleofstrings(obj):
     return isinstance(obj, tuple) and len(obj) and all(
-        isinstance(o, types.StringTypes) for o in obj)
+        isinstance(o, (str,)) for o in obj)
 
 
 class OptionValue(tuple):
@@ -88,7 +88,7 @@ class PositiveOptionValue(OptionValue):
     in the form of a tuple for when values are given to the option (in the form
     --option=value[,value2...].
     '''
-    def __nonzero__(self):
+    def __bool__(self):
         return True
 
 
@@ -113,7 +113,7 @@ class ConflictingOptionError(InvalidOptionError):
         if format_data:
             message = message.format(**format_data)
         super(ConflictingOptionError, self).__init__(message)
-        for k, v in format_data.iteritems():
+        for k, v in format_data.items():
             setattr(self, k, v)
 
 
@@ -149,7 +149,7 @@ class Option(object):
                 'At least an option name or an environment variable name must '
                 'be given')
         if name:
-            if not isinstance(name, types.StringTypes):
+            if not isinstance(name, (str,)):
                 raise InvalidOptionError('Option must be a string')
             if not name.startswith('--'):
                 raise InvalidOptionError('Option must start with `--`')
@@ -158,7 +158,7 @@ class Option(object):
             if not name.islower():
                 raise InvalidOptionError('Option must be all lowercase')
         if env:
-            if not isinstance(env, types.StringTypes):
+            if not isinstance(env, (str,)):
                 raise InvalidOptionError(
                     'Environment variable name must be a string')
             if not env.isupper():
@@ -168,8 +168,8 @@ class Option(object):
                 isinstance(nargs, int) and nargs >= 0):
             raise InvalidOptionError(
                 "nargs must be a positive integer, '?', '*' or '+'")
-        if (not isinstance(default, types.StringTypes) and
-                not isinstance(default, (bool, types.NoneType)) and
+        if (not isinstance(default, (str,)) and
+                not isinstance(default, (bool, type(None))) and
                 not istupleofstrings(default)):
             raise InvalidOptionError(
                 'default must be a bool, a string or a tuple of strings')
@@ -241,7 +241,7 @@ class Option(object):
                     ', '.join("'%s'" % c for c in choices))
         elif has_choices:
             maxargs = self.maxargs
-            if len(choices) < maxargs and maxargs != sys.maxint:
+            if len(choices) < maxargs and maxargs != sys.maxsize:
                 raise InvalidOptionError('Not enough `choices` for `nargs`')
         self.choices = choices
         self.help = help
@@ -255,7 +255,7 @@ class Option(object):
         where prefix is one of 'with', 'without', 'enable' or 'disable'.
         The '=values' part is optional. Values are separated with commas.
         '''
-        if not isinstance(option, types.StringTypes):
+        if not isinstance(option, (str,)):
             raise InvalidOptionError('Option must be a string')
 
         elements = option.split('=', 1)
@@ -308,7 +308,7 @@ class Option(object):
     def maxargs(self):
         if isinstance(self.nargs, int):
             return self.nargs
-        return 1 if self.nargs == '?' else sys.maxint
+        return 1 if self.nargs == '?' else sys.maxsize
 
     def _validate_nargs(self, num):
         minargs, maxargs = self.minargs, self.maxargs
@@ -499,5 +499,5 @@ class CommandLineHelper(object):
 
     def __iter__(self):
         for d in (self._args, self._extra_args):
-            for arg, pos in d.itervalues():
+            for arg, pos in d.values():
                 yield arg
diff --git a/python/mozbuild/mozbuild/configure/util.py b/python/mozbuild/mozbuild/configure/util.py
index 9d8b2eb0e..a12986e48 100644
--- a/python/mozbuild/mozbuild/configure/util.py
+++ b/python/mozbuild/mozbuild/configure/util.py
@@ -77,15 +77,7 @@ class ConfigureOutputHandler(logging.Handler):
         # Python has this feature where it sets the encoding of pipes to
         # ascii, which blatantly fails when trying to print out non-ascii.
         def fix_encoding(fh):
-            try:
-                isatty = fh.isatty()
-            except AttributeError:
-                isatty = True
-
-            if not isatty:
-                encoding = getpreferredencoding()
-                if encoding:
-                    return codecs.getwriter(encoding)(fh)
+            # no magic on oe / python3
             return fh
 
         self._stdout = fix_encoding(stdout)
@@ -200,7 +192,7 @@ class LineIO(object):
         self._errors = errors
 
     def write(self, buf):
-        if self._encoding and isinstance(buf, str):
+        if self._encoding and isinstance(buf, bytes):
             buf = buf.decode(self._encoding, self._errors)
         lines = buf.splitlines()
         if not lines:
diff --git a/python/mozbuild/mozbuild/controller/building.py b/python/mozbuild/mozbuild/controller/building.py
index d5af532f7..e9810fe58 100644
--- a/python/mozbuild/mozbuild/controller/building.py
+++ b/python/mozbuild/mozbuild/controller/building.py
@@ -2,7 +2,7 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, unicode_literals
+
 
 import errno
 import getpass
@@ -146,7 +146,7 @@ class TierStatus(object):
         """
         o = []
 
-        for tier, state in self.tiers.items():
+        for tier, state in list(self.tiers.items()):
             t_entry = dict(
                 name=tier,
                 start=state['begin_time'],
@@ -574,7 +574,7 @@ class BuildProgressFooter(Footer):
 
     def __init__(self, terminal, monitor):
         Footer.__init__(self, terminal)
-        self.tiers = monitor.tiers.tier_status.viewitems()
+        self.tiers = monitor.tiers.tier_status.items()
 
     def draw(self):
         """Draws this footer in the terminal."""
@@ -911,8 +911,8 @@ class CCacheStats(object):
 
         return '\n'.join(lines)
 
-    def __nonzero__(self):
-        relative_values = [v for k, v in self._values.items()
+    def __bool__(self):
+        relative_values = [v for k, v in list(self._values.items())
                            if k not in self.ABSOLUTE_KEYS]
         return (all(v >= 0 for v in relative_values) and
                 any(v > 0 for v in relative_values))
@@ -1156,7 +1156,7 @@ class BuildDriver(MozbuildObject):
 
         high_finder, finder_percent = monitor.have_high_finder_usage()
         if high_finder:
-            print(FINDER_SLOW_MESSAGE % finder_percent)
+            print((FINDER_SLOW_MESSAGE % finder_percent))
 
         ccache_end = monitor.ccache_stats()
 
@@ -1276,8 +1276,8 @@ class BuildDriver(MozbuildObject):
         """Install test files."""
 
         if self.is_clobber_needed():
-            print(INSTALL_TESTS_CLOBBER.format(
-                  clobber_file=os.path.join(self.topobjdir, 'CLOBBER')))
+            print((INSTALL_TESTS_CLOBBER.format(
+                  clobber_file=os.path.join(self.topobjdir, 'CLOBBER'))))
             sys.exit(1)
 
         if not test_objs:
diff --git a/python/mozbuild/mozbuild/frontend/context.py b/python/mozbuild/mozbuild/frontend/context.py
index fbdbefc1d..1aef6a65a 100644
--- a/python/mozbuild/mozbuild/frontend/context.py
+++ b/python/mozbuild/mozbuild/frontend/context.py
@@ -14,7 +14,7 @@ If you are looking for the absolute authority on what moz.build files can
 contain, you've come to the right place.
 """
 
-from __future__ import absolute_import, unicode_literals
+
 
 import os
 
@@ -237,15 +237,15 @@ class Context(KeyedDefaultDict):
         This function is transactional: if setitem fails for one of the values,
         the context is not updated at all."""
         if isinstance(iterable, dict):
-            iterable = iterable.items()
+            iterable = list(iterable.items())
 
         update = {}
-        for key, value in itertools.chain(iterable, kwargs.items()):
+        for key, value in itertools.chain(iterable, list(kwargs.items())):
             stored_type = self._validate(key, value)
             # Don't create an instance of stored_type if coercion is needed,
             # until all values are validated.
             update[key] = (value, stored_type)
-        for key, (value, stored_type) in update.items():
+        for key, (value, stored_type) in list(update.items()):
             if not isinstance(value, stored_type):
                 update[key] = stored_type(value)
             else:
@@ -311,7 +311,7 @@ class BaseCompileFlags(ContextDerivedValue, dict):
         # a template were set and which were provided as defaults.
         template_name = getattr(context, 'template', None)
         if template_name in (None, 'Gyp'):
-            dict.__init__(self, ((k, v if v is None else TypedList(unicode)(v))
+            dict.__init__(self, ((k, v if v is None else TypedList(str)(v))
                                  for k, v, _ in self.flag_variables))
         else:
             dict.__init__(self)
@@ -520,13 +520,13 @@ class CompileFlags(BaseCompileFlags):
         if key in self and self[key] is None:
             raise ValueError('`%s` may not be set in COMPILE_FLAGS from moz.build, this '
                              'value is resolved from the emitter.' % key)
-        if not (isinstance(value, list) and all(isinstance(v, basestring) for v in value)):
+        if not (isinstance(value, list) and all(isinstance(v, str) for v in value)):
             raise ValueError('A list of strings must be provided as a value for a '
                              'compile flags category.')
         dict.__setitem__(self, key, value)
 
 
-class FinalTargetValue(ContextDerivedValue, unicode):
+class FinalTargetValue(ContextDerivedValue, str):
     def __new__(cls, context, value=""):
         if not value:
             value = 'dist/'
@@ -536,7 +536,7 @@ class FinalTargetValue(ContextDerivedValue, unicode):
                 value += 'bin'
             if context['DIST_SUBDIR']:
                 value += '/' + context['DIST_SUBDIR']
-        return unicode.__new__(cls, value)
+        return str.__new__(cls, value)
 
 
 def Enum(*values):
@@ -584,7 +584,7 @@ class PathMeta(type):
                 cls = SourcePath
         return super(PathMeta, cls).__call__(context, value)
 
-class Path(ContextDerivedValue, unicode):
+class Path(ContextDerivedValue, str, metaclass=PathMeta):
     """Stores and resolves a source path relative to a given context
 
     This class is used as a backing type for some of the sandbox variables.
@@ -595,7 +595,6 @@ class Path(ContextDerivedValue, unicode):
       - '!objdir/relative/paths'
       - '%/filesystem/absolute/paths'
     """
-    __metaclass__ = PathMeta
 
     def __new__(cls, context, value=None):
         return super(Path, cls).__new__(cls, value)
@@ -612,10 +611,14 @@ class Path(ContextDerivedValue, unicode):
         """
         return Path(self.context, mozpath.join(self, *p))
 
+    @staticmethod
+    def cmp(a, b):
+        return (a > b) - (a < b)
+
     def __cmp__(self, other):
         if isinstance(other, Path) and self.srcdir != other.srcdir:
-            return cmp(self.full_path, other.full_path)
-        return cmp(unicode(self), other)
+            return self.cmp(self.full_path, other.full_path)
+        return self.cmp(str(self), other)
 
     # __cmp__ is not enough because unicode has __eq__, __ne__, etc. defined
     # and __cmp__ is only used for those when they don't exist.
@@ -773,7 +776,7 @@ def ContextDerivedTypedRecord(*fields):
         __slots__ = tuple([name for name, _ in fields])
 
         def __init__(self, context):
-            for fname, ftype in self._fields.items():
+            for fname, ftype in list(self._fields.items()):
                 if issubclass(ftype, ContextDerivedValue):
                     setattr(self, fname, self._fields[fname](context))
                 else:
@@ -909,8 +912,8 @@ def TypedListWithAction(typ, action):
     return _TypedListWithAction
 
 WebPlatformTestManifest = TypedNamedTuple("WebPlatformTestManifest",
-                                          [("manifest_path", unicode),
-                                           ("test_root", unicode)])
+                                          [("manifest_path", str),
+                                           ("test_root", str)])
 ManifestparserManifestList = OrderedPathListWithAction(read_manifestparser_manifest)
 ReftestManifestList = OrderedPathListWithAction(read_reftest_manifest)
 WptManifestList = TypedListWithAction(WebPlatformTestManifest, read_wpt_manifest)
@@ -918,18 +921,18 @@ WptManifestList = TypedListWithAction(WebPlatformTestManifest, read_wpt_manifest
 OrderedSourceList = ContextDerivedTypedList(SourcePath, StrictOrderingOnAppendList)
 OrderedTestFlavorList = TypedList(Enum(*all_test_flavors()),
                                   StrictOrderingOnAppendList)
-OrderedStringList = TypedList(unicode, StrictOrderingOnAppendList)
+OrderedStringList = TypedList(str, StrictOrderingOnAppendList)
 DependentTestsEntry = ContextDerivedTypedRecord(('files', OrderedSourceList),
                                                 ('tags', OrderedStringList),
                                                 ('flavors', OrderedTestFlavorList))
 BugzillaComponent = TypedNamedTuple('BugzillaComponent',
-                        [('product', unicode), ('component', unicode)])
+                        [('product', str), ('component', str)])
 SchedulingComponents = ContextDerivedTypedRecord(
-        ('inclusive', TypedList(unicode, StrictOrderingOnAppendList)),
-        ('exclusive', TypedList(unicode, StrictOrderingOnAppendList)))
+        ('inclusive', TypedList(str, StrictOrderingOnAppendList)),
+        ('exclusive', TypedList(str, StrictOrderingOnAppendList)))
 
 GeneratedFilesList = StrictOrderingOnAppendListWithFlagsFactory({
-    'script': unicode,
+    'script': str,
     'inputs': list,
     'flags': list, })
 
@@ -1096,7 +1099,7 @@ class Files(SubContext):
         self.test_tags |= other.test_tags
         self.test_flavors |= other.test_flavors
 
-        for k, v in other.items():
+        for k, v in list(other.items()):
             if k == 'IMPACTED_TESTS':
                 self.test_files |= set(mozpath.relpath(e.full_path, e.context.config.topsrcdir)
                                        for e in v.files)
@@ -1154,7 +1157,7 @@ class Files(SubContext):
 
         bug_components = Counter()
 
-        for f in files.values():
+        for f in list(files.values()):
             bug_component = f.get('BUG_COMPONENT')
             if bug_component:
                 bug_components[bug_component] += 1
@@ -1232,7 +1235,7 @@ VARIABLES = {
         RustLibrary template instead.
         """),
 
-    'RUST_LIBRARY_TARGET_DIR': (unicode, unicode,
+    'RUST_LIBRARY_TARGET_DIR': (str, str,
         """Where CARGO_TARGET_DIR should point when compiling this library.  If
         not set, it defaults to the current objdir.  It should be a relative path
         to the current objdir; absolute paths should not be used.
@@ -1248,7 +1251,7 @@ VARIABLES = {
         HostRustLibrary template instead.
         """),
 
-    'RUST_TEST': (unicode, unicode,
+    'RUST_TEST': (str, str,
         """Name of a Rust test to build and run via `cargo test`.
 
         This variable should not be used directly; you should be using the
@@ -1487,7 +1490,7 @@ VARIABLES = {
         """Like ``OBJDIR_FILES``, with preprocessing. Use sparingly.
         """),
 
-    'FINAL_LIBRARY': (unicode, unicode,
+    'FINAL_LIBRARY': (str, str,
         """Library in which the objects of the current directory will be linked.
 
         This variable contains the name of a library, defined elsewhere with
@@ -1528,7 +1531,7 @@ VARIABLES = {
         with the host compiler.
         """),
 
-    'HOST_LIBRARY_NAME': (unicode, unicode,
+    'HOST_LIBRARY_NAME': (str, str,
         """Name of target library generated when cross compiling.
         """),
 
@@ -1546,7 +1549,7 @@ VARIABLES = {
         libraries that link into this library via FINAL_LIBRARY.
         """),
 
-    'LIBRARY_NAME': (unicode, unicode,
+    'LIBRARY_NAME': (str, str,
         """The code name of the library generated for a directory.
 
         By default STATIC_LIBRARY_NAME and SHARED_LIBRARY_NAME take this name.
@@ -1558,7 +1561,7 @@ VARIABLES = {
         ``example/components/xpcomsample.lib`` on Windows.
         """),
 
-    'SHARED_LIBRARY_NAME': (unicode, unicode,
+    'SHARED_LIBRARY_NAME': (str, str,
         """The name of the static library generated for a directory, if it needs to
         differ from the library code name.
 
@@ -1572,7 +1575,7 @@ VARIABLES = {
         Implies FORCE_SHARED_LIB.
         """),
 
-    'STATIC_LIBRARY_NAME': (unicode, unicode,
+    'STATIC_LIBRARY_NAME': (str, str,
         """The name of the static library generated for a directory, if it needs to
         differ from the library code name.
 
@@ -1604,31 +1607,31 @@ VARIABLES = {
 
         This variable contains a list of system libaries to link against.
         """),
-    'RCFILE': (unicode, unicode,
+    'RCFILE': (str, str,
         """The program .rc file.
 
         This variable can only be used on Windows.
         """),
 
-    'RESFILE': (unicode, unicode,
+    'RESFILE': (str, str,
         """The program .res file.
 
         This variable can only be used on Windows.
         """),
 
-    'RCINCLUDE': (unicode, unicode,
+    'RCINCLUDE': (str, str,
         """The resource script file to be included in the default .res file.
 
         This variable can only be used on Windows.
         """),
 
-    'DEFFILE': (unicode, unicode,
+    'DEFFILE': (str, str,
         """The program .def (module definition) file.
 
         This variable can only be used on Windows.
         """),
 
-    'SYMBOLS_FILE': (Path, unicode,
+    'SYMBOLS_FILE': (Path, str,
         """A file containing a list of symbols to export from a shared library.
 
         The given file contains a list of symbols to be exported, and is
@@ -1649,7 +1652,7 @@ VARIABLES = {
         ``BIN_SUFFIX``, the name will remain unchanged.
         """),
 
-    'SONAME': (unicode, unicode,
+    'SONAME': (str, str,
         """The soname of the shared object currently being linked
 
         soname is the "logical name" of a shared object, often used to provide
@@ -1719,7 +1722,7 @@ VARIABLES = {
         ``GENERATED_FILES``.
         """),
 
-    'PROGRAM' : (unicode, unicode,
+    'PROGRAM' : (str, str,
         """Compiled executable name.
 
         If the configuration token ``BIN_SUFFIX`` is set, its value will be
@@ -1727,7 +1730,7 @@ VARIABLES = {
         ``BIN_SUFFIX``, ``PROGRAM`` will remain unchanged.
         """),
 
-    'HOST_PROGRAM' : (unicode, unicode,
+    'HOST_PROGRAM' : (str, str,
         """Compiled host executable name.
 
         If the configuration token ``HOST_BIN_SUFFIX`` is set, its value will be
@@ -1765,7 +1768,7 @@ VARIABLES = {
         files.
         """),
 
-    'XPIDL_MODULE': (unicode, unicode,
+    'XPIDL_MODULE': (str, str,
         """XPCOM Interface Definition Module Name.
 
         This is the name of the ``.xpt`` file that is created by linking
@@ -1924,14 +1927,14 @@ VARIABLES = {
 
 
     # The following variables are used to control the target of installed files.
-    'XPI_NAME': (unicode, unicode,
+    'XPI_NAME': (str, str,
         """The name of an extension XPI to generate.
 
         When this variable is present, the results of this directory will end up
         being packaged into an extension instead of the main dist/bin results.
         """),
 
-    'DIST_SUBDIR': (unicode, unicode,
+    'DIST_SUBDIR': (str, str,
         """The name of an alternate directory to install files to.
 
         When this variable is present, the results of this directory will end up
@@ -1939,7 +1942,7 @@ VARIABLES = {
         otherwise be placed.
         """),
 
-    'FINAL_TARGET': (FinalTargetValue, unicode,
+    'FINAL_TARGET': (FinalTargetValue, str,
         """The name of the directory to install targets to.
 
         The directory is relative to the top of the object directory. The
@@ -1970,7 +1973,7 @@ VARIABLES = {
 
     'GYP_DIRS': (StrictOrderingOnAppendListWithFlagsFactory({
             'variables': dict,
-            'input': unicode,
+            'input': str,
             'sandbox_vars': dict,
             'no_chromium': bool,
             'no_unified': bool,
@@ -2194,7 +2197,7 @@ VARIABLES = {
 }
 
 # Sanity check: we don't want any variable above to have a list as storage type.
-for name, (storage_type, input_types, docs) in VARIABLES.items():
+for name, (storage_type, input_types, docs) in list(VARIABLES.items()):
     if storage_type == list:
         raise RuntimeError('%s has a "list" storage type. Use "List" instead.'
             % name)
diff --git a/python/mozbuild/mozbuild/frontend/data.py b/python/mozbuild/mozbuild/frontend/data.py
index 442fc9e0a..837453a9f 100644
--- a/python/mozbuild/mozbuild/frontend/data.py
+++ b/python/mozbuild/mozbuild/frontend/data.py
@@ -15,7 +15,7 @@ contains the code for converting executed mozbuild files into these data
 structures.
 """
 
-from __future__ import absolute_import, unicode_literals
+
 
 from mozbuild.util import StrictOrderingOnAppendList
 from mozpack.chrome.manifest import ManifestEntry
@@ -182,7 +182,7 @@ class ComputedFlags(ContextDerived):
             if value:
                 for dest_var in dest_vars:
                     flags[dest_var].extend(value)
-        return flags.items()
+        return list(flags.items())
 
 class XPIDLFile(ContextDerived):
     """Describes an XPIDL file to be compiled."""
@@ -213,7 +213,7 @@ class BaseDefines(ContextDerived):
         self.defines = defines
 
     def get_defines(self):
-        for define, value in self.defines.iteritems():
+        for define, value in self.defines.items():
             if value is True:
                 yield('-D%s' % define)
             elif value is False:
@@ -494,7 +494,7 @@ class SimpleProgram(BaseProgram):
     KIND = 'target'
 
     def source_files(self):
-        for srcs in self.sources.values():
+        for srcs in list(self.sources.values()):
             for f in srcs:
                 if mozpath.basename(mozpath.splitext(f)[0]) == mozpath.splitext(self.program)[0]:
                     return [f]
diff --git a/python/mozbuild/mozbuild/frontend/emitter.py b/python/mozbuild/mozbuild/frontend/emitter.py
index 642b381c0..c28344a75 100644
--- a/python/mozbuild/mozbuild/frontend/emitter.py
+++ b/python/mozbuild/mozbuild/frontend/emitter.py
@@ -2,7 +2,7 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, unicode_literals
+
 
 import itertools
 import logging
@@ -116,8 +116,8 @@ class TreeMetadataEmitter(LoggingMixin):
         # arguments. This gross hack works around the problem until we
         # rid ourselves of 2.6.
         self.info = {}
-        for k, v in mozinfo.info.items():
-            if isinstance(k, unicode):
+        for k, v in list(mozinfo.info.items()):
+            if isinstance(k, str):
                 k = k.encode('ascii')
             self.info[k] = v
 
@@ -234,7 +234,7 @@ class TreeMetadataEmitter(LoggingMixin):
 
 
         # Next do FINAL_LIBRARY linkage.
-        for lib in (l for libs in self._libs.values() for l in libs):
+        for lib in (l for libs in list(self._libs.values()) for l in libs):
             if not isinstance(lib, (StaticLibrary, RustLibrary)) or not lib.link_into:
                 continue
             if lib.link_into not in self._libs:
@@ -294,13 +294,13 @@ class TreeMetadataEmitter(LoggingMixin):
                         lib.link_into == outerlib.basename):
                     propagate_defines(lib, defines)
 
-        for lib in (l for libs in self._libs.values() for l in libs):
+        for lib in (l for libs in list(self._libs.values()) for l in libs):
             if isinstance(lib, Library):
                 propagate_defines(lib, lib.lib_defines)
             yield lib
 
 
-        for lib in (l for libs in self._libs.values() for l in libs):
+        for lib in (l for libs in list(self._libs.values()) for l in libs):
             lib_defines = list(lib.lib_defines.get_defines())
             if lib_defines:
                 objdir_flags = self._compile_flags[lib.objdir]
@@ -310,13 +310,13 @@ class TreeMetadataEmitter(LoggingMixin):
                 if objdir_flags:
                     objdir_flags.resolve_flags('LIBRARY_DEFINES', lib_defines)
 
-        for flags_obj in self._compile_flags.values():
+        for flags_obj in list(self._compile_flags.values()):
             yield flags_obj
 
-        for flags_obj in self._compile_as_flags.values():
+        for flags_obj in list(self._compile_as_flags.values()):
             yield flags_obj
 
-        for obj in self._binaries.values():
+        for obj in list(self._binaries.values()):
             yield obj
 
 
@@ -409,7 +409,7 @@ class TreeMetadataEmitter(LoggingMixin):
                         libs[key] = l
                     if key not in libs:
                         libs[key] = l
-            candidates = libs.values()
+            candidates = list(libs.values())
             if force_static and not candidates:
                 if dir:
                     raise SandboxValidationError(
@@ -473,9 +473,9 @@ class TreeMetadataEmitter(LoggingMixin):
 
     def _verify_deps(self, context, crate_dir, crate_name, dependencies, description='Dependency'):
         """Verify that a crate's dependencies all specify local paths."""
-        for dep_crate_name, values in dependencies.iteritems():
+        for dep_crate_name, values in dependencies.items():
             # A simple version number.
-            if isinstance(values, (str, unicode)):
+            if isinstance(values, str):
                 raise SandboxValidationError(
                     '%s %s of crate %s does not list a path' % (description, dep_crate_name, crate_name),
                     context)
@@ -529,7 +529,7 @@ class TreeMetadataEmitter(LoggingMixin):
 
         cargo_target_dir = context.get('RUST_LIBRARY_TARGET_DIR', '.')
 
-        dependencies = set(config.get('dependencies', {}).iterkeys())
+        dependencies = set(config.get('dependencies', {}).keys())
 
         features = context.get(cls.FEATURES_VAR, [])
         unique_features = set(features)
@@ -863,7 +863,7 @@ class TreeMetadataEmitter(LoggingMixin):
         assert not gen_sources['UNIFIED_SOURCES']
 
         no_pgo = context.get('NO_PGO')
-        no_pgo_sources = [f for f, flags in all_flags.iteritems()
+        no_pgo_sources = [f for f, flags in all_flags.items()
                           if flags.no_pgo]
         if no_pgo:
             if no_pgo_sources:
@@ -890,7 +890,7 @@ class TreeMetadataEmitter(LoggingMixin):
 
         # The inverse of the above, mapping suffixes to their canonical suffix.
         canonicalized_suffix_map = {}
-        for suffix, alternatives in suffix_map.iteritems():
+        for suffix, alternatives in suffix_map.items():
             alternatives.add(suffix)
             for a in alternatives:
                 canonicalized_suffix_map[a] = suffix
@@ -914,7 +914,7 @@ class TreeMetadataEmitter(LoggingMixin):
         # Source files to track for linkables associated with this context.
         ctxt_sources = defaultdict(lambda: defaultdict(list))
 
-        for variable, (klass, gen_klass, suffixes) in varmap.items():
+        for variable, (klass, gen_klass, suffixes) in list(varmap.items()):
             allowed_suffixes = set().union(*[suffix_map[s] for s in suffixes])
 
             # First ensure that we haven't been given filetypes that we don't
@@ -941,20 +941,20 @@ class TreeMetadataEmitter(LoggingMixin):
                     obj = cls(*arglist)
                     srcs = obj.files
                     if isinstance(obj, UnifiedSources) and obj.have_unified_mapping:
-                        srcs = dict(obj.unified_source_mapping).keys()
+                        srcs = list(dict(obj.unified_source_mapping).keys())
                     ctxt_sources[variable][canonical_suffix] += sorted(srcs)
                     yield obj
 
         if ctxt_sources:
             for linkable in linkables:
                 for target_var in ('SOURCES', 'UNIFIED_SOURCES'):
-                    for suffix, srcs in ctxt_sources[target_var].items():
+                    for suffix, srcs in list(ctxt_sources[target_var].items()):
                         linkable.sources[suffix] += srcs
             for host_linkable in host_linkables:
-                for suffix, srcs in ctxt_sources['HOST_SOURCES'].items():
+                for suffix, srcs in list(ctxt_sources['HOST_SOURCES'].items()):
                     host_linkable.sources[suffix] += srcs
 
-        for f, flags in all_flags.iteritems():
+        for f, flags in all_flags.items():
             if flags.flags:
                 ext = mozpath.splitext(f)[1]
                 yield PerSourceFlag(context, f, flags.flags)
@@ -1143,7 +1143,7 @@ class TreeMetadataEmitter(LoggingMixin):
         for obj in self._handle_linkables(context, passthru, generated_files):
             yield obj
 
-        generated_files.update(['%s%s' % (k, self.config.substs.get('BIN_SUFFIX', '')) for k in self._binaries.keys()])
+        generated_files.update(['%s%s' % (k, self.config.substs.get('BIN_SUFFIX', '')) for k in list(self._binaries.keys())])
 
         components = []
         for var, cls in (
@@ -1277,7 +1277,7 @@ class TreeMetadataEmitter(LoggingMixin):
         for obj in self._process_jar_manifests(context):
             yield obj
 
-        for name, jar in context.get('JAVA_JAR_TARGETS', {}).items():
+        for name, jar in list(context.get('JAVA_JAR_TARGETS', {}).items()):
             yield ContextWrapped(context, jar)
 
         computed_as_flags.resolve_flags('MOZBUILD',
@@ -1346,7 +1346,7 @@ class TreeMetadataEmitter(LoggingMixin):
             script = mozpath.join(mozpath.dirname(mozpath.dirname(__file__)),
                                   'action', 'process_define_files.py')
             yield GeneratedFile(context, script, 'process_define_file',
-                                unicode(path),
+                                str(path),
                                 [Path(context, path + '.in')])
 
         generated_files = context.get('GENERATED_FILES') or []
@@ -1393,7 +1393,7 @@ class TreeMetadataEmitter(LoggingMixin):
                                     flags.flags, localized=localized)
 
     def _process_test_manifests(self, context):
-        for prefix, info in TEST_MANIFESTS.items():
+        for prefix, info in list(TEST_MANIFESTS.items()):
             for path, manifest in context.get('%s_MANIFESTS' % prefix, []):
                 for obj in self._process_test_manifest(context, info, path, manifest):
                     yield obj
@@ -1479,7 +1479,7 @@ class TreeMetadataEmitter(LoggingMixin):
 
                 process_support_files(test)
 
-            for path, m_defaults in mpmanifest.manifest_defaults.items():
+            for path, m_defaults in list(mpmanifest.manifest_defaults.items()):
                 process_support_files(m_defaults)
 
             # We also copy manifests into the output directory,
diff --git a/python/mozbuild/mozbuild/frontend/reader.py b/python/mozbuild/mozbuild/frontend/reader.py
index c1efc1c3d..0cdf8b8db 100644
--- a/python/mozbuild/mozbuild/frontend/reader.py
+++ b/python/mozbuild/mozbuild/frontend/reader.py
@@ -16,7 +16,7 @@ The BuildReader contains basic logic for traversing a tree of mozbuild files.
 It does this by examining specific variables populated during execution.
 """
 
-from __future__ import absolute_import, print_function, unicode_literals
+
 
 import ast
 import inspect
@@ -81,12 +81,13 @@ from .context import (
 
 from mozbuild.base import ExecutionSummary
 from concurrent.futures.process import ProcessPoolExecutor
+from functools import reduce
 
 
 
 if sys.version_info.major == 2:
-    text_type = unicode
-    type_type = types.TypeType
+    text_type = str
+    type_type = type
 else:
     text_type = str
     type_type = type
@@ -127,7 +128,7 @@ class EmptyConfig(object):
 
         self.substs = self.PopulateOnGetDict(EmptyValue, substs or self.default_substs)
         udict = {}
-        for k, v in self.substs.items():
+        for k, v in list(self.substs.items()):
             if isinstance(v, str):
                 udict[k.decode('utf-8')] = v.decode('utf-8')
             else:
@@ -311,7 +312,7 @@ class MozbuildSandbox(Sandbox):
             raise Exception('`template` is a function decorator. You must '
                 'use it as `@template` preceding a function declaration.')
 
-        name = func.func_name
+        name = func.__name__
 
         if name in self.templates:
             raise KeyError(
@@ -390,7 +391,7 @@ class MozbuildSandbox(Sandbox):
             klass = self._context.__class__
             self._context.__class__ = TemplateContext
             # The sandbox will do all the necessary checks for these merges.
-            for key, value in context.items():
+            for key, value in list(context.items()):
                 if isinstance(value, dict):
                     self[key].update(value)
                 elif isinstance(value, (list, HierarchicalStringList)):
@@ -407,12 +408,14 @@ class MozbuildSandbox(Sandbox):
 
 class TemplateFunction(object):
     def __init__(self, func, sandbox):
-        self.path = func.func_code.co_filename
-        self.name = func.func_name
+        self.path = func.__code__.co_filename
+        self.name = func.__name__
 
-        code = func.func_code
+        code = func.__code__
         firstlineno = code.co_firstlineno
         lines = sandbox._current_source.splitlines(True)
+        if len(lines) and isinstance(lines[0], bytes):
+            lines = [l.decode('utf-8') for l in lines]
         lines = inspect.getblock(lines[firstlineno - 1:])
 
         # The code lines we get out of inspect.getsourcelines look like
@@ -430,7 +433,7 @@ class TemplateFunction(object):
         # actually never calls __getitem__ and __setitem__, so we need to
         # modify the AST so that accesses to globals are properly directed
         # to a dict.
-        self._global_name = b'_data' # AST wants str for this, not unicode
+        self._global_name = '_data'
         # In case '_data' is a name used for a variable in the function code,
         # prepend more underscores until we find an unused name.
         while (self._global_name in code.co_names or
@@ -449,8 +452,8 @@ class TemplateFunction(object):
             compile(func_ast, self.path, 'exec'),
             glob,
             self.name,
-            func.func_defaults,
-            func.func_closure,
+            func.__defaults__,
+            func.__closure__,
         )
         func()
 
@@ -464,11 +467,11 @@ class TemplateFunction(object):
             '__builtins__': sandbox._builtins
         }
         func = types.FunctionType(
-            self._func.func_code,
+            self._func.__code__,
             glob,
             self.name,
-            self._func.func_defaults,
-            self._func.func_closure
+            self._func.__defaults__,
+            self._func.__closure__
         )
         sandbox.exec_function(func, args, kwargs, self.path,
                               becomes_current_path=False)
@@ -484,7 +487,7 @@ class TemplateFunction(object):
         def visit_Str(self, node):
             # String nodes we got from the AST parser are str, but we want
             # unicode literals everywhere, so transform them.
-            node.s = unicode(node.s)
+            node.s = str(node.s)
             return node
 
         def visit_Name(self, node):
@@ -617,7 +620,7 @@ class BuildReaderError(Exception):
 
             for l in traceback.format_exception(type(self.other), self.other,
                 self.trace):
-                s.write(unicode(l))
+                s.write(str(l))
 
         return s.getvalue()
 
@@ -767,7 +770,7 @@ class BuildReaderError(Exception):
             s.write('    %s\n' % inner.args[2])
             s.write('\n')
             close_matches = difflib.get_close_matches(inner.args[2],
-                                                      VARIABLES.keys(), 2)
+                                                      list(VARIABLES.keys()), 2)
             if close_matches:
                 s.write('Maybe you meant %s?\n' % ' or '.join(close_matches))
                 s.write('\n')
@@ -1152,7 +1155,7 @@ class BuildReader(object):
                         context)
                 non_unified_sources.add(source)
             action_overrides = {}
-            for action, script in gyp_dir.action_overrides.iteritems():
+            for action, script in gyp_dir.action_overrides.items():
                 action_overrides[action] = SourcePath(context, script)
 
             gyp_processor = GypProcessor(context.config,
@@ -1188,7 +1191,7 @@ class BuildReader(object):
 
                 recurse_info[d][key] = dict(sandbox.metadata[key])
 
-        for path, child_metadata in recurse_info.items():
+        for path, child_metadata in list(recurse_info.items()):
             child_path = path.join('moz.build').full_path
 
             # Ensure we don't break out of the topsrcdir. We don't do realpath
@@ -1279,7 +1282,7 @@ class BuildReader(object):
         # There is room to improve this code (and the code in
         # _find_relevant_mozbuilds) to better handle multiple files in the same
         # directory. Bug 1136966 tracks.
-        for path, mbpaths in relevants.items():
+        for path, mbpaths in list(relevants.items()):
             path_mozbuilds[path] = [mozpath.join(topsrcdir, p) for p in mbpaths]
 
             for i, mbpath in enumerate(mbpaths[0:-1]):
@@ -1316,7 +1319,7 @@ class BuildReader(object):
             all_contexts.append(context)
 
         result = {}
-        for path, paths in path_mozbuilds.items():
+        for path, paths in list(path_mozbuilds.items()):
             result[path] = reduce(lambda x, y: x + y, (contexts[p] for p in paths), [])
 
         return result, all_contexts
@@ -1356,7 +1359,7 @@ class BuildReader(object):
 
         r = {}
 
-        for path, ctxs in paths.items():
+        for path, ctxs in list(paths.items()):
             # Should be normalized by read_relevant_mozbuilds.
             assert '\\' not in path
 
diff --git a/python/mozbuild/mozbuild/frontend/sandbox.py b/python/mozbuild/mozbuild/frontend/sandbox.py
index b2090802e..6d94291ea 100644
--- a/python/mozbuild/mozbuild/frontend/sandbox.py
+++ b/python/mozbuild/mozbuild/frontend/sandbox.py
@@ -17,7 +17,7 @@ KeyError are machine parseable. This machine-friendly data is used to present
 user-friendly error messages in the case of errors.
 """
 
-from __future__ import absolute_import, unicode_literals
+
 
 import os
 import sys
@@ -112,6 +112,7 @@ class Sandbox(dict):
         'int': int,
         'set': set,
         'tuple': tuple,
+        'str': str,
     })
 
     def __init__(self, context, finder=default_finder):
diff --git a/python/mozbuild/mozbuild/jar.py b/python/mozbuild/mozbuild/jar.py
index 47a2eff63..96aea63ce 100644
--- a/python/mozbuild/mozbuild/jar.py
+++ b/python/mozbuild/mozbuild/jar.py
@@ -8,7 +8,7 @@ processing jar.mn files.
 See the documentation for jar.mn on MDC for further details on the format.
 '''
 
-from __future__ import absolute_import
+
 
 import sys
 import os
@@ -17,7 +17,7 @@ import re
 import logging
 from time import localtime
 from MozZipFile import ZipFile
-from cStringIO import StringIO
+from io import StringIO
 from collections import defaultdict
 
 from mozbuild.preprocessor import Preprocessor
@@ -302,9 +302,9 @@ class JarMaker(object):
         '''updateManifest replaces the % in the chrome registration entries
         with the given chrome base path, and updates the given manifest file.
         '''
-        myregister = dict.fromkeys(map(lambda s: s.replace('%',
-            chromebasepath), register))
-        addEntriesToListFile(manifestPath, myregister.iterkeys())
+        myregister = dict.fromkeys([s.replace('%',
+            chromebasepath) for s in register])
+        addEntriesToListFile(manifestPath, iter(myregister.keys()))
 
     def makeJar(self, infile, jardir):
         '''makeJar is the main entry point to JarMaker.
@@ -322,7 +322,7 @@ class JarMaker(object):
         elif self.relativesrcdir:
             self.localedirs = \
                 self.generateLocaleDirs(self.relativesrcdir)
-        if isinstance(infile, basestring):
+        if isinstance(infile, str):
             logging.info('processing ' + infile)
             self.sourcedirs.append(_normpath(os.path.dirname(infile)))
         pp = self.pp.clone()
diff --git a/python/mozbuild/mozbuild/makeutil.py b/python/mozbuild/mozbuild/makeutil.py
index fcd45bed2..f77c5d2c3 100644
--- a/python/mozbuild/mozbuild/makeutil.py
+++ b/python/mozbuild/mozbuild/makeutil.py
@@ -2,11 +2,10 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import
+
 
 import os
 import re
-from types import StringTypes
 from collections import Iterable
 
 
@@ -66,7 +65,7 @@ class _SimpleOrderedSet(object):
         self._list = []
         self._set = set()
 
-    def __nonzero__(self):
+    def __bool__(self):
         return bool(self._set)
 
     def __iter__(self):
@@ -103,19 +102,19 @@ class Rule(object):
 
     def add_targets(self, targets):
         '''Add additional targets to the rule.'''
-        assert isinstance(targets, Iterable) and not isinstance(targets, StringTypes)
+        assert isinstance(targets, Iterable) and not isinstance(targets, str)
         self._targets.update(targets)
         return self
 
     def add_dependencies(self, deps):
         '''Add dependencies to the rule.'''
-        assert isinstance(deps, Iterable) and not isinstance(deps, StringTypes)
+        assert isinstance(deps, Iterable) and not isinstance(deps, str)
         self._dependencies.update(deps)
         return self
 
     def add_commands(self, commands):
         '''Add commands to the rule.'''
-        assert isinstance(commands, Iterable) and not isinstance(commands, StringTypes)
+        assert isinstance(commands, Iterable) and not isinstance(commands, str)
         self._commands.extend(commands)
         return self
 
@@ -139,13 +138,16 @@ class Rule(object):
         '''
         if not self._targets:
             return
-        fh.write('%s:' % ' '.join(self._targets))
+        wstring = '%s:' % ' '.join(self._targets)
         if self._dependencies:
-            fh.write(' %s' % ' '.join(self.dependencies()))
-        fh.write('\n')
+            wstring += ' %s' % ' '.join(self.dependencies())
+        wstring += '\n'
         for cmd in self._commands:
-            fh.write('\t%s\n' % cmd)
-
+            wstring += '\t%s\n' % cmd
+        try:
+            fh.write(wstring.encode('utf-8'))
+        except TypeError:
+            fh.write(wstring)
 
 # colon followed by anything except a slash (Windows path detection)
 _depfilesplitter = re.compile(r':(?![\\/])')
diff --git a/python/mozbuild/mozbuild/mozinfo.py b/python/mozbuild/mozbuild/mozinfo.py
index 7e7ad1b2a..f03f20ba3 100755
--- a/python/mozbuild/mozbuild/mozinfo.py
+++ b/python/mozbuild/mozbuild/mozinfo.py
@@ -5,7 +5,7 @@
 # This module produces a JSON file that provides basic build info and
 # configuration metadata.
 
-from __future__ import absolute_import
+
 
 import os
 import re
@@ -33,7 +33,7 @@ def build_dict(config, env=os.environ):
         d['mozconfig'] = config.mozconfig
 
     # os
-    o = substs["OS_TARGET"]
+    o = str(substs["OS_TARGET"])
     known_os = {"Linux": "linux",
                 "WINNT": "win",
                 "Darwin": "mac",
@@ -148,7 +148,7 @@ def write_mozinfo(file, config, env=os.environ):
     and what keys are produced.
     """
     build_conf = build_dict(config, env)
-    if isinstance(file, basestring):
-        file = open(file, 'wb')
+    if isinstance(file, str):
+        file = open(file, 'w')
 
     json.dump(build_conf, file, sort_keys=True, indent=4)
diff --git a/python/mozbuild/mozbuild/preprocessor.py b/python/mozbuild/mozbuild/preprocessor.py
index 6780b8b72..19e59884e 100644
--- a/python/mozbuild/mozbuild/preprocessor.py
+++ b/python/mozbuild/mozbuild/preprocessor.py
@@ -27,7 +27,8 @@ import os
 import re
 from optparse import OptionParser
 import errno
-from makeutil import Makefile
+from .makeutil import Makefile
+from functools import reduce
 
 # hack around win32 mangling our line endings
 # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65443
@@ -230,7 +231,7 @@ class Expression:
         def __repr__(self):
             return self.value.__repr__()
 
-    class ParseError(StandardError):
+    class ParseError(Exception):
         """
         Error raised when parsing fails.
         It has two members, offset and content, which give the offset of the
@@ -278,7 +279,7 @@ class Preprocessor:
         self.context = Context()
         for k,v in {'FILE': '',
                     'LINE': 0,
-                    'DIRECTORY': os.path.abspath('.')}.iteritems():
+                    'DIRECTORY': os.path.abspath('.')}.items():
             self.context[k] = v
         self.actionLevel = 0
         self.disableLevel = 0
@@ -292,21 +293,21 @@ class Preprocessor:
         self.cmds = {}
         for cmd, level in {'define': 0,
                            'undef': 0,
-                           'if': sys.maxint,
-                           'ifdef': sys.maxint,
-                           'ifndef': sys.maxint,
+                           'if': sys.maxsize,
+                           'ifdef': sys.maxsize,
+                           'ifndef': sys.maxsize,
                            'else': 1,
                            'elif': 1,
                            'elifdef': 1,
                            'elifndef': 1,
-                           'endif': sys.maxint,
+                           'endif': sys.maxsize,
                            'expand': 0,
                            'literal': 0,
                            'filter': 0,
                            'unfilter': 0,
                            'include': 0,
                            'includesubst': 0,
-                           'error': 0}.iteritems():
+                           'error': 0}.items():
             self.cmds[cmd] = (level, getattr(self, 'do_' + cmd))
         self.out = sys.stdout
         self.setMarker(marker)
@@ -434,7 +435,7 @@ class Preprocessor:
         filteredLine = self.applyFilters(aLine)
         if filteredLine != aLine:
             self.actionLevel = 2
-        self.out.write(filteredLine)
+        self.out.write(filteredLine.encode('utf-8'))
 
     def handleCommandLine(self, args, defaultToStdin = False):
         """
@@ -468,7 +469,7 @@ class Preprocessor:
                 raise Preprocessor.Error(self, "--depend doesn't work with stdout",
                                          None)
             try:
-                from makeutil import Makefile
+                from .makeutil import Makefile
             except:
                 raise Preprocessor.Error(self, "--depend requires the "
                                                "mozbuild.makeutil module", None)
@@ -683,7 +684,7 @@ class Preprocessor:
         current = dict(self.filters)
         for f in filters:
             current[f] = getattr(self, 'filter_' + f)
-        filterNames = current.keys()
+        filterNames = list(current.keys())
         filterNames.sort()
         self.filters = [(fn, current[fn]) for fn in filterNames]
         return
@@ -693,7 +694,7 @@ class Preprocessor:
         for f in filters:
             if f in current:
                 del current[f]
-        filterNames = current.keys()
+        filterNames = list(current.keys())
         filterNames.sort()
         self.filters = [(fn, current[fn]) for fn in filterNames]
         return
@@ -738,7 +739,7 @@ class Preprocessor:
         args can either be a file name, or a file-like object.
         Files should be opened, and will be closed after processing.
         """
-        isName = type(args) == str or type(args) == unicode
+        isName = type(args) == str or type(args) == str
         oldCheckLineNumbers = self.checkLineNumbers
         self.checkLineNumbers = False
         if isName:
diff --git a/python/mozbuild/mozbuild/shellutil.py b/python/mozbuild/mozbuild/shellutil.py
index 185a970ee..c0c15f8f2 100644
--- a/python/mozbuild/mozbuild/shellutil.py
+++ b/python/mozbuild/mozbuild/shellutil.py
@@ -15,7 +15,7 @@ def _tokens2re(**tokens):
     # which matches the pattern and captures it in a named match group.
     # The group names and patterns are given as arguments.
     all_tokens = '|'.join('(?P<%s>%s)' % (name, value)
-                          for name, value in tokens.iteritems())
+                          for name, value in tokens.items())
     nonescaped = r'(?<!\\)(?:%s)' % all_tokens
 
     # The final pattern matches either the above pattern, or an escaped
@@ -96,7 +96,7 @@ class _ClineSplitter(object):
             self.cline = self.cline[m.end():]
 
             match = {name: value
-                     for name, value in m.groupdict().items() if value}
+                     for name, value in list(m.groupdict().items()) if value}
             if 'quote' in match:
                 # " or ' start a quoted string
                 if match['quote'] == '"':
@@ -144,7 +144,7 @@ class _ClineSplitter(object):
             self._push(self.cline[:m.start()])
             self.cline = self.cline[m.end():]
             match = {name: value
-                     for name, value in m.groupdict().items() if value}
+                     for name, value in list(m.groupdict().items()) if value}
             if 'quote' in match:
                 # a double quote ends the quoted string, so go back to
                 # unquoted parsing
diff --git a/python/mozbuild/mozbuild/test/backend/test_recursivemake.py b/python/mozbuild/mozbuild/test/backend/test_recursivemake.py
index a05059f8a..355a96165 100644
--- a/python/mozbuild/mozbuild/test/backend/test_recursivemake.py
+++ b/python/mozbuild/mozbuild/test/backend/test_recursivemake.py
@@ -2,9 +2,9 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import unicode_literals
 
-import cPickle as pickle
+
+import pickle as pickle
 import json
 import os
 import unittest
@@ -333,7 +333,7 @@ class TestRecursiveMakeBackend(BackendTester):
             ],
         }
 
-        for var, val in expected.items():
+        for var, val in list(expected.items()):
             # print("test_variable_passthru[%s]" % (var))
             found = [str for str in lines if str.startswith(var)]
             self.assertEqual(found, val)
@@ -372,7 +372,7 @@ class TestRecursiveMakeBackend(BackendTester):
             ],
         }
 
-        for var, val in expected.items():
+        for var, val in list(expected.items()):
             found = [str for str in lines if str.startswith(var)]
             self.assertEqual(found, val)
 
@@ -563,7 +563,7 @@ class TestRecursiveMakeBackend(BackendTester):
 
         # This is not the most robust test in the world, but it gets the job
         # done.
-        entries = [e for e in m._dests.keys() if '**' in e]
+        entries = [e for e in list(m._dests.keys()) if '**' in e]
         self.assertEqual(len(entries), 1)
         self.assertIn('support/**', entries[0])
 
@@ -590,11 +590,11 @@ class TestRecursiveMakeBackend(BackendTester):
                          set(['child/test_sub.js',
                               'child/data/**',
                               'child/another-file.sjs']))
-        for key in test_installs.keys():
+        for key in list(test_installs.keys()):
             self.assertIn(key, test_installs)
 
         synthesized_manifest = InstallManifest()
-        for item, installs in test_installs.items():
+        for item, installs in list(test_installs.items()):
             for install_info in installs:
                 if len(install_info) == 3:
                     synthesized_manifest.add_pattern_link(*install_info)
@@ -602,7 +602,7 @@ class TestRecursiveMakeBackend(BackendTester):
                     synthesized_manifest.add_link(*install_info)
 
         self.assertEqual(len(synthesized_manifest), 3)
-        for item, info in synthesized_manifest._dests.items():
+        for item, info in list(synthesized_manifest._dests.items()):
             self.assertIn(item, m)
             self.assertEqual(info, m._dests[item])
 
@@ -864,7 +864,7 @@ class TestRecursiveMakeBackend(BackendTester):
         expected[mozpath.join(env.topobjdir, 'final-target')] = [
             'FINAL_TARGET = $(DEPTH)/random-final-target'
         ]
-        for key, expected_rules in expected.iteritems():
+        for key, expected_rules in expected.items():
             backend_path = mozpath.join(key, 'backend.mk')
             lines = [l.strip() for l in open(backend_path, 'rt').readlines()[2:]]
             found = [str for str in lines if
diff --git a/python/mozbuild/mozbuild/test/configure/common.py b/python/mozbuild/mozbuild/test/configure/common.py
index 150c6e393..5e2c2afaa 100644
--- a/python/mozbuild/mozbuild/test/configure/common.py
+++ b/python/mozbuild/mozbuild/test/configure/common.py
@@ -2,7 +2,7 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, print_function, unicode_literals
+
 
 import copy
 import errno
@@ -16,7 +16,7 @@ from mozbuild.configure import ConfigureSandbox
 from mozbuild.util import ReadOnlyNamespace
 from mozpack import path as mozpath
 
-from StringIO import StringIO
+from io import StringIO
 from which import WhichError
 
 from buildconfig import (
@@ -77,10 +77,10 @@ class ConfigureTestSandbox(ConfigureSandbox):
         self._search_path = environ.get('PATH', '').split(os.pathsep)
 
         self._subprocess_paths = {
-            mozpath.abspath(k): v for k, v in paths.iteritems() if v
+            mozpath.abspath(k): v for k, v in paths.items() if v
         }
 
-        paths = paths.keys()
+        paths = list(paths.keys())
 
         environ = dict(environ)
         if 'CONFIG_SHELL' not in environ:
diff --git a/python/mozbuild/mozbuild/test/configure/lint.py b/python/mozbuild/mozbuild/test/configure/lint.py
index 98f5f4fe7..a549b4bcf 100644
--- a/python/mozbuild/mozbuild/test/configure/lint.py
+++ b/python/mozbuild/mozbuild/test/configure/lint.py
@@ -2,11 +2,11 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, print_function, unicode_literals
+
 
 import os
 import unittest
-from StringIO import StringIO
+from io import StringIO
 from mozunit import main
 from buildconfig import (
     topobjdir,
@@ -40,9 +40,7 @@ class LintMeta(type):
         return type.__new__(mcs, name, bases, attrs)
 
 
-class Lint(unittest.TestCase):
-    __metaclass__ = LintMeta
-
+class Lint(unittest.TestCase, metaclass=LintMeta):
     def setUp(self):
         self._curdir = os.getcwd()
         os.chdir(topobjdir)
diff --git a/python/mozbuild/mozbuild/test/configure/test_checks_configure.py b/python/mozbuild/mozbuild/test/configure/test_checks_configure.py
index c60000bb2..07091c077 100644
--- a/python/mozbuild/mozbuild/test/configure/test_checks_configure.py
+++ b/python/mozbuild/mozbuild/test/configure/test_checks_configure.py
@@ -2,9 +2,9 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, print_function, unicode_literals
 
-from StringIO import StringIO
+
+from io import StringIO
 import os
 import sys
 import textwrap
@@ -447,7 +447,7 @@ class TestChecksConfigure(unittest.TestCase):
             checking for a... %s
         ''' % self.OTHER_A))
 
-        dirs = map(mozpath.dirname, (self.OTHER_A, self.KNOWN_A))
+        dirs = list(map(mozpath.dirname, (self.OTHER_A, self.KNOWN_A)))
         config, out, status = self.get_result(textwrap.dedent('''\
             check_prog("A", ("known-a",), paths=["%s"])
         ''' % os.pathsep.join(dirs)))
@@ -457,7 +457,7 @@ class TestChecksConfigure(unittest.TestCase):
             checking for a... %s
         ''' % self.OTHER_A))
 
-        dirs = map(mozpath.dirname, (self.KNOWN_A, self.KNOWN_B))
+        dirs = list(map(mozpath.dirname, (self.KNOWN_A, self.KNOWN_B)))
         config, out, status = self.get_result(textwrap.dedent('''\
             check_prog("A", ("known-a",), paths=["%s", "%s"])
         ''' % (os.pathsep.join(dirs), self.OTHER_A)))
diff --git a/python/mozbuild/mozbuild/test/configure/test_compile_checks.py b/python/mozbuild/mozbuild/test/configure/test_compile_checks.py
index b5be3bf2e..282000bb2 100644
--- a/python/mozbuild/mozbuild/test/configure/test_compile_checks.py
+++ b/python/mozbuild/mozbuild/test/configure/test_compile_checks.py
@@ -2,14 +2,14 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, print_function, unicode_literals
+
 
 import os
 import textwrap
 import unittest
 import mozpack.path as mozpath
 
-from StringIO import StringIO
+from io import StringIO
 
 from buildconfig import topsrcdir
 from common import ConfigureTestSandbox
diff --git a/python/mozbuild/mozbuild/test/configure/test_configure.py b/python/mozbuild/mozbuild/test/configure/test_configure.py
index f37e2701f..eb0ca84fb 100644
--- a/python/mozbuild/mozbuild/test/configure/test_configure.py
+++ b/python/mozbuild/mozbuild/test/configure/test_configure.py
@@ -2,9 +2,9 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, print_function, unicode_literals
 
-from StringIO import StringIO
+
+from io import StringIO
 import os
 import sys
 import textwrap
@@ -43,7 +43,7 @@ class TestConfigure(unittest.TestCase):
 
         if '--help' in options:
             return out.getvalue(), config
-        self.assertEquals('', out.getvalue())
+        self.assertEqual('', out.getvalue())
         return config
 
     def moz_configure(self, source):
@@ -55,7 +55,7 @@ class TestConfigure(unittest.TestCase):
     def test_defaults(self):
         config = self.get_config()
         self.maxDiff = None
-        self.assertEquals({
+        self.assertEqual({
             'CHOICES': NegativeOptionValue(),
             'DEFAULTED': PositiveOptionValue(('not-simple',)),
             'IS_GCC': NegativeOptionValue(),
@@ -71,9 +71,9 @@ class TestConfigure(unittest.TestCase):
     def test_help(self):
         help, config = self.get_config(['--help'], prog='configure')
 
-        self.assertEquals({}, config)
+        self.assertEqual({}, config)
         self.maxDiff = None
-        self.assertEquals(
+        self.assertEqual(
             'Usage: configure [options]\n'
             '\n'
             'Options: [defaults in brackets after descriptions]\n'
@@ -109,7 +109,7 @@ class TestConfigure(unittest.TestCase):
         ):
             self.assertNotIn('ENABLED_SIMPLE', config)
             self.assertIn('SIMPLE', config)
-            self.assertEquals(NegativeOptionValue(), config['SIMPLE'])
+            self.assertEqual(NegativeOptionValue(), config['SIMPLE'])
 
         for config in (
                 self.get_config(['--enable-simple']),
@@ -117,7 +117,7 @@ class TestConfigure(unittest.TestCase):
         ):
             self.assertIn('ENABLED_SIMPLE', config)
             self.assertIn('SIMPLE', config)
-            self.assertEquals(PositiveOptionValue(), config['SIMPLE'])
+            self.assertEqual(PositiveOptionValue(), config['SIMPLE'])
             self.assertIs(config['SIMPLE'], config['ENABLED_SIMPLE'])
 
         # --enable-simple doesn't take values.
@@ -135,7 +135,7 @@ class TestConfigure(unittest.TestCase):
                                 env={'MOZ_WITH_ENV': '1'}),
         ):
             self.assertIn('WITH_ENV', config)
-            self.assertEquals(NegativeOptionValue(), config['WITH_ENV'])
+            self.assertEqual(NegativeOptionValue(), config['WITH_ENV'])
 
         for config in (
                 self.get_config(['--enable-with-env']),
@@ -145,7 +145,7 @@ class TestConfigure(unittest.TestCase):
                                 env={'MOZ_WITH_ENV': ''}),
         ):
             self.assertIn('WITH_ENV', config)
-            self.assertEquals(PositiveOptionValue(), config['WITH_ENV'])
+            self.assertEqual(PositiveOptionValue(), config['WITH_ENV'])
 
         with self.assertRaises(InvalidOptionError):
             self.get_config(['--enable-with-env=value'])
@@ -160,23 +160,23 @@ class TestConfigure(unittest.TestCase):
             self.get_config(['--enable-values', '--disable-values']),
         ):
             self.assertIn(name, config)
-            self.assertEquals(NegativeOptionValue(), config[name])
+            self.assertEqual(NegativeOptionValue(), config[name])
 
         for config in (
             self.get_config(['--enable-values']),
             self.get_config(['--disable-values', '--enable-values']),
         ):
             self.assertIn(name, config)
-            self.assertEquals(PositiveOptionValue(), config[name])
+            self.assertEqual(PositiveOptionValue(), config[name])
 
         config = self.get_config(['--enable-values=foo'])
         self.assertIn(name, config)
-        self.assertEquals(PositiveOptionValue(('foo',)), config[name])
+        self.assertEqual(PositiveOptionValue(('foo',)), config[name])
 
         config = self.get_config(['--enable-values=foo,bar'])
         self.assertIn(name, config)
         self.assertTrue(config[name])
-        self.assertEquals(PositiveOptionValue(('foo', 'bar')), config[name])
+        self.assertEqual(PositiveOptionValue(('foo', 'bar')), config[name])
 
     def test_values2(self):
         self.test_values('VALUES2')
@@ -187,12 +187,12 @@ class TestConfigure(unittest.TestCase):
     def test_returned_default(self):
         config = self.get_config(['--enable-simple'])
         self.assertIn('DEFAULTED', config)
-        self.assertEquals(
+        self.assertEqual(
             PositiveOptionValue(('simple',)), config['DEFAULTED'])
 
         config = self.get_config(['--disable-simple'])
         self.assertIn('DEFAULTED', config)
-        self.assertEquals(
+        self.assertEqual(
             PositiveOptionValue(('not-simple',)), config['DEFAULTED'])
 
     def test_returned_choices(self):
@@ -200,13 +200,13 @@ class TestConfigure(unittest.TestCase):
             config = self.get_config(
                 ['--enable-values=alpha', '--returned-choices=%s' % val])
             self.assertIn('CHOICES', config)
-            self.assertEquals(PositiveOptionValue((val,)), config['CHOICES'])
+            self.assertEqual(PositiveOptionValue((val,)), config['CHOICES'])
 
         for val in ('0', '1', '2'):
             config = self.get_config(
                 ['--enable-values=numeric', '--returned-choices=%s' % val])
             self.assertIn('CHOICES', config)
-            self.assertEquals(PositiveOptionValue((val,)), config['CHOICES'])
+            self.assertEqual(PositiveOptionValue((val,)), config['CHOICES'])
 
         with self.assertRaises(InvalidOptionError):
             self.get_config(['--enable-values=numeric',
@@ -218,12 +218,12 @@ class TestConfigure(unittest.TestCase):
     def test_included(self):
         config = self.get_config(env={'CC': 'gcc'})
         self.assertIn('IS_GCC', config)
-        self.assertEquals(config['IS_GCC'], True)
+        self.assertEqual(config['IS_GCC'], True)
 
         config = self.get_config(
             ['--enable-include=extra.configure', '--extra'])
         self.assertIn('EXTRA', config)
-        self.assertEquals(PositiveOptionValue(), config['EXTRA'])
+        self.assertEqual(PositiveOptionValue(), config['EXTRA'])
 
         with self.assertRaises(InvalidOptionError):
             self.get_config(['--extra'])
@@ -231,7 +231,7 @@ class TestConfigure(unittest.TestCase):
     def test_template(self):
         config = self.get_config(env={'CC': 'gcc'})
         self.assertIn('CFLAGS', config)
-        self.assertEquals(config['CFLAGS'], ['-Werror=foobar'])
+        self.assertEqual(config['CFLAGS'], ['-Werror=foobar'])
 
         config = self.get_config(env={'CC': 'clang'})
         self.assertNotIn('CFLAGS', config)
@@ -288,7 +288,7 @@ class TestConfigure(unittest.TestCase):
             sandbox
         )
 
-        import __builtin__
+        import builtins
         self.assertIs(sandbox['foo'](), __builtin__)
 
         exec_(textwrap.dedent('''
@@ -300,7 +300,7 @@ class TestConfigure(unittest.TestCase):
         )
 
         f = sandbox['foo']()
-        self.assertEquals(f.name, os.devnull)
+        self.assertEqual(f.name, os.devnull)
         f.close()
 
         # This unlocks the sandbox
@@ -336,8 +336,8 @@ class TestConfigure(unittest.TestCase):
         self.assertIs(sandbox['foo'](), sandbox)
 
         # Nothing leaked from the function being executed
-        self.assertEquals(sandbox.keys(), ['__builtins__', 'foo'])
-        self.assertEquals(sandbox['__builtins__'], ConfigureSandbox.BUILTINS)
+        self.assertEqual(list(sandbox.keys()), ['__builtins__', 'foo'])
+        self.assertEqual(sandbox['__builtins__'], ConfigureSandbox.BUILTINS)
 
         exec_(textwrap.dedent('''
             @template
@@ -354,7 +354,7 @@ class TestConfigure(unittest.TestCase):
         with self.assertRaises(NameError) as e:
             sandbox._depends[sandbox['bar']].result()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "global name 'sys' is not defined")
 
     def test_apply_imports(self):
@@ -380,28 +380,28 @@ class TestConfigure(unittest.TestCase):
             sandbox
         )
 
-        self.assertEquals(len(imports), 1)
+        self.assertEqual(len(imports), 1)
 
     def test_os_path(self):
         config = self.get_config(['--with-imports=%s' % __file__])
         self.assertIn('HAS_ABSPATH', config)
-        self.assertEquals(config['HAS_ABSPATH'], True)
+        self.assertEqual(config['HAS_ABSPATH'], True)
         self.assertIn('HAS_GETATIME', config)
-        self.assertEquals(config['HAS_GETATIME'], True)
+        self.assertEqual(config['HAS_GETATIME'], True)
         self.assertIn('HAS_GETATIME2', config)
-        self.assertEquals(config['HAS_GETATIME2'], False)
+        self.assertEqual(config['HAS_GETATIME2'], False)
 
     def test_template_call(self):
         config = self.get_config(env={'CC': 'gcc'})
         self.assertIn('TEMPLATE_VALUE', config)
-        self.assertEquals(config['TEMPLATE_VALUE'], 42)
+        self.assertEqual(config['TEMPLATE_VALUE'], 42)
         self.assertIn('TEMPLATE_VALUE_2', config)
-        self.assertEquals(config['TEMPLATE_VALUE_2'], 21)
+        self.assertEqual(config['TEMPLATE_VALUE_2'], 21)
 
     def test_template_imports(self):
         config = self.get_config(['--enable-imports-in-template'])
         self.assertIn('PLATFORM', config)
-        self.assertEquals(config['PLATFORM'], sys.platform)
+        self.assertEqual(config['PLATFORM'], sys.platform)
 
     def test_decorators(self):
         config = {}
@@ -419,27 +419,27 @@ class TestConfigure(unittest.TestCase):
             return self.get_config(*args, configure='set_config.configure')
 
         help, config = get_config(['--help'])
-        self.assertEquals(config, {})
+        self.assertEqual(config, {})
 
         config = get_config(['--set-foo'])
         self.assertIn('FOO', config)
-        self.assertEquals(config['FOO'], True)
+        self.assertEqual(config['FOO'], True)
 
         config = get_config(['--set-bar'])
         self.assertNotIn('FOO', config)
         self.assertIn('BAR', config)
-        self.assertEquals(config['BAR'], True)
+        self.assertEqual(config['BAR'], True)
 
         config = get_config(['--set-value=qux'])
         self.assertIn('VALUE', config)
-        self.assertEquals(config['VALUE'], 'qux')
+        self.assertEqual(config['VALUE'], 'qux')
 
         config = get_config(['--set-name=hoge'])
         self.assertIn('hoge', config)
-        self.assertEquals(config['hoge'], True)
+        self.assertEqual(config['hoge'], True)
 
         config = get_config([])
-        self.assertEquals(config, {'BAR': False})
+        self.assertEqual(config, {'BAR': False})
 
         with self.assertRaises(ConfigureError):
             # Both --set-foo and --set-name=FOO are going to try to
@@ -454,11 +454,11 @@ class TestConfigure(unittest.TestCase):
             set_config('QUX', 'qux', when='--with-qux')
         '''):
             config = self.get_config()
-            self.assertEquals(config, {
+            self.assertEqual(config, {
                 'FOO': 'foo',
             })
             config = self.get_config(['--with-qux'])
-            self.assertEquals(config, {
+            self.assertEqual(config, {
                 'FOO': 'foo',
                 'QUX': 'qux',
             })
@@ -468,27 +468,27 @@ class TestConfigure(unittest.TestCase):
             return self.get_config(*args, configure='set_define.configure')
 
         help, config = get_config(['--help'])
-        self.assertEquals(config, {'DEFINES': {}})
+        self.assertEqual(config, {'DEFINES': {}})
 
         config = get_config(['--set-foo'])
         self.assertIn('FOO', config['DEFINES'])
-        self.assertEquals(config['DEFINES']['FOO'], True)
+        self.assertEqual(config['DEFINES']['FOO'], True)
 
         config = get_config(['--set-bar'])
         self.assertNotIn('FOO', config['DEFINES'])
         self.assertIn('BAR', config['DEFINES'])
-        self.assertEquals(config['DEFINES']['BAR'], True)
+        self.assertEqual(config['DEFINES']['BAR'], True)
 
         config = get_config(['--set-value=qux'])
         self.assertIn('VALUE', config['DEFINES'])
-        self.assertEquals(config['DEFINES']['VALUE'], 'qux')
+        self.assertEqual(config['DEFINES']['VALUE'], 'qux')
 
         config = get_config(['--set-name=hoge'])
         self.assertIn('hoge', config['DEFINES'])
-        self.assertEquals(config['DEFINES']['hoge'], True)
+        self.assertEqual(config['DEFINES']['hoge'], True)
 
         config = get_config([])
-        self.assertEquals(config['DEFINES'], {'BAR': False})
+        self.assertEqual(config['DEFINES'], {'BAR': False})
 
         with self.assertRaises(ConfigureError):
             # Both --set-foo and --set-name=FOO are going to try to
@@ -503,11 +503,11 @@ class TestConfigure(unittest.TestCase):
             set_define('QUX', 'qux', when='--with-qux')
         '''):
             config = self.get_config()
-            self.assertEquals(config['DEFINES'], {
+            self.assertEqual(config['DEFINES'], {
                 'FOO': 'foo',
             })
             config = self.get_config(['--with-qux'])
-            self.assertEquals(config['DEFINES'], {
+            self.assertEqual(config['DEFINES'], {
                 'FOO': 'foo',
                 'QUX': 'qux',
             })
@@ -518,19 +518,19 @@ class TestConfigure(unittest.TestCase):
                 *args, configure='imply_option/simple.configure')
 
         help, config = get_config(['--help'])
-        self.assertEquals(config, {})
+        self.assertEqual(config, {})
 
         config = get_config([])
-        self.assertEquals(config, {})
+        self.assertEqual(config, {})
 
         config = get_config(['--enable-foo'])
         self.assertIn('BAR', config)
-        self.assertEquals(config['BAR'], PositiveOptionValue())
+        self.assertEqual(config['BAR'], PositiveOptionValue())
 
         with self.assertRaises(InvalidOptionError) as e:
             get_config(['--enable-foo', '--disable-bar'])
 
-        self.assertEquals(
+        self.assertEqual(
             e.exception.message,
             "'--enable-bar' implied by '--enable-foo' conflicts with "
             "'--disable-bar' from the command-line")
@@ -541,31 +541,31 @@ class TestConfigure(unittest.TestCase):
                 *args, configure='imply_option/negative.configure')
 
         help, config = get_config(['--help'])
-        self.assertEquals(config, {})
+        self.assertEqual(config, {})
 
         config = get_config([])
-        self.assertEquals(config, {})
+        self.assertEqual(config, {})
 
         config = get_config(['--enable-foo'])
         self.assertIn('BAR', config)
-        self.assertEquals(config['BAR'], NegativeOptionValue())
+        self.assertEqual(config['BAR'], NegativeOptionValue())
 
         with self.assertRaises(InvalidOptionError) as e:
             get_config(['--enable-foo', '--enable-bar'])
 
-        self.assertEquals(
+        self.assertEqual(
             e.exception.message,
             "'--disable-bar' implied by '--enable-foo' conflicts with "
             "'--enable-bar' from the command-line")
 
         config = get_config(['--disable-hoge'])
         self.assertIn('BAR', config)
-        self.assertEquals(config['BAR'], NegativeOptionValue())
+        self.assertEqual(config['BAR'], NegativeOptionValue())
 
         with self.assertRaises(InvalidOptionError) as e:
             get_config(['--disable-hoge', '--enable-bar'])
 
-        self.assertEquals(
+        self.assertEqual(
             e.exception.message,
             "'--disable-bar' implied by '--disable-hoge' conflicts with "
             "'--enable-bar' from the command-line")
@@ -576,23 +576,23 @@ class TestConfigure(unittest.TestCase):
                 *args, configure='imply_option/values.configure')
 
         help, config = get_config(['--help'])
-        self.assertEquals(config, {})
+        self.assertEqual(config, {})
 
         config = get_config([])
-        self.assertEquals(config, {})
+        self.assertEqual(config, {})
 
         config = get_config(['--enable-foo=a'])
         self.assertIn('BAR', config)
-        self.assertEquals(config['BAR'], PositiveOptionValue(('a',)))
+        self.assertEqual(config['BAR'], PositiveOptionValue(('a',)))
 
         config = get_config(['--enable-foo=a,b'])
         self.assertIn('BAR', config)
-        self.assertEquals(config['BAR'], PositiveOptionValue(('a','b')))
+        self.assertEqual(config['BAR'], PositiveOptionValue(('a','b')))
 
         with self.assertRaises(InvalidOptionError) as e:
             get_config(['--enable-foo=a,b', '--disable-bar'])
 
-        self.assertEquals(
+        self.assertEqual(
             e.exception.message,
             "'--enable-bar=a,b' implied by '--enable-foo' conflicts with "
             "'--disable-bar' from the command-line")
@@ -603,15 +603,15 @@ class TestConfigure(unittest.TestCase):
                 *args, configure='imply_option/infer.configure')
 
         help, config = get_config(['--help'])
-        self.assertEquals(config, {})
+        self.assertEqual(config, {})
 
         config = get_config([])
-        self.assertEquals(config, {})
+        self.assertEqual(config, {})
 
         with self.assertRaises(InvalidOptionError) as e:
             get_config(['--enable-foo', '--disable-bar'])
 
-        self.assertEquals(
+        self.assertEqual(
             e.exception.message,
             "'--enable-bar' implied by '--enable-foo' conflicts with "
             "'--disable-bar' from the command-line")
@@ -619,7 +619,7 @@ class TestConfigure(unittest.TestCase):
         with self.assertRaises(ConfigureError) as e:
             self.get_config([], configure='imply_option/infer_ko.configure')
 
-        self.assertEquals(
+        self.assertEqual(
             e.exception.message,
             "Cannot infer what implies '--enable-bar'. Please add a `reason` "
             "to the `imply_option` call.")
@@ -630,25 +630,25 @@ class TestConfigure(unittest.TestCase):
                 *args, configure='imply_option/imm.configure')
 
         help, config = get_config(['--help'])
-        self.assertEquals(config, {})
+        self.assertEqual(config, {})
 
         config = get_config([])
-        self.assertEquals(config, {})
+        self.assertEqual(config, {})
 
         config_path = mozpath.abspath(
             mozpath.join(test_data_path, 'imply_option', 'imm.configure'))
 
-        with self.assertRaisesRegexp(InvalidOptionError,
+        with self.assertRaisesRegex(InvalidOptionError,
             "--enable-foo' implied by 'imply_option at %s:7' conflicts with "
             "'--disable-foo' from the command-line" % config_path):
             get_config(['--disable-foo'])
 
-        with self.assertRaisesRegexp(InvalidOptionError,
+        with self.assertRaisesRegex(InvalidOptionError,
             "--enable-bar=foo,bar' implied by 'imply_option at %s:16' conflicts"
             " with '--enable-bar=a,b,c' from the command-line" % config_path):
             get_config(['--enable-bar=a,b,c'])
 
-        with self.assertRaisesRegexp(InvalidOptionError,
+        with self.assertRaisesRegex(InvalidOptionError,
             "--enable-baz=BAZ' implied by 'imply_option at %s:25' conflicts"
             " with '--enable-baz=QUUX' from the command-line" % config_path):
             get_config(['--enable-baz=QUUX'])
@@ -660,7 +660,7 @@ class TestConfigure(unittest.TestCase):
             '''):
                 self.get_config()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "`--with-foo`, emitted from `%s` line 2, is unknown."
                           % mozpath.join(test_data_path, 'moz.configure'))
 
@@ -675,7 +675,7 @@ class TestConfigure(unittest.TestCase):
             '''):
                 self.get_config()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "Unexpected type: 'int'")
 
     def test_imply_option_when(self):
@@ -686,12 +686,12 @@ class TestConfigure(unittest.TestCase):
             set_config('QUX', depends('--with-qux')(lambda x: x))
         '''):
             config = self.get_config()
-            self.assertEquals(config, {
+            self.assertEqual(config, {
                 'QUX': NegativeOptionValue(),
             })
 
             config = self.get_config(['--with-foo'])
-            self.assertEquals(config, {
+            self.assertEqual(config, {
                 'QUX': PositiveOptionValue(),
             })
 
@@ -700,7 +700,7 @@ class TestConfigure(unittest.TestCase):
             with self.moz_configure('option("--with-foo", help="foo")'):
                 self.get_config()
 
-        self.assertEquals(
+        self.assertEqual(
             e.exception.message,
             'Option `--with-foo` is not handled ; reference it with a @depends'
         )
@@ -712,7 +712,7 @@ class TestConfigure(unittest.TestCase):
             '''):
                 self.get_config()
 
-        self.assertEquals(
+        self.assertEqual(
             e.exception.message,
             'Option `--with-foo` already defined'
         )
@@ -724,7 +724,7 @@ class TestConfigure(unittest.TestCase):
             '''):
                 self.get_config()
 
-        self.assertEquals(
+        self.assertEqual(
             e.exception.message,
             'Option `MOZ_FOO` already defined'
         )
@@ -736,7 +736,7 @@ class TestConfigure(unittest.TestCase):
             '''):
                 self.get_config()
 
-        self.assertEquals(
+        self.assertEqual(
             e.exception.message,
             'Option `MOZ_FOO` already defined'
         )
@@ -748,7 +748,7 @@ class TestConfigure(unittest.TestCase):
             '''):
                 self.get_config()
 
-        self.assertEquals(
+        self.assertEqual(
             e.exception.message,
             'Option `MOZ_FOO` already defined'
         )
@@ -760,7 +760,7 @@ class TestConfigure(unittest.TestCase):
             '''):
                 self.get_config()
 
-        self.assertEquals(
+        self.assertEqual(
             e.exception.message,
             'Option `--with-foo` already defined'
         )
@@ -776,18 +776,18 @@ class TestConfigure(unittest.TestCase):
             set_config('QUX', depends('--with-qux', when='--with-foo')(lambda x: x))
         '''):
             config = self.get_config()
-            self.assertEquals(config, {
+            self.assertEqual(config, {
                 'FOO': NegativeOptionValue(),
             })
 
             config = self.get_config(['--with-foo'])
-            self.assertEquals(config, {
+            self.assertEqual(config, {
                 'FOO': PositiveOptionValue(),
                 'QUX': NegativeOptionValue(),
             })
 
             config = self.get_config(['--with-foo', '--with-qux'])
-            self.assertEquals(config, {
+            self.assertEqual(config, {
                 'FOO': PositiveOptionValue(),
                 'QUX': PositiveOptionValue(),
             })
@@ -795,7 +795,7 @@ class TestConfigure(unittest.TestCase):
             with self.assertRaises(InvalidOptionError) as e:
                 self.get_config(['--with-bar'])
 
-            self.assertEquals(
+            self.assertEqual(
                 e.exception.message,
                 '--with-bar is not available in this configuration'
             )
@@ -803,7 +803,7 @@ class TestConfigure(unittest.TestCase):
             with self.assertRaises(InvalidOptionError) as e:
                 self.get_config(['--with-qux'])
 
-            self.assertEquals(
+            self.assertEqual(
                 e.exception.message,
                 '--with-qux is not available in this configuration'
             )
@@ -811,18 +811,18 @@ class TestConfigure(unittest.TestCase):
             with self.assertRaises(InvalidOptionError) as e:
                 self.get_config(['QUX=1'])
 
-            self.assertEquals(
+            self.assertEqual(
                 e.exception.message,
                 'QUX is not available in this configuration'
             )
 
             config = self.get_config(env={'QUX': '1'})
-            self.assertEquals(config, {
+            self.assertEqual(config, {
                 'FOO': NegativeOptionValue(),
             })
 
             help, config = self.get_config(['--help'])
-            self.assertEquals(help, textwrap.dedent('''\
+            self.assertEqual(help, textwrap.dedent('''\
                 Usage: configure [options]
 
                 Options: [defaults in brackets after descriptions]
@@ -833,7 +833,7 @@ class TestConfigure(unittest.TestCase):
             '''))
 
             help, config = self.get_config(['--help', '--with-foo'])
-            self.assertEquals(help, textwrap.dedent('''\
+            self.assertEqual(help, textwrap.dedent('''\
                 Usage: configure [options]
 
                 Options: [defaults in brackets after descriptions]
@@ -851,7 +851,7 @@ class TestConfigure(unittest.TestCase):
             with self.assertRaises(ConfigureError) as e:
                 self.get_config()
 
-            self.assertEquals(e.exception.message,
+            self.assertEqual(e.exception.message,
                               '@depends function needs the same `when` as '
                               'options it depends on')
 
@@ -868,7 +868,7 @@ class TestConfigure(unittest.TestCase):
             with self.assertRaises(ConfigureError) as e:
                 self.get_config()
 
-            self.assertEquals(e.exception.message,
+            self.assertEqual(e.exception.message,
                               '@depends function needs the same `when` as '
                               'options it depends on')
 
@@ -896,7 +896,7 @@ class TestConfigure(unittest.TestCase):
             with self.moz_configure('include("../foo.configure")'):
                 self.get_config()
 
-        self.assertEquals(
+        self.assertEqual(
             e.exception.message,
             'Cannot include `%s` because it is not in a subdirectory of `%s`'
             % (mozpath.normpath(mozpath.join(test_data_path, '..',
@@ -911,7 +911,7 @@ class TestConfigure(unittest.TestCase):
             '''):
                 self.get_config()
 
-        self.assertEquals(
+        self.assertEqual(
             e.exception.message,
             'Cannot include `%s` because it was included already.'
             % mozpath.normpath(mozpath.join(test_data_path,
@@ -924,7 +924,7 @@ class TestConfigure(unittest.TestCase):
             '''):
                 self.get_config()
 
-        self.assertEquals(e.exception.message, "Unexpected type: 'int'")
+        self.assertEqual(e.exception.message, "Unexpected type: 'int'")
 
     def test_include_when(self):
         with MockedOpen({
@@ -967,26 +967,26 @@ class TestConfigure(unittest.TestCase):
             '''),
         }):
             config = self.get_config()
-            self.assertEquals(config, {})
+            self.assertEqual(config, {})
 
             config = self.get_config(['--with-foo'])
-            self.assertEquals(config, {})
+            self.assertEqual(config, {})
 
             config = self.get_config(['--with-bar'])
-            self.assertEquals(config, {
+            self.assertEqual(config, {
                 'BAR': 'bar',
             })
 
             with self.assertRaises(InvalidOptionError) as e:
                 self.get_config(['--with-qux'])
 
-            self.assertEquals(
+            self.assertEqual(
                 e.exception.message,
                 '--with-qux is not available in this configuration'
             )
 
             config = self.get_config(['--with-foo', '--with-foo-really'])
-            self.assertEquals(config, {
+            self.assertEqual(config, {
                 'FOO': 'foo',
                 'FOO2': True,
             })
@@ -998,7 +998,7 @@ class TestConfigure(unittest.TestCase):
             '''):
                 self.get_config()
 
-        self.assertEquals(e.exception.message, 'Cannot reassign builtins')
+        self.assertEqual(e.exception.message, 'Cannot reassign builtins')
 
         with self.assertRaises(KeyError) as e:
             with self.moz_configure('''
@@ -1006,7 +1006,7 @@ class TestConfigure(unittest.TestCase):
             '''):
                 self.get_config()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           'Cannot assign `foo` because it is neither a '
                           '@depends nor a @template')
 
@@ -1019,7 +1019,7 @@ class TestConfigure(unittest.TestCase):
             '''):
                 self.get_config()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "@depends needs at least one argument")
 
         with self.assertRaises(ConfigureError) as e:
@@ -1030,7 +1030,7 @@ class TestConfigure(unittest.TestCase):
             '''):
                 self.get_config()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "'--with-foo' is not a known option. Maybe it's "
                           "declared too late?")
 
@@ -1042,7 +1042,7 @@ class TestConfigure(unittest.TestCase):
             '''):
                 self.get_config()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "Option must not contain an '='")
 
         with self.assertRaises(TypeError) as e:
@@ -1053,7 +1053,7 @@ class TestConfigure(unittest.TestCase):
             '''):
                 self.get_config()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "Cannot use object of type 'int' as argument "
                           "to @depends")
 
@@ -1065,7 +1065,7 @@ class TestConfigure(unittest.TestCase):
             '''):
                 self.get_config()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "Cannot decorate generator functions with @depends")
 
         with self.assertRaises(TypeError) as e:
@@ -1074,7 +1074,7 @@ class TestConfigure(unittest.TestCase):
             '''):
                 self.get_config()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "Unexpected type: 'int'")
 
         with self.assertRaises(ConfigureError) as e:
@@ -1088,7 +1088,7 @@ class TestConfigure(unittest.TestCase):
             '''):
                 self.get_config()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "The `foo` function may not be called")
 
         with self.assertRaises(TypeError) as e:
@@ -1099,7 +1099,7 @@ class TestConfigure(unittest.TestCase):
             '''):
                 self.get_config()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "depends_impl() got an unexpected keyword argument 'foo'")
 
     def test_depends_when(self):
@@ -1124,12 +1124,12 @@ class TestConfigure(unittest.TestCase):
             set_config('QUX', qux)
         '''):
             config = self.get_config()
-            self.assertEquals(config, {
+            self.assertEqual(config, {
                 'FOO': 'foo',
             })
 
             config = self.get_config(['--with-qux'])
-            self.assertEquals(config, {
+            self.assertEqual(config, {
                 'FOO': 'foo',
                 'QUX': 'qux',
             })
@@ -1144,7 +1144,7 @@ class TestConfigure(unittest.TestCase):
             '''):
                 self.get_config()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           '@imports must appear after @template')
 
         with self.assertRaises(ConfigureError) as e:
@@ -1157,7 +1157,7 @@ class TestConfigure(unittest.TestCase):
             '''):
                 self.get_config()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           '@imports must appear after @depends')
 
         for import_ in (
@@ -1174,7 +1174,7 @@ class TestConfigure(unittest.TestCase):
                 ''' % import_):
                     self.get_config()
 
-            self.assertEquals(e.exception.message, "Unexpected type: 'int'")
+            self.assertEqual(e.exception.message, "Unexpected type: 'int'")
 
         with self.assertRaises(TypeError) as e:
             with self.moz_configure('''
@@ -1185,7 +1185,7 @@ class TestConfigure(unittest.TestCase):
             '''):
                 self.get_config()
 
-        self.assertEquals(e.exception.message, "Unexpected type: 'int'")
+        self.assertEqual(e.exception.message, "Unexpected type: 'int'")
 
         with self.assertRaises(ValueError) as e:
             with self.moz_configure('''
@@ -1195,7 +1195,7 @@ class TestConfigure(unittest.TestCase):
             '''):
                 self.get_config()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "Invalid argument to @imports: 'os*'")
 
     def test_only_when(self):
@@ -1250,7 +1250,7 @@ class TestConfigure(unittest.TestCase):
             with self.assertRaises(InvalidOptionError) as e:
                 self.get_config(['--foo'])
 
-            self.assertEquals(e.exception.message,
+            self.assertEqual(e.exception.message,
                               '--foo is not available in this configuration')
 
         # Cannot depend on an option defined in a only_when block, because we
@@ -1261,7 +1261,7 @@ class TestConfigure(unittest.TestCase):
             with self.assertRaises(ConfigureError) as e:
                 self.get_config()
 
-            self.assertEquals(e.exception.message,
+            self.assertEqual(e.exception.message,
                               '@depends function needs the same `when` as '
                               'options it depends on')
 
@@ -1278,7 +1278,7 @@ class TestConfigure(unittest.TestCase):
             with self.assertRaises(InvalidOptionError) as e:
                 self.get_config()
 
-            self.assertEquals(e.exception.message,
+            self.assertEqual(e.exception.message,
                               '--foo is not available in this configuration')
 
         # And similarly doesn't fail when the condition is true.
diff --git a/python/mozbuild/mozbuild/test/configure/test_lint.py b/python/mozbuild/mozbuild/test/configure/test_lint.py
index 6d8d4c49f..6ad897839 100644
--- a/python/mozbuild/mozbuild/test/configure/test_lint.py
+++ b/python/mozbuild/mozbuild/test/configure/test_lint.py
@@ -2,9 +2,9 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, print_function, unicode_literals
 
-from StringIO import StringIO
+
+from io import StringIO
 import os
 import textwrap
 import unittest
@@ -62,7 +62,7 @@ class TestLint(unittest.TestCase):
             '''):
                 self.lint_test()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "`bar` depends on '--help' and `foo`. "
                           "`foo` must depend on '--help'")
 
@@ -85,7 +85,7 @@ class TestLint(unittest.TestCase):
             '''):
                 self.lint_test()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "`bar` depends on '--help' and `foo`. "
                           "`foo` must depend on '--help'")
 
@@ -111,7 +111,7 @@ class TestLint(unittest.TestCase):
             '''):
                 self.lint_test()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "Missing @depends for `foo`: '--help'")
 
         with self.assertRaises(ConfigureError) as e:
@@ -130,7 +130,7 @@ class TestLint(unittest.TestCase):
             '''):
                 self.lint_test()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "Missing @depends for `foo`: '--help'")
 
         with self.assertRaises(ConfigureError) as e:
@@ -145,7 +145,7 @@ class TestLint(unittest.TestCase):
             '''):
                 self.lint_test()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "Missing @depends for `foo`: '--help'")
 
         # This would have failed with "Missing @depends for `foo`: '--help'"
@@ -178,7 +178,7 @@ class TestLint(unittest.TestCase):
             '''):
                 self.lint_test()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "Missing @depends for `foo`: '--help'")
 
         # There is a default restricted `os` module when there is no explicit
@@ -205,7 +205,7 @@ class TestLint(unittest.TestCase):
             '''):
                 self.lint_test()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "%s:3: The dependency on `--foo` is unused."
                           % mozpath.join(test_data_path, 'moz.configure'))
 
@@ -222,7 +222,7 @@ class TestLint(unittest.TestCase):
             '''):
                 self.lint_test()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "%s:5: The dependency on `bar` is unused."
                           % mozpath.join(test_data_path, 'moz.configure'))
 
@@ -236,7 +236,7 @@ class TestLint(unittest.TestCase):
             '''):
                 self.lint_test()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "%s:2: The dependency on `<lambda>` is unused."
                           % mozpath.join(test_data_path, 'moz.configure'))
 
@@ -257,7 +257,7 @@ class TestLint(unittest.TestCase):
             '''):
                 self.lint_test()
 
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "%s:9: The dependency on `qux` is unused."
                           % mozpath.join(test_data_path, 'moz.configure'))
 
diff --git a/python/mozbuild/mozbuild/test/configure/test_moz_configure.py b/python/mozbuild/mozbuild/test/configure/test_moz_configure.py
index b3342e268..7a26e9e09 100644
--- a/python/mozbuild/mozbuild/test/configure/test_moz_configure.py
+++ b/python/mozbuild/mozbuild/test/configure/test_moz_configure.py
@@ -2,7 +2,7 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, print_function, unicode_literals
+
 
 from mozunit import main
 from mozpack import path as mozpath
@@ -27,10 +27,10 @@ class TestMozConfigure(BaseConfigureTest):
             shell = mozpath.abspath('/bin/sh')
             return result.replace('CONFIG_SHELL=%s ' % shell, '')
 
-        self.assertEquals('--enable-application=browser',
+        self.assertEqual('--enable-application=browser',
                           get_value_for(['--enable-application=browser']))
 
-        self.assertEquals('--enable-application=browser '
+        self.assertEqual('--enable-application=browser '
                           'MOZ_VTUNE=1',
                           get_value_for(['--enable-application=browser',
                                          'MOZ_VTUNE=1']))
@@ -39,25 +39,25 @@ class TestMozConfigure(BaseConfigureTest):
             environ={'MOZ_VTUNE': '1'},
             mozconfig='ac_add_options --enable-project=js')
 
-        self.assertEquals('--enable-project=js MOZ_VTUNE=1',
+        self.assertEqual('--enable-project=js MOZ_VTUNE=1',
                           value)
 
         # --disable-js-shell is the default, so it's filtered out.
-        self.assertEquals('--enable-application=browser',
+        self.assertEqual('--enable-application=browser',
                           get_value_for(['--enable-application=browser',
                                          '--disable-js-shell']))
 
         # Normally, --without-foo would be filtered out because that's the
         # default, but since it is a (fake) old-configure option, it always
         # appears.
-        self.assertEquals('--enable-application=browser --without-foo',
+        self.assertEqual('--enable-application=browser --without-foo',
                           get_value_for(['--enable-application=browser',
                                          '--without-foo']))
-        self.assertEquals('--enable-application=browser --with-foo',
+        self.assertEqual('--enable-application=browser --with-foo',
                           get_value_for(['--enable-application=browser',
                                          '--with-foo']))
 
-        self.assertEquals("--enable-application=browser '--with-foo=foo bar'",
+        self.assertEqual("--enable-application=browser '--with-foo=foo bar'",
                           get_value_for(['--enable-application=browser',
                                          '--with-foo=foo bar']))
 
@@ -69,7 +69,7 @@ class TestMozConfigure(BaseConfigureTest):
                 self.version = version
 
             def __call__(self, stdin, args):
-                this.assertEquals(args, ('-version',))
+                this.assertEqual(args, ('-version',))
                 return 0, self.version, ''
 
         def check_nsis_version(version):
@@ -84,13 +84,13 @@ class TestMozConfigure(BaseConfigureTest):
         with self.assertRaises(SystemExit) as e:
             check_nsis_version('v3.0a2')
 
-        self.assertEquals(check_nsis_version('v3.0b1'), '3.0b1')
-        self.assertEquals(check_nsis_version('v3.0b2'), '3.0b2')
-        self.assertEquals(check_nsis_version('v3.0rc1'), '3.0rc1')
-        self.assertEquals(check_nsis_version('v3.0'), '3.0')
-        self.assertEquals(check_nsis_version('v3.0-2'), '3.0')
-        self.assertEquals(check_nsis_version('v3.0.1'), '3.0')
-        self.assertEquals(check_nsis_version('v3.1'), '3.1')
+        self.assertEqual(check_nsis_version('v3.0b1'), '3.0b1')
+        self.assertEqual(check_nsis_version('v3.0b2'), '3.0b2')
+        self.assertEqual(check_nsis_version('v3.0rc1'), '3.0rc1')
+        self.assertEqual(check_nsis_version('v3.0'), '3.0')
+        self.assertEqual(check_nsis_version('v3.0-2'), '3.0')
+        self.assertEqual(check_nsis_version('v3.0.1'), '3.0')
+        self.assertEqual(check_nsis_version('v3.1'), '3.1')
 
 
 if __name__ == '__main__':
diff --git a/python/mozbuild/mozbuild/test/configure/test_options.py b/python/mozbuild/mozbuild/test/configure/test_options.py
index 9defccb2c..330ce3b1f 100644
--- a/python/mozbuild/mozbuild/test/configure/test_options.py
+++ b/python/mozbuild/mozbuild/test/configure/test_options.py
@@ -2,7 +2,7 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, print_function, unicode_literals
+
 
 import unittest
 
@@ -28,139 +28,139 @@ class Option(Option):
 class TestOption(unittest.TestCase):
     def test_option(self):
         option = Option('--option')
-        self.assertEquals(option.prefix, '')
-        self.assertEquals(option.name, 'option')
-        self.assertEquals(option.env, None)
+        self.assertEqual(option.prefix, '')
+        self.assertEqual(option.name, 'option')
+        self.assertEqual(option.env, None)
         self.assertFalse(option.default)
 
         option = Option('--enable-option')
-        self.assertEquals(option.prefix, 'enable')
-        self.assertEquals(option.name, 'option')
-        self.assertEquals(option.env, None)
+        self.assertEqual(option.prefix, 'enable')
+        self.assertEqual(option.name, 'option')
+        self.assertEqual(option.env, None)
         self.assertFalse(option.default)
 
         option = Option('--disable-option')
-        self.assertEquals(option.prefix, 'disable')
-        self.assertEquals(option.name, 'option')
-        self.assertEquals(option.env, None)
+        self.assertEqual(option.prefix, 'disable')
+        self.assertEqual(option.name, 'option')
+        self.assertEqual(option.env, None)
         self.assertTrue(option.default)
 
         option = Option('--with-option')
-        self.assertEquals(option.prefix, 'with')
-        self.assertEquals(option.name, 'option')
-        self.assertEquals(option.env, None)
+        self.assertEqual(option.prefix, 'with')
+        self.assertEqual(option.name, 'option')
+        self.assertEqual(option.env, None)
         self.assertFalse(option.default)
 
         option = Option('--without-option')
-        self.assertEquals(option.prefix, 'without')
-        self.assertEquals(option.name, 'option')
-        self.assertEquals(option.env, None)
+        self.assertEqual(option.prefix, 'without')
+        self.assertEqual(option.name, 'option')
+        self.assertEqual(option.env, None)
         self.assertTrue(option.default)
 
         option = Option('--without-option-foo', env='MOZ_OPTION')
-        self.assertEquals(option.env, 'MOZ_OPTION')
+        self.assertEqual(option.env, 'MOZ_OPTION')
 
         option = Option(env='MOZ_OPTION')
-        self.assertEquals(option.prefix, '')
-        self.assertEquals(option.name, None)
-        self.assertEquals(option.env, 'MOZ_OPTION')
+        self.assertEqual(option.prefix, '')
+        self.assertEqual(option.name, None)
+        self.assertEqual(option.env, 'MOZ_OPTION')
         self.assertFalse(option.default)
 
         with self.assertRaises(InvalidOptionError) as e:
             Option('--option', nargs=0, default=('a',))
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "The given `default` doesn't satisfy `nargs`")
 
         with self.assertRaises(InvalidOptionError) as e:
             Option('--option', nargs=1, default=())
-        self.assertEquals(
+        self.assertEqual(
             e.exception.message,
             'default must be a bool, a string or a tuple of strings')
 
         with self.assertRaises(InvalidOptionError) as e:
             Option('--option', nargs=1, default=True)
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "The given `default` doesn't satisfy `nargs`")
 
         with self.assertRaises(InvalidOptionError) as e:
             Option('--option', nargs=1, default=('a', 'b'))
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "The given `default` doesn't satisfy `nargs`")
 
         with self.assertRaises(InvalidOptionError) as e:
             Option('--option', nargs=2, default=())
-        self.assertEquals(
+        self.assertEqual(
             e.exception.message,
             'default must be a bool, a string or a tuple of strings')
 
         with self.assertRaises(InvalidOptionError) as e:
             Option('--option', nargs=2, default=True)
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "The given `default` doesn't satisfy `nargs`")
 
         with self.assertRaises(InvalidOptionError) as e:
             Option('--option', nargs=2, default=('a',))
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "The given `default` doesn't satisfy `nargs`")
 
         with self.assertRaises(InvalidOptionError) as e:
             Option('--option', nargs='?', default=('a', 'b'))
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "The given `default` doesn't satisfy `nargs`")
 
         with self.assertRaises(InvalidOptionError) as e:
             Option('--option', nargs='+', default=())
-        self.assertEquals(
+        self.assertEqual(
             e.exception.message,
             'default must be a bool, a string or a tuple of strings')
 
         with self.assertRaises(InvalidOptionError) as e:
             Option('--option', nargs='+', default=True)
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "The given `default` doesn't satisfy `nargs`")
 
         # --disable options with a nargs value that requires at least one
         # argument need to be given a default.
         with self.assertRaises(InvalidOptionError) as e:
             Option('--disable-option', nargs=1)
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "The given `default` doesn't satisfy `nargs`")
 
         with self.assertRaises(InvalidOptionError) as e:
             Option('--disable-option', nargs='+')
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "The given `default` doesn't satisfy `nargs`")
 
         # Test nargs inference from default value
         option = Option('--with-foo', default=True)
-        self.assertEquals(option.nargs, 0)
+        self.assertEqual(option.nargs, 0)
 
         option = Option('--with-foo', default=False)
-        self.assertEquals(option.nargs, 0)
+        self.assertEqual(option.nargs, 0)
 
         option = Option('--with-foo', default='a')
-        self.assertEquals(option.nargs, '?')
+        self.assertEqual(option.nargs, '?')
 
         option = Option('--with-foo', default=('a',))
-        self.assertEquals(option.nargs, '?')
+        self.assertEqual(option.nargs, '?')
 
         option = Option('--with-foo', default=('a', 'b'))
-        self.assertEquals(option.nargs, '*')
+        self.assertEqual(option.nargs, '*')
 
         option = Option(env='FOO', default=True)
-        self.assertEquals(option.nargs, 0)
+        self.assertEqual(option.nargs, 0)
 
         option = Option(env='FOO', default=False)
-        self.assertEquals(option.nargs, 0)
+        self.assertEqual(option.nargs, 0)
 
         option = Option(env='FOO', default='a')
-        self.assertEquals(option.nargs, '?')
+        self.assertEqual(option.nargs, '?')
 
         option = Option(env='FOO', default=('a',))
-        self.assertEquals(option.nargs, '?')
+        self.assertEqual(option.nargs, '?')
 
         option = Option(env='FOO', default=('a', 'b'))
-        self.assertEquals(option.nargs, '*')
+        self.assertEqual(option.nargs, '*')
 
     def test_option_option(self):
         for option in (
@@ -170,70 +170,70 @@ class TestOption(unittest.TestCase):
             '--with-option',
             '--without-option',
         ):
-            self.assertEquals(Option(option).option, option)
-            self.assertEquals(Option(option, env='FOO').option, option)
+            self.assertEqual(Option(option).option, option)
+            self.assertEqual(Option(option, env='FOO').option, option)
 
             opt = Option(option, default=False)
-            self.assertEquals(opt.option,
+            self.assertEqual(opt.option,
                               option.replace('-disable-', '-enable-')
                                     .replace('-without-', '-with-'))
 
             opt = Option(option, default=True)
-            self.assertEquals(opt.option,
+            self.assertEqual(opt.option,
                               option.replace('-enable-', '-disable-')
                                     .replace('-with-', '-without-'))
 
-        self.assertEquals(Option(env='FOO').option, 'FOO')
+        self.assertEqual(Option(env='FOO').option, 'FOO')
 
     def test_option_choices(self):
         with self.assertRaises(InvalidOptionError) as e:
             Option('--option', nargs=3, choices=('a', 'b'))
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           'Not enough `choices` for `nargs`')
 
         with self.assertRaises(InvalidOptionError) as e:
             Option('--without-option', nargs=1, choices=('a', 'b'))
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           'A `default` must be given along with `choices`')
 
         with self.assertRaises(InvalidOptionError) as e:
             Option('--without-option', nargs='+', choices=('a', 'b'))
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           'A `default` must be given along with `choices`')
 
         with self.assertRaises(InvalidOptionError) as e:
             Option('--without-option', default='c', choices=('a', 'b'))
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "The `default` value must be one of 'a', 'b'")
 
         with self.assertRaises(InvalidOptionError) as e:
             Option('--without-option', default=('a', 'c',), choices=('a', 'b'))
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "The `default` value must be one of 'a', 'b'")
 
         with self.assertRaises(InvalidOptionError) as e:
             Option('--without-option', default=('c',), choices=('a', 'b'))
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "The `default` value must be one of 'a', 'b'")
 
         option = Option('--with-option', nargs='+', choices=('a', 'b'))
         with self.assertRaises(InvalidOptionError) as e:
             option.get_value('--with-option=c')
-        self.assertEquals(e.exception.message, "'c' is not one of 'a', 'b'")
+        self.assertEqual(e.exception.message, "'c' is not one of 'a', 'b'")
 
         value = option.get_value('--with-option=b,a')
         self.assertTrue(value)
-        self.assertEquals(PositiveOptionValue(('b', 'a')), value)
+        self.assertEqual(PositiveOptionValue(('b', 'a')), value)
 
         option = Option('--without-option', nargs='*', default='a',
                         choices=('a', 'b'))
         with self.assertRaises(InvalidOptionError) as e:
             option.get_value('--with-option=c')
-        self.assertEquals(e.exception.message, "'c' is not one of 'a', 'b'")
+        self.assertEqual(e.exception.message, "'c' is not one of 'a', 'b'")
 
         value = option.get_value('--with-option=b,a')
         self.assertTrue(value)
-        self.assertEquals(PositiveOptionValue(('b', 'a')), value)
+        self.assertEqual(PositiveOptionValue(('b', 'a')), value)
 
         # Test nargs inference from choices
         option = Option('--with-option', choices=('a', 'b'))
@@ -244,37 +244,37 @@ class TestOption(unittest.TestCase):
                         choices=('a', 'b', 'c', 'd'))
 
         value = option.get_value('--with-option=+d')
-        self.assertEquals(PositiveOptionValue(('b', 'c', 'd')), value)
+        self.assertEqual(PositiveOptionValue(('b', 'c', 'd')), value)
 
         value = option.get_value('--with-option=-b')
-        self.assertEquals(PositiveOptionValue(('c',)), value)
+        self.assertEqual(PositiveOptionValue(('c',)), value)
 
         value = option.get_value('--with-option=-b,+d')
-        self.assertEquals(PositiveOptionValue(('c','d')), value)
+        self.assertEqual(PositiveOptionValue(('c','d')), value)
 
         # Adding something that is in the default is fine
         value = option.get_value('--with-option=+b')
-        self.assertEquals(PositiveOptionValue(('b', 'c')), value)
+        self.assertEqual(PositiveOptionValue(('b', 'c')), value)
 
         # Removing something that is not in the default is fine, as long as it
         # is one of the choices
         value = option.get_value('--with-option=-a')
-        self.assertEquals(PositiveOptionValue(('b', 'c')), value)
+        self.assertEqual(PositiveOptionValue(('b', 'c')), value)
 
         with self.assertRaises(InvalidOptionError) as e:
             option.get_value('--with-option=-e')
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "'e' is not one of 'a', 'b', 'c', 'd'")
 
         # Other "not a choice" errors.
         with self.assertRaises(InvalidOptionError) as e:
             option.get_value('--with-option=+e')
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "'e' is not one of 'a', 'b', 'c', 'd'")
 
         with self.assertRaises(InvalidOptionError) as e:
             option.get_value('--with-option=e')
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "'e' is not one of 'a', 'b', 'c', 'd'")
 
     def test_option_value_compare(self):
@@ -294,7 +294,7 @@ class TestOption(unittest.TestCase):
 
         # For usability reasons, we raise TypeError when attempting to compare
         # against a non-tuple.
-        with self.assertRaisesRegexp(TypeError, 'cannot compare a'):
+        with self.assertRaisesRegex(TypeError, 'cannot compare a'):
             val == 'foo'
 
         # But we allow empty option values to compare otherwise we can't
@@ -313,36 +313,36 @@ class TestOption(unittest.TestCase):
 
     def test_option_value_format(self):
         val = PositiveOptionValue()
-        self.assertEquals('--with-value', val.format('--with-value'))
-        self.assertEquals('--with-value', val.format('--without-value'))
-        self.assertEquals('--enable-value', val.format('--enable-value'))
-        self.assertEquals('--enable-value', val.format('--disable-value'))
-        self.assertEquals('--value', val.format('--value'))
-        self.assertEquals('VALUE=1', val.format('VALUE'))
+        self.assertEqual('--with-value', val.format('--with-value'))
+        self.assertEqual('--with-value', val.format('--without-value'))
+        self.assertEqual('--enable-value', val.format('--enable-value'))
+        self.assertEqual('--enable-value', val.format('--disable-value'))
+        self.assertEqual('--value', val.format('--value'))
+        self.assertEqual('VALUE=1', val.format('VALUE'))
 
         val = PositiveOptionValue(('a',))
-        self.assertEquals('--with-value=a', val.format('--with-value'))
-        self.assertEquals('--with-value=a', val.format('--without-value'))
-        self.assertEquals('--enable-value=a', val.format('--enable-value'))
-        self.assertEquals('--enable-value=a', val.format('--disable-value'))
-        self.assertEquals('--value=a', val.format('--value'))
-        self.assertEquals('VALUE=a', val.format('VALUE'))
+        self.assertEqual('--with-value=a', val.format('--with-value'))
+        self.assertEqual('--with-value=a', val.format('--without-value'))
+        self.assertEqual('--enable-value=a', val.format('--enable-value'))
+        self.assertEqual('--enable-value=a', val.format('--disable-value'))
+        self.assertEqual('--value=a', val.format('--value'))
+        self.assertEqual('VALUE=a', val.format('VALUE'))
 
         val = PositiveOptionValue(('a', 'b'))
-        self.assertEquals('--with-value=a,b', val.format('--with-value'))
-        self.assertEquals('--with-value=a,b', val.format('--without-value'))
-        self.assertEquals('--enable-value=a,b', val.format('--enable-value'))
-        self.assertEquals('--enable-value=a,b', val.format('--disable-value'))
-        self.assertEquals('--value=a,b', val.format('--value'))
-        self.assertEquals('VALUE=a,b', val.format('VALUE'))
+        self.assertEqual('--with-value=a,b', val.format('--with-value'))
+        self.assertEqual('--with-value=a,b', val.format('--without-value'))
+        self.assertEqual('--enable-value=a,b', val.format('--enable-value'))
+        self.assertEqual('--enable-value=a,b', val.format('--disable-value'))
+        self.assertEqual('--value=a,b', val.format('--value'))
+        self.assertEqual('VALUE=a,b', val.format('VALUE'))
 
         val = NegativeOptionValue()
-        self.assertEquals('--without-value', val.format('--with-value'))
-        self.assertEquals('--without-value', val.format('--without-value'))
-        self.assertEquals('--disable-value', val.format('--enable-value'))
-        self.assertEquals('--disable-value', val.format('--disable-value'))
-        self.assertEquals('', val.format('--value'))
-        self.assertEquals('VALUE=', val.format('VALUE'))
+        self.assertEqual('--without-value', val.format('--with-value'))
+        self.assertEqual('--without-value', val.format('--without-value'))
+        self.assertEqual('--disable-value', val.format('--enable-value'))
+        self.assertEqual('--disable-value', val.format('--disable-value'))
+        self.assertEqual('', val.format('--value'))
+        self.assertEqual('VALUE=', val.format('VALUE'))
 
     def test_option_value(self, name='option', nargs=0, default=None):
         disabled = name.startswith(('disable-', 'without-'))
@@ -359,28 +359,28 @@ class TestOption(unittest.TestCase):
 
         if nargs in (0, '?', '*') or disabled:
             value = option.get_value('--%s' % name, 'option')
-            self.assertEquals(value, posOptionValue())
-            self.assertEquals(value.origin, 'option')
+            self.assertEqual(value, posOptionValue())
+            self.assertEqual(value.origin, 'option')
         else:
             with self.assertRaises(InvalidOptionError) as e:
                 option.get_value('--%s' % name)
             if nargs == 1:
-                self.assertEquals(e.exception.message,
+                self.assertEqual(e.exception.message,
                                   '--%s takes 1 value' % name)
             elif nargs == '+':
-                self.assertEquals(e.exception.message,
+                self.assertEqual(e.exception.message,
                                   '--%s takes 1 or more values' % name)
             else:
-                self.assertEquals(e.exception.message,
+                self.assertEqual(e.exception.message,
                                   '--%s takes 2 values' % name)
 
         value = option.get_value('')
-        self.assertEquals(value, defaultValue)
-        self.assertEquals(value.origin, 'default')
+        self.assertEqual(value, defaultValue)
+        self.assertEqual(value.origin, 'default')
 
         value = option.get_value(None)
-        self.assertEquals(value, defaultValue)
-        self.assertEquals(value.origin, 'default')
+        self.assertEqual(value, defaultValue)
+        self.assertEqual(value.origin, 'default')
 
         with self.assertRaises(AssertionError):
             value = option.get_value('MOZ_OPTION=', 'environment')
@@ -393,47 +393,47 @@ class TestOption(unittest.TestCase):
 
         if nargs in (1, '?', '*', '+') and not disabled:
             value = option.get_value('--%s=' % name, 'option')
-            self.assertEquals(value, PositiveOptionValue(('',)))
-            self.assertEquals(value.origin, 'option')
+            self.assertEqual(value, PositiveOptionValue(('',)))
+            self.assertEqual(value.origin, 'option')
         else:
             with self.assertRaises(InvalidOptionError) as e:
                 option.get_value('--%s=' % name)
             if disabled:
-                self.assertEquals(e.exception.message,
+                self.assertEqual(e.exception.message,
                                   'Cannot pass a value to --%s' % name)
             else:
-                self.assertEquals(e.exception.message,
+                self.assertEqual(e.exception.message,
                                   '--%s takes %d values' % (name, nargs))
 
         if nargs in (1, '?', '*', '+') and not disabled:
             value = option.get_value('--%s=foo' % name, 'option')
-            self.assertEquals(value, PositiveOptionValue(('foo',)))
-            self.assertEquals(value.origin, 'option')
+            self.assertEqual(value, PositiveOptionValue(('foo',)))
+            self.assertEqual(value.origin, 'option')
         else:
             with self.assertRaises(InvalidOptionError) as e:
                 option.get_value('--%s=foo' % name)
             if disabled:
-                self.assertEquals(e.exception.message,
+                self.assertEqual(e.exception.message,
                                   'Cannot pass a value to --%s' % name)
             else:
-                self.assertEquals(e.exception.message,
+                self.assertEqual(e.exception.message,
                                   '--%s takes %d values' % (name, nargs))
 
         if nargs in (2, '*', '+') and not disabled:
             value = option.get_value('--%s=foo,bar' % name, 'option')
-            self.assertEquals(value, PositiveOptionValue(('foo', 'bar')))
-            self.assertEquals(value.origin, 'option')
+            self.assertEqual(value, PositiveOptionValue(('foo', 'bar')))
+            self.assertEqual(value.origin, 'option')
         else:
             with self.assertRaises(InvalidOptionError) as e:
                 option.get_value('--%s=foo,bar' % name, 'option')
             if disabled:
-                self.assertEquals(e.exception.message,
+                self.assertEqual(e.exception.message,
                                   'Cannot pass a value to --%s' % name)
             elif nargs == '?':
-                self.assertEquals(e.exception.message,
+                self.assertEqual(e.exception.message,
                                   '--%s takes 0 or 1 values' % name)
             else:
-                self.assertEquals(e.exception.message,
+                self.assertEqual(e.exception.message,
                                   '--%s takes %d value%s'
                                   % (name, nargs, 's' if nargs != 1 else ''))
 
@@ -441,59 +441,59 @@ class TestOption(unittest.TestCase):
                         default=default)
         if nargs in (0, '?', '*') or disabled:
             value = option.get_value('--%s' % name, 'option')
-            self.assertEquals(value, posOptionValue())
-            self.assertEquals(value.origin, 'option')
+            self.assertEqual(value, posOptionValue())
+            self.assertEqual(value.origin, 'option')
         else:
             with self.assertRaises(InvalidOptionError) as e:
                 option.get_value('--%s' % name)
             if disabled:
-                self.assertEquals(e.exception.message,
+                self.assertEqual(e.exception.message,
                                   'Cannot pass a value to --%s' % name)
             elif nargs == '+':
-                self.assertEquals(e.exception.message,
+                self.assertEqual(e.exception.message,
                                   '--%s takes 1 or more values' % name)
             else:
-                self.assertEquals(e.exception.message,
+                self.assertEqual(e.exception.message,
                                   '--%s takes %d value%s'
                                   % (name, nargs, 's' if nargs != 1 else ''))
 
         value = option.get_value('')
-        self.assertEquals(value, defaultValue)
-        self.assertEquals(value.origin, 'default')
+        self.assertEqual(value, defaultValue)
+        self.assertEqual(value.origin, 'default')
 
         value = option.get_value(None)
-        self.assertEquals(value, defaultValue)
-        self.assertEquals(value.origin, 'default')
+        self.assertEqual(value, defaultValue)
+        self.assertEqual(value.origin, 'default')
 
         value = option.get_value('MOZ_OPTION=', 'environment')
-        self.assertEquals(value, NegativeOptionValue())
-        self.assertEquals(value.origin, 'environment')
+        self.assertEqual(value, NegativeOptionValue())
+        self.assertEqual(value.origin, 'environment')
 
         if nargs in (0, '?', '*'):
             value = option.get_value('MOZ_OPTION=1', 'environment')
-            self.assertEquals(value, PositiveOptionValue())
-            self.assertEquals(value.origin, 'environment')
+            self.assertEqual(value, PositiveOptionValue())
+            self.assertEqual(value.origin, 'environment')
         elif nargs in (1, '+'):
             value = option.get_value('MOZ_OPTION=1', 'environment')
-            self.assertEquals(value, PositiveOptionValue(('1',)))
-            self.assertEquals(value.origin, 'environment')
+            self.assertEqual(value, PositiveOptionValue(('1',)))
+            self.assertEqual(value.origin, 'environment')
         else:
             with self.assertRaises(InvalidOptionError) as e:
                 option.get_value('MOZ_OPTION=1', 'environment')
-            self.assertEquals(e.exception.message, 'MOZ_OPTION takes 2 values')
+            self.assertEqual(e.exception.message, 'MOZ_OPTION takes 2 values')
 
         if nargs in (1, '?', '*', '+') and not disabled:
             value = option.get_value('--%s=' % name, 'option')
-            self.assertEquals(value, PositiveOptionValue(('',)))
-            self.assertEquals(value.origin, 'option')
+            self.assertEqual(value, PositiveOptionValue(('',)))
+            self.assertEqual(value.origin, 'option')
         else:
             with self.assertRaises(InvalidOptionError) as e:
                 option.get_value('--%s=' % name, 'option')
             if disabled:
-                self.assertEquals(e.exception.message,
+                self.assertEqual(e.exception.message,
                                   'Cannot pass a value to --%s' % name)
             else:
-                self.assertEquals(e.exception.message,
+                self.assertEqual(e.exception.message,
                                   '--%s takes %d values' % (name, nargs))
 
         with self.assertRaises(AssertionError):
@@ -501,26 +501,26 @@ class TestOption(unittest.TestCase):
 
         if nargs in (1, '?', '*', '+'):
             value = option.get_value('MOZ_OPTION=foo', 'environment')
-            self.assertEquals(value, PositiveOptionValue(('foo',)))
-            self.assertEquals(value.origin, 'environment')
+            self.assertEqual(value, PositiveOptionValue(('foo',)))
+            self.assertEqual(value.origin, 'environment')
         else:
             with self.assertRaises(InvalidOptionError) as e:
                 option.get_value('MOZ_OPTION=foo', 'environment')
-            self.assertEquals(e.exception.message,
+            self.assertEqual(e.exception.message,
                               'MOZ_OPTION takes %d values' % nargs)
 
         if nargs in (2, '*', '+'):
             value = option.get_value('MOZ_OPTION=foo,bar', 'environment')
-            self.assertEquals(value, PositiveOptionValue(('foo', 'bar')))
-            self.assertEquals(value.origin, 'environment')
+            self.assertEqual(value, PositiveOptionValue(('foo', 'bar')))
+            self.assertEqual(value.origin, 'environment')
         else:
             with self.assertRaises(InvalidOptionError) as e:
                 option.get_value('MOZ_OPTION=foo,bar', 'environment')
             if nargs == '?':
-                self.assertEquals(e.exception.message,
+                self.assertEqual(e.exception.message,
                                   'MOZ_OPTION takes 0 or 1 values')
             else:
-                self.assertEquals(e.exception.message,
+                self.assertEqual(e.exception.message,
                                   'MOZ_OPTION takes %d value%s'
                                   % (nargs, 's' if nargs != 1 else ''))
 
@@ -532,26 +532,26 @@ class TestOption(unittest.TestCase):
             env_option.get_value('--%s' % name)
 
         value = env_option.get_value('')
-        self.assertEquals(value, defaultValue)
-        self.assertEquals(value.origin, 'default')
+        self.assertEqual(value, defaultValue)
+        self.assertEqual(value.origin, 'default')
 
         value = env_option.get_value('MOZ_OPTION=', 'environment')
-        self.assertEquals(value, negOptionValue())
-        self.assertEquals(value.origin, 'environment')
+        self.assertEqual(value, negOptionValue())
+        self.assertEqual(value.origin, 'environment')
 
         if nargs in (0, '?', '*'):
             value = env_option.get_value('MOZ_OPTION=1', 'environment')
-            self.assertEquals(value, posOptionValue())
+            self.assertEqual(value, posOptionValue())
             self.assertTrue(value)
-            self.assertEquals(value.origin, 'environment')
+            self.assertEqual(value.origin, 'environment')
         elif nargs in (1, '+'):
             value = env_option.get_value('MOZ_OPTION=1', 'environment')
-            self.assertEquals(value, PositiveOptionValue(('1',)))
-            self.assertEquals(value.origin, 'environment')
+            self.assertEqual(value, PositiveOptionValue(('1',)))
+            self.assertEqual(value.origin, 'environment')
         else:
             with self.assertRaises(InvalidOptionError) as e:
                 env_option.get_value('MOZ_OPTION=1', 'environment')
-            self.assertEquals(e.exception.message, 'MOZ_OPTION takes 2 values')
+            self.assertEqual(e.exception.message, 'MOZ_OPTION takes 2 values')
 
         with self.assertRaises(AssertionError) as e:
             env_option.get_value('--%s' % name)
@@ -561,26 +561,26 @@ class TestOption(unittest.TestCase):
 
         if nargs in (1, '?', '*', '+'):
             value = env_option.get_value('MOZ_OPTION=foo', 'environment')
-            self.assertEquals(value, PositiveOptionValue(('foo',)))
-            self.assertEquals(value.origin, 'environment')
+            self.assertEqual(value, PositiveOptionValue(('foo',)))
+            self.assertEqual(value.origin, 'environment')
         else:
             with self.assertRaises(InvalidOptionError) as e:
                 env_option.get_value('MOZ_OPTION=foo', 'environment')
-            self.assertEquals(e.exception.message,
+            self.assertEqual(e.exception.message,
                               'MOZ_OPTION takes %d values' % nargs)
 
         if nargs in (2, '*', '+'):
             value = env_option.get_value('MOZ_OPTION=foo,bar', 'environment')
-            self.assertEquals(value, PositiveOptionValue(('foo', 'bar')))
-            self.assertEquals(value.origin, 'environment')
+            self.assertEqual(value, PositiveOptionValue(('foo', 'bar')))
+            self.assertEqual(value.origin, 'environment')
         else:
             with self.assertRaises(InvalidOptionError) as e:
                 env_option.get_value('MOZ_OPTION=foo,bar', 'environment')
             if nargs == '?':
-                self.assertEquals(e.exception.message,
+                self.assertEqual(e.exception.message,
                                   'MOZ_OPTION takes 0 or 1 values')
             else:
-                self.assertEquals(e.exception.message,
+                self.assertEqual(e.exception.message,
                                   'MOZ_OPTION takes %d value%s'
                                   % (nargs, 's' if nargs != 1 else ''))
 
@@ -592,28 +592,28 @@ class TestOption(unittest.TestCase):
                                         default=default)
 
         value = option.get_value('--%s-option' % disable, 'option')
-        self.assertEquals(value, NegativeOptionValue())
-        self.assertEquals(value.origin, 'option')
+        self.assertEqual(value, NegativeOptionValue())
+        self.assertEqual(value.origin, 'option')
 
         option = self.test_option_value('%s-option' % disable, nargs=nargs,
                                         default=default)
 
         if nargs in (0, '?', '*'):
             value = option.get_value('--%s-option' % enable, 'option')
-            self.assertEquals(value, PositiveOptionValue())
-            self.assertEquals(value.origin, 'option')
+            self.assertEqual(value, PositiveOptionValue())
+            self.assertEqual(value.origin, 'option')
         else:
             with self.assertRaises(InvalidOptionError) as e:
                 option.get_value('--%s-option' % enable, 'option')
             if nargs == 1:
-                self.assertEquals(e.exception.message,
+                self.assertEqual(e.exception.message,
                                   '--%s-option takes 1 value' % enable)
             elif nargs == '+':
-                self.assertEquals(e.exception.message,
+                self.assertEqual(e.exception.message,
                                   '--%s-option takes 1 or more values'
                                   % enable)
             else:
-                self.assertEquals(e.exception.message,
+                self.assertEqual(e.exception.message,
                                   '--%s-option takes 2 values' % enable)
 
     def test_option_value_with(self):
@@ -622,12 +622,12 @@ class TestOption(unittest.TestCase):
     def test_option_value_invalid_nargs(self):
         with self.assertRaises(InvalidOptionError) as e:
             Option('--option', nargs='foo')
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "nargs must be a positive integer, '?', '*' or '+'")
 
         with self.assertRaises(InvalidOptionError) as e:
             Option('--option', nargs=-2)
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "nargs must be a positive integer, '?', '*' or '+'")
 
     def test_option_value_nargs_1(self):
@@ -638,7 +638,7 @@ class TestOption(unittest.TestCase):
         # A default is required
         with self.assertRaises(InvalidOptionError) as e:
             Option('--disable-option', nargs=1)
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "The given `default` doesn't satisfy `nargs`")
 
     def test_option_value_nargs_2(self):
@@ -649,7 +649,7 @@ class TestOption(unittest.TestCase):
         # A default is required
         with self.assertRaises(InvalidOptionError) as e:
             Option('--disable-option', nargs=2)
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "The given `default` doesn't satisfy `nargs`")
 
     def test_option_value_nargs_0_or_1(self):
@@ -676,7 +676,7 @@ class TestOption(unittest.TestCase):
         # A default is required
         with self.assertRaises(InvalidOptionError) as e:
             Option('--disable-option', nargs='+')
-        self.assertEquals(e.exception.message,
+        self.assertEqual(e.exception.message,
                           "The given `default` doesn't satisfy `nargs`")
 
 
@@ -684,21 +684,21 @@ class TestCommandLineHelper(unittest.TestCase):
     def test_basic(self):
         helper = CommandLineHelper({}, ['cmd', '--foo', '--bar'])
 
-        self.assertEquals(['--foo', '--bar'], list(helper))
+        self.assertEqual(['--foo', '--bar'], list(helper))
 
         helper.add('--enable-qux')
 
-        self.assertEquals(['--foo', '--bar', '--enable-qux'], list(helper))
+        self.assertEqual(['--foo', '--bar', '--enable-qux'], list(helper))
 
         value, option = helper.handle(Option('--bar'))
-        self.assertEquals(['--foo', '--enable-qux'], list(helper))
-        self.assertEquals(PositiveOptionValue(), value)
-        self.assertEquals('--bar', option)
+        self.assertEqual(['--foo', '--enable-qux'], list(helper))
+        self.assertEqual(PositiveOptionValue(), value)
+        self.assertEqual('--bar', option)
 
         value, option = helper.handle(Option('--baz'))
-        self.assertEquals(['--foo', '--enable-qux'], list(helper))
-        self.assertEquals(NegativeOptionValue(), value)
-        self.assertEquals(None, option)
+        self.assertEqual(['--foo', '--enable-qux'], list(helper))
+        self.assertEqual(NegativeOptionValue(), value)
+        self.assertEqual(None, option)
 
         with self.assertRaises(AssertionError):
             CommandLineHelper({}, ['--foo', '--bar'])
@@ -707,89 +707,89 @@ class TestCommandLineHelper(unittest.TestCase):
         foo = Option('--with-foo', nargs='*')
         helper = CommandLineHelper({}, ['cmd', '--with-foo=a,b'])
         value, option = helper.handle(foo)
-        self.assertEquals(PositiveOptionValue(('a', 'b')), value)
-        self.assertEquals('command-line', value.origin)
-        self.assertEquals('--with-foo=a,b', option)
+        self.assertEqual(PositiveOptionValue(('a', 'b')), value)
+        self.assertEqual('command-line', value.origin)
+        self.assertEqual('--with-foo=a,b', option)
 
         helper = CommandLineHelper({}, ['cmd', '--with-foo=a,b',
                                         '--without-foo'])
         value, option = helper.handle(foo)
-        self.assertEquals(NegativeOptionValue(), value)
-        self.assertEquals('command-line', value.origin)
-        self.assertEquals('--without-foo', option)
+        self.assertEqual(NegativeOptionValue(), value)
+        self.assertEqual('command-line', value.origin)
+        self.assertEqual('--without-foo', option)
 
         helper = CommandLineHelper({}, ['cmd', '--without-foo',
                                         '--with-foo=a,b'])
         value, option = helper.handle(foo)
-        self.assertEquals(PositiveOptionValue(('a', 'b')), value)
-        self.assertEquals('command-line', value.origin)
-        self.assertEquals('--with-foo=a,b', option)
+        self.assertEqual(PositiveOptionValue(('a', 'b')), value)
+        self.assertEqual('command-line', value.origin)
+        self.assertEqual('--with-foo=a,b', option)
 
         foo = Option('--with-foo', env='FOO', nargs='*')
         helper = CommandLineHelper({'FOO': ''}, ['cmd', '--with-foo=a,b'])
         value, option = helper.handle(foo)
-        self.assertEquals(PositiveOptionValue(('a', 'b')), value)
-        self.assertEquals('command-line', value.origin)
-        self.assertEquals('--with-foo=a,b', option)
+        self.assertEqual(PositiveOptionValue(('a', 'b')), value)
+        self.assertEqual('command-line', value.origin)
+        self.assertEqual('--with-foo=a,b', option)
 
         helper = CommandLineHelper({'FOO': 'a,b'}, ['cmd', '--without-foo'])
         value, option = helper.handle(foo)
-        self.assertEquals(NegativeOptionValue(), value)
-        self.assertEquals('command-line', value.origin)
-        self.assertEquals('--without-foo', option)
+        self.assertEqual(NegativeOptionValue(), value)
+        self.assertEqual('command-line', value.origin)
+        self.assertEqual('--without-foo', option)
 
         helper = CommandLineHelper({'FOO': ''}, ['cmd', '--with-bar=a,b'])
         value, option = helper.handle(foo)
-        self.assertEquals(NegativeOptionValue(), value)
-        self.assertEquals('environment', value.origin)
-        self.assertEquals('FOO=', option)
+        self.assertEqual(NegativeOptionValue(), value)
+        self.assertEqual('environment', value.origin)
+        self.assertEqual('FOO=', option)
 
         helper = CommandLineHelper({'FOO': 'a,b'}, ['cmd', '--without-bar'])
         value, option = helper.handle(foo)
-        self.assertEquals(PositiveOptionValue(('a', 'b')), value)
-        self.assertEquals('environment', value.origin)
-        self.assertEquals('FOO=a,b', option)
+        self.assertEqual(PositiveOptionValue(('a', 'b')), value)
+        self.assertEqual('environment', value.origin)
+        self.assertEqual('FOO=a,b', option)
 
         helper = CommandLineHelper({}, ['cmd', '--with-foo=a,b', 'FOO='])
         value, option = helper.handle(foo)
-        self.assertEquals(NegativeOptionValue(), value)
-        self.assertEquals('command-line', value.origin)
-        self.assertEquals('FOO=', option)
+        self.assertEqual(NegativeOptionValue(), value)
+        self.assertEqual('command-line', value.origin)
+        self.assertEqual('FOO=', option)
 
         helper = CommandLineHelper({}, ['cmd', '--without-foo', 'FOO=a,b'])
         value, option = helper.handle(foo)
-        self.assertEquals(PositiveOptionValue(('a', 'b')), value)
-        self.assertEquals('command-line', value.origin)
-        self.assertEquals('FOO=a,b', option)
+        self.assertEqual(PositiveOptionValue(('a', 'b')), value)
+        self.assertEqual('command-line', value.origin)
+        self.assertEqual('FOO=a,b', option)
 
         helper = CommandLineHelper({}, ['cmd', 'FOO=', '--with-foo=a,b'])
         value, option = helper.handle(foo)
-        self.assertEquals(PositiveOptionValue(('a', 'b')), value)
-        self.assertEquals('command-line', value.origin)
-        self.assertEquals('--with-foo=a,b', option)
+        self.assertEqual(PositiveOptionValue(('a', 'b')), value)
+        self.assertEqual('command-line', value.origin)
+        self.assertEqual('--with-foo=a,b', option)
 
         helper = CommandLineHelper({}, ['cmd', 'FOO=a,b', '--without-foo'])
         value, option = helper.handle(foo)
-        self.assertEquals(NegativeOptionValue(), value)
-        self.assertEquals('command-line', value.origin)
-        self.assertEquals('--without-foo', option)
+        self.assertEqual(NegativeOptionValue(), value)
+        self.assertEqual('command-line', value.origin)
+        self.assertEqual('--without-foo', option)
 
     def test_extra_args(self):
         foo = Option('--with-foo', env='FOO', nargs='*')
         helper = CommandLineHelper({}, ['cmd'])
         helper.add('FOO=a,b,c', 'other-origin')
         value, option = helper.handle(foo)
-        self.assertEquals(PositiveOptionValue(('a', 'b', 'c')), value)
-        self.assertEquals('other-origin', value.origin)
-        self.assertEquals('FOO=a,b,c', option)
+        self.assertEqual(PositiveOptionValue(('a', 'b', 'c')), value)
+        self.assertEqual('other-origin', value.origin)
+        self.assertEqual('FOO=a,b,c', option)
 
         helper = CommandLineHelper({}, ['cmd'])
         helper.add('FOO=a,b,c', 'other-origin')
         helper.add('--with-foo=a,b,c', 'other-origin')
         value, option = helper.handle(foo)
-        self.assertEquals(PositiveOptionValue(('a', 'b', 'c')), value)
-        self.assertEquals('other-origin', value.origin)
-        self.assertEquals('--with-foo=a,b,c', option)
+        self.assertEqual(PositiveOptionValue(('a', 'b', 'c')), value)
+        self.assertEqual('other-origin', value.origin)
+        self.assertEqual('--with-foo=a,b,c', option)
 
         # Adding conflicting options is not allowed.
         helper = CommandLineHelper({}, ['cmd'])
@@ -809,9 +809,9 @@ class TestCommandLineHelper(unittest.TestCase):
         # But adding the same is allowed.
         helper.add('FOO=a,b,c', 'other-origin')
         value, option = helper.handle(foo)
-        self.assertEquals(PositiveOptionValue(('a', 'b', 'c')), value)
-        self.assertEquals('other-origin', value.origin)
-        self.assertEquals('FOO=a,b,c', option)
+        self.assertEqual(PositiveOptionValue(('a', 'b', 'c')), value)
+        self.assertEqual('other-origin', value.origin)
+        self.assertEqual('FOO=a,b,c', option)
 
         # The same rule as above applies when using the option form vs. the
         # variable form. But we can't detect it when .add is called.
@@ -837,9 +837,9 @@ class TestCommandLineHelper(unittest.TestCase):
         helper.add('FOO=a,b,c', 'other-origin')
         helper.add('--with-foo=a,b,c', 'other-origin')
         value, option = helper.handle(foo)
-        self.assertEquals(PositiveOptionValue(('a', 'b', 'c')), value)
-        self.assertEquals('other-origin', value.origin)
-        self.assertEquals('--with-foo=a,b,c', option)
+        self.assertEqual(PositiveOptionValue(('a', 'b', 'c')), value)
+        self.assertEqual('other-origin', value.origin)
+        self.assertEqual('--with-foo=a,b,c', option)
 
         # Conflicts are also not allowed against what is in the
         # environment/on the command line.
@@ -869,19 +869,19 @@ class TestCommandLineHelper(unittest.TestCase):
         foo = Option('--foo',
                      possible_origins=('command-line',))
         value, option = helper.handle(foo)
-        self.assertEquals(PositiveOptionValue(), value)
-        self.assertEquals('command-line', value.origin)
-        self.assertEquals('--foo', option)
+        self.assertEqual(PositiveOptionValue(), value)
+        self.assertEqual('command-line', value.origin)
+        self.assertEqual('--foo', option)
 
         bar = Option('--bar',
                      possible_origins=('mozconfig',))
-        with self.assertRaisesRegexp(InvalidOptionError,
+        with self.assertRaisesRegex(InvalidOptionError,
             "--bar can not be set by command-line. Values are accepted from: mozconfig"):
             helper.handle(bar)
 
         baz = Option(env='BAZ',
                      possible_origins=('implied',))
-        with self.assertRaisesRegexp(InvalidOptionError,
+        with self.assertRaisesRegex(InvalidOptionError,
             "BAZ=1 can not be set by environment. Values are accepted from: implied"):
             helper.handle(baz)
 
diff --git a/python/mozbuild/mozbuild/test/configure/test_toolchain_configure.py b/python/mozbuild/mozbuild/test/configure/test_toolchain_configure.py
index cb7ff709e..c339a32bf 100755
--- a/python/mozbuild/mozbuild/test/configure/test_toolchain_configure.py
+++ b/python/mozbuild/mozbuild/test/configure/test_toolchain_configure.py
@@ -2,12 +2,12 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, print_function, unicode_literals
+
 
 import logging
 import os
 
-from StringIO import StringIO
+from io import StringIO
 
 from mozunit import main
 
@@ -366,9 +366,9 @@ class BaseToolchainTest(BaseConfigureTest):
                 compiler = sandbox._value_for(sandbox[var])
                 # Add var on both ends to make it clear which of the
                 # variables is failing the test when that happens.
-                self.assertEquals((var, compiler), (var, result))
+                self.assertEqual((var, compiler), (var, result))
             except SystemExit:
-                self.assertEquals((var, result),
+                self.assertEqual((var, result),
                                   (var, self.out.getvalue().strip()))
                 return
 
@@ -407,7 +407,7 @@ class BaseToolchainTest(BaseConfigureTest):
             'RUST_LIB_SUFFIX',
             'OBJ_SUFFIX',
         ):
-            self.assertEquals('%s=%s' % (k, sandbox.get_config(k)),
+            self.assertEqual('%s=%s' % (k, sandbox.get_config(k)),
                               '%s=%s' % (k, library_name_info[k]))
 
 
@@ -584,7 +584,7 @@ class LinuxToolchainTest(BaseToolchainTest):
         # We'll try gcc and clang, but since there is no gcc (gcc-x.y doesn't
         # count), find clang.
         paths = {
-            k: v for k, v in self.PATHS.iteritems()
+            k: v for k, v in self.PATHS.items()
             if os.path.basename(k) not in ('gcc', 'g++')
         }
         self.do_toolchain_test(paths, {
@@ -619,7 +619,7 @@ class LinuxToolchainTest(BaseToolchainTest):
         # Even if there are gcc-x.y or clang-x.y compilers available, we
         # don't try them. This could be considered something to improve.
         paths = {
-            k: v for k, v in self.PATHS.iteritems()
+            k: v for k, v in self.PATHS.items()
             if os.path.basename(k) not in ('gcc', 'g++', 'clang', 'clang++')
         }
         self.do_toolchain_test(paths, {
@@ -800,7 +800,7 @@ class OSXToolchainTest(BaseToolchainTest):
     def test_not_gcc(self):
         # We won't pick GCC if it's the only thing available.
         paths = {
-            k: v for k, v in self.PATHS.iteritems()
+            k: v for k, v in self.PATHS.items()
             if os.path.basename(k) not in ('clang', 'clang++')
         }
         self.do_toolchain_test(paths, {
@@ -976,7 +976,7 @@ class WindowsToolchainTest(BaseToolchainTest):
     def test_clang_cl(self):
         # We'll pick clang-cl if msvc can't be found.
         paths = {
-            k: v for k, v in self.PATHS.iteritems()
+            k: v for k, v in self.PATHS.items()
             if os.path.basename(k) != 'cl'
         }
         self.do_toolchain_test(paths, {
@@ -987,7 +987,7 @@ class WindowsToolchainTest(BaseToolchainTest):
     def test_gcc(self):
         # We'll pick GCC if msvc and clang-cl can't be found.
         paths = {
-            k: v for k, v in self.PATHS.iteritems()
+            k: v for k, v in self.PATHS.items()
             if os.path.basename(k) not in ('cl', 'clang-cl')
         }
         self.do_toolchain_test(paths, {
@@ -1006,7 +1006,7 @@ class WindowsToolchainTest(BaseToolchainTest):
     def test_clang(self):
         # We'll pick clang if nothing else is found.
         paths = {
-            k: v for k, v in self.PATHS.iteritems()
+            k: v for k, v in self.PATHS.items()
             if os.path.basename(k) not in ('cl', 'clang-cl', 'gcc')
         }
         self.do_toolchain_test(paths, {
diff --git a/python/mozbuild/mozbuild/test/configure/test_toolchain_helpers.py b/python/mozbuild/mozbuild/test/configure/test_toolchain_helpers.py
index 8ec33a8b7..ba046ed12 100644
--- a/python/mozbuild/mozbuild/test/configure/test_toolchain_helpers.py
+++ b/python/mozbuild/mozbuild/test/configure/test_toolchain_helpers.py
@@ -2,7 +2,7 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, print_function, unicode_literals
+
 
 import copy
 import re
@@ -10,7 +10,7 @@ import types
 import unittest
 
 from fnmatch import fnmatch
-from StringIO import StringIO
+from io import StringIO
 from textwrap import dedent
 
 from mozunit import (
@@ -43,7 +43,7 @@ class CompilerPreprocessor(Preprocessor):
         # Hack around it enough that the configure tests work properly.
         context = self.context
         def normalize_numbers(value):
-            if isinstance(value, types.StringTypes):
+            if isinstance(value, (str,)):
                 if value[-1:] == 'L' and value[:-1].isdigit():
                     value = int(value[:-1])
             return value
@@ -53,7 +53,7 @@ class CompilerPreprocessor(Preprocessor):
             return self.HAS_FEATURE.sub(r'\1\2', expr)
         self.context = self.Context(
             (normalize_has_feature(k), normalize_numbers(v))
-            for k, v in context.iteritems()
+            for k, v in context.items()
         )
         try:
             return Preprocessor.do_if(self, normalize_has_feature(expression),
@@ -95,7 +95,7 @@ class TestCompilerPreprocessor(unittest.TestCase):
         input.name = 'foo'
         pp.do_include(input)
 
-        self.assertEquals(pp.out.getvalue(), '1 . 2 . c "D"')
+        self.assertEqual(pp.out.getvalue(), '1 . 2 . c "D"')
 
     def test_condition(self):
         pp = CompilerPreprocessor({
@@ -125,7 +125,7 @@ class TestCompilerPreprocessor(unittest.TestCase):
         input.name = 'foo'
         pp.do_include(input)
 
-        self.assertEquals('IFDEF_A\nIF_A\nIF_B\nIF_NOT_C\n', pp.out.getvalue())
+        self.assertEqual('IFDEF_A\nIF_A\nIF_B\nIF_NOT_C\n', pp.out.getvalue())
 
 
 class FakeCompiler(dict):
@@ -164,9 +164,9 @@ class FakeCompiler(dict):
     '''
     def __init__(self, *definitions):
         for definition in definitions:
-            if all(not isinstance(d, dict) for d in definition.itervalues()):
+            if all(not isinstance(d, dict) for d in definition.values()):
                 definition = {None: definition}
-            for key, value in definition.iteritems():
+            for key, value in definition.items():
                 self.setdefault(key, {}).update(value)
 
     def __call__(self, stdin, args):
@@ -178,14 +178,14 @@ class FakeCompiler(dict):
             pp = CompilerPreprocessor(self[None])
 
             def apply_defn(defn):
-                for k, v in defn.iteritems():
+                for k, v in defn.items():
                     if v is False:
                         if k in pp.context:
                             del pp.context[k]
                     else:
                         pp.context[k] = v
 
-            for glob, defn in self.iteritems():
+            for glob, defn in self.items():
                 if glob and not glob.startswith('-') and fnmatch(file, glob):
                     apply_defn(defn)
 
@@ -216,7 +216,7 @@ class TestFakeCompiler(unittest.TestCase):
                 'A': '1',
                 'B': '2',
             })
-            self.assertEquals(compiler(None, ['-E', 'file']),
+            self.assertEqual(compiler(None, ['-E', 'file']),
                               (0, '1 2 C', ''))
 
             compiler = FakeCompiler({
@@ -238,25 +238,25 @@ class TestFakeCompiler(unittest.TestCase):
                     'B': '42',
                 },
             })
-            self.assertEquals(compiler(None, ['-E', 'file']),
+            self.assertEqual(compiler(None, ['-E', 'file']),
                               (0, '1 2 C', ''))
-            self.assertEquals(compiler(None, ['-E', '-foo', 'file']),
+            self.assertEqual(compiler(None, ['-E', '-foo', 'file']),
                               (0, '1 2 foo', ''))
-            self.assertEquals(compiler(None, ['-E', '-bar', 'file']),
+            self.assertEqual(compiler(None, ['-E', '-bar', 'file']),
                               (0, '1 bar bar', ''))
-            self.assertEquals(compiler(None, ['-E', '-qux', 'file']),
+            self.assertEqual(compiler(None, ['-E', '-qux', 'file']),
                               (0, '1 B C', ''))
-            self.assertEquals(compiler(None, ['-E', '-foo', '-bar', 'file']),
+            self.assertEqual(compiler(None, ['-E', '-foo', '-bar', 'file']),
                               (0, '1 bar bar', ''))
-            self.assertEquals(compiler(None, ['-E', '-bar', '-foo', 'file']),
+            self.assertEqual(compiler(None, ['-E', '-bar', '-foo', 'file']),
                               (0, '1 bar foo', ''))
-            self.assertEquals(compiler(None, ['-E', '-bar', '-qux', 'file']),
+            self.assertEqual(compiler(None, ['-E', '-bar', '-qux', 'file']),
                               (0, '1 B bar', ''))
-            self.assertEquals(compiler(None, ['-E', '-qux', '-bar', 'file']),
+            self.assertEqual(compiler(None, ['-E', '-qux', '-bar', 'file']),
                               (0, '1 bar bar', ''))
-            self.assertEquals(compiler(None, ['-E', 'file.c']),
+            self.assertEqual(compiler(None, ['-E', 'file.c']),
                               (0, '1 42 C', ''))
-            self.assertEquals(compiler(None, ['-E', '-bar', 'file.c']),
+            self.assertEqual(compiler(None, ['-E', '-bar', 'file.c']),
                               (0, '1 bar bar', ''))
 
     def test_multiple_definitions(self):
@@ -267,7 +267,7 @@ class TestFakeCompiler(unittest.TestCase):
             'C': 3,
         })
 
-        self.assertEquals(compiler, {
+        self.assertEqual(compiler, {
             None: {
                 'A': 1,
                 'B': 2,
@@ -282,7 +282,7 @@ class TestFakeCompiler(unittest.TestCase):
             'C': 3,
         })
 
-        self.assertEquals(compiler, {
+        self.assertEqual(compiler, {
             None: {
                 'A': 1,
                 'B': 4,
@@ -302,7 +302,7 @@ class TestFakeCompiler(unittest.TestCase):
             },
         })
 
-        self.assertEquals(compiler, {
+        self.assertEqual(compiler, {
             None: {
                 'A': 1,
                 'B': 4,
@@ -330,7 +330,7 @@ class TestFakeCompiler(unittest.TestCase):
             },
         })
 
-        self.assertEquals(compiler, {
+        self.assertEqual(compiler, {
             None: {
                 'A': 1,
                 'B': 2,
@@ -370,7 +370,7 @@ class CompilerResult(ReadOnlyNamespace):
     def __add__(self, other):
         assert isinstance(other, dict)
         result = copy.deepcopy(self.__dict__)
-        for k, v in other.iteritems():
+        for k, v in other.items():
             if k == 'flags':
                 result.setdefault(k, []).extend(v)
             else:
@@ -381,7 +381,7 @@ class CompilerResult(ReadOnlyNamespace):
 class TestCompilerResult(unittest.TestCase):
     def test_compiler_result(self):
         result = CompilerResult()
-        self.assertEquals(result.__dict__, {
+        self.assertEqual(result.__dict__, {
             'wrapper': [],
             'compiler': mozpath.abspath(''),
             'version': '',
@@ -397,7 +397,7 @@ class TestCompilerResult(unittest.TestCase):
             language='C',
             flags=['-std=gnu99'],
         )
-        self.assertEquals(result.__dict__, {
+        self.assertEqual(result.__dict__, {
             'wrapper': [],
             'compiler': mozpath.abspath('/usr/bin/gcc'),
             'version': '4.2.1',
@@ -407,7 +407,7 @@ class TestCompilerResult(unittest.TestCase):
         })
 
         result2 = result + {'flags': ['-m32']}
-        self.assertEquals(result2.__dict__, {
+        self.assertEqual(result2.__dict__, {
             'wrapper': [],
             'compiler': mozpath.abspath('/usr/bin/gcc'),
             'version': '4.2.1',
@@ -416,14 +416,14 @@ class TestCompilerResult(unittest.TestCase):
             'flags': ['-std=gnu99', '-m32'],
         })
         # Original flags are untouched.
-        self.assertEquals(result.flags, ['-std=gnu99'])
+        self.assertEqual(result.flags, ['-std=gnu99'])
 
         result3 = result + {
             'compiler': '/usr/bin/gcc-4.7',
             'version': '4.7.3',
             'flags': ['-m32'],
         }
-        self.assertEquals(result3.__dict__, {
+        self.assertEqual(result3.__dict__, {
             'wrapper': [],
             'compiler': mozpath.abspath('/usr/bin/gcc-4.7'),
             'version': '4.7.3',
diff --git a/python/mozbuild/mozbuild/test/configure/test_toolkit_moz_configure.py b/python/mozbuild/mozbuild/test/configure/test_toolkit_moz_configure.py
index ac35d745f..cdd8ece1b 100644
--- a/python/mozbuild/mozbuild/test/configure/test_toolkit_moz_configure.py
+++ b/python/mozbuild/mozbuild/test/configure/test_toolkit_moz_configure.py
@@ -2,7 +2,7 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, print_function, unicode_literals
+
 
 import os
 
diff --git a/python/mozbuild/mozbuild/test/configure/test_util.py b/python/mozbuild/mozbuild/test/configure/test_util.py
index 9f9575fd0..c2db1a628 100644
--- a/python/mozbuild/mozbuild/test/configure/test_util.py
+++ b/python/mozbuild/mozbuild/test/configure/test_util.py
@@ -2,7 +2,7 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, print_function, unicode_literals
+
 
 import logging
 import os
@@ -11,7 +11,7 @@ import textwrap
 import unittest
 import sys
 
-from StringIO import StringIO
+from io import StringIO
 
 from mozunit import main
 from mozpack import path as mozpath
@@ -434,11 +434,11 @@ class TestLogSubprocessOutput(unittest.TestCase):
         except SystemExit as e:
             status = e.code
 
-        self.assertEquals(status, 0)
+        self.assertEqual(status, 0)
         quote_char = "'"
         if getpreferredencoding().lower() == 'utf-8':
             quote_char = '\u00B4'.encode('utf-8')
-        self.assertEquals(out.getvalue().strip(), quote_char)
+        self.assertEqual(out.getvalue().strip(), quote_char)
 
 
 class TestVersion(unittest.TestCase):
diff --git a/python/mozbuild/mozbuild/testing.py b/python/mozbuild/mozbuild/testing.py
index 3229c3f77..82d250fab 100644
--- a/python/mozbuild/mozbuild/testing.py
+++ b/python/mozbuild/mozbuild/testing.py
@@ -2,9 +2,9 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, unicode_literals
 
-import cPickle as pickle
+
+import pickle as pickle
 import os
 import sys
 
@@ -70,7 +70,7 @@ REFTEST_FLAVORS = ('crashtest', 'reftest')
 WEB_PLATFORM_TESTS_FLAVORS = ('web-platform-tests',)
 
 def all_test_flavors():
-    return ([v[0] for v in TEST_MANIFESTS.values()] +
+    return ([v[0] for v in list(TEST_MANIFESTS.values())] +
             list(REFTEST_FLAVORS) +
             list(WEB_PLATFORM_TESTS_FLAVORS))
 
@@ -210,7 +210,7 @@ def install_test_files(topsrcdir, topobjdir, tests_root, test_objs):
     only a few tests need to be run.
     """
     flavor_info = {flavor: (root, prefix, install)
-                   for (flavor, root, prefix, install) in TEST_MANIFESTS.values()}
+                   for (flavor, root, prefix, install) in list(TEST_MANIFESTS.values())}
     objdir_dest = mozpath.join(topobjdir, tests_root)
 
     converter = SupportFilesConverter()
@@ -292,7 +292,7 @@ def read_wpt_manifest(context, paths):
         paths_file = os.path.join(context.config.topsrcdir, "testing",
                                   "web-platform", "tests", "tools", "localpaths.py")
         _globals = {"__file__": paths_file}
-        execfile(paths_file, _globals)
+        exec(compile(open(paths_file, "rb").read(), paths_file, 'exec'), _globals)
         import manifest as wptmanifest
     finally:
         sys.path = old_path
diff --git a/python/mozbuild/mozbuild/util.py b/python/mozbuild/mozbuild/util.py
index 4ea227dc0..79cb15713 100644
--- a/python/mozbuild/mozbuild/util.py
+++ b/python/mozbuild/mozbuild/util.py
@@ -5,7 +5,7 @@
 # This file contains miscellaneous utility functions that don't belong anywhere
 # in particular.
 
-from __future__ import absolute_import, unicode_literals, print_function
+
 
 import argparse
 import collections
@@ -21,6 +21,9 @@ import stat
 import sys
 import time
 import types
+import pprint
+import six
+import subprocess
 
 from collections import (
     defaultdict,
@@ -36,7 +39,7 @@ from io import (
 if sys.version_info[0] == 3:
     str_type = str
 else:
-    str_type = basestring
+    str_type = str
 
 if sys.platform == 'win32':
     _kernel32 = ctypes.windll.kernel32
@@ -78,7 +81,7 @@ def hash_file(path, hasher=None):
     return h.hexdigest()
 
 
-class EmptyValue(unicode):
+class EmptyValue(str):
     """A dummy type that behaves like an empty string and sequence.
 
     This type exists in order to support
@@ -92,7 +95,7 @@ class EmptyValue(unicode):
 class ReadOnlyNamespace(object):
     """A class for objects with immutable attributes set at initialization."""
     def __init__(self, **kwargs):
-        for k, v in kwargs.iteritems():
+        for k, v in kwargs.items():
             super(ReadOnlyNamespace, self).__setattr__(k, v)
 
     def __delattr__(self, key):
@@ -224,7 +227,7 @@ class FileAvoidWrite(BytesIO):
         self.mode = mode
 
     def write(self, buf):
-        if isinstance(buf, unicode):
+        if isinstance(buf, str):
             buf = buf.encode('utf-8')
         BytesIO.write(self, buf)
 
@@ -267,6 +270,10 @@ class FileAvoidWrite(BytesIO):
             if 'b' in self.mode:
                 writemode += 'b'
             with open(self.name, writemode) as file:
+                if 'b' in self.mode and isinstance(buf, str):
+                    buf = buf.encode('utf-8')
+                elif 'b' not in self.mode and isinstance(buf, bytes):
+                    buf = buf.decode('utf-8')
                 file.write(buf)
 
         if self._capture_diff:
@@ -381,7 +388,7 @@ class ListMixin(object):
     def __add__(self, other):
         # Allow None and EmptyValue is a special case because it makes undefined
         # variable references in moz.build behave better.
-        other = [] if isinstance(other, (types.NoneType, EmptyValue)) else other
+        other = [] if isinstance(other, (type(None), EmptyValue)) else other
         if not isinstance(other, list):
             raise ValueError('Only lists can be appended to lists.')
 
@@ -390,7 +397,7 @@ class ListMixin(object):
         return new_list
 
     def __iadd__(self, other):
-        other = [] if isinstance(other, (types.NoneType, EmptyValue)) else other
+        other = [] if isinstance(other, (type(None), EmptyValue)) else other
         if not isinstance(other, list):
             raise ValueError('Only lists can be appended to lists.')
 
@@ -561,14 +568,14 @@ def FlagsFactory(flags):
     functions below.
     """
     assert isinstance(flags, dict)
-    assert all(isinstance(v, type) for v in flags.values())
+    assert all(isinstance(v, type) for v in list(flags.values()))
 
     class Flags(object):
-        __slots__ = flags.keys()
+        __slots__ = list(flags.keys())
         _flags = flags
 
         def update(self, **kwargs):
-            for k, v in kwargs.iteritems():
+            for k, v in kwargs.items():
                 setattr(self, k, v)
 
         def __getattr__(self, name):
@@ -1006,8 +1013,6 @@ def TypedNamedTuple(name, fields):
                                     'got %s, expected %s' % (fname,
                                     type(value), ftype))
 
-            super(TypedTuple, self).__init__(*args, **kwargs)
-
     TypedTuple._fields = fields
 
     return TypedTuple
@@ -1099,14 +1104,14 @@ def group_unified_files(files, unified_prefix, unified_suffix,
     # issue.  So we do a little dance to filter it out ourselves.
     dummy_fill_value = ("dummy",)
     def filter_out_dummy(iterable):
-        return itertools.ifilter(lambda x: x != dummy_fill_value,
+        return filter(lambda x: x != dummy_fill_value,
                                  iterable)
 
     # From the itertools documentation, slightly modified:
     def grouper(n, iterable):
         "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
         args = [iter(iterable)] * n
-        return itertools.izip_longest(fillvalue=dummy_fill_value, *args)
+        return itertools.zip_longest(fillvalue=dummy_fill_value, *args)
 
     for i, unified_group in enumerate(grouper(files_per_unified_file,
                                               files)):
@@ -1123,7 +1128,7 @@ def pair(iterable):
         [(1,2), (3,4), (5,6)]
     '''
     i = iter(iterable)
-    return itertools.izip_longest(i, i)
+    return itertools.zip_longest(i, i)
 
 
 VARIABLES_RE = re.compile('\$\((\w+)\)')
@@ -1141,7 +1146,7 @@ def expand_variables(s, variables):
         value = variables.get(name)
         if not value:
             continue
-        if not isinstance(value, types.StringTypes):
+        if not isinstance(value, (str,)):
             value = ' '.join(value)
         result += value
     return result
@@ -1168,7 +1173,7 @@ class EnumStringComparisonError(Exception):
     pass
 
 
-class EnumString(unicode):
+class EnumString(str):
     '''A string type that only can have a limited set of values, similarly to
     an Enum, and can only be compared against that set of values.
 
@@ -1185,8 +1190,8 @@ class EnumString(unicode):
     def __eq__(self, other):
         if other not in self.POSSIBLE_VALUES:
             raise EnumStringComparisonError(
-                'Can only compare with %s'
-                % ', '.join("'%s'" % v for v in self.POSSIBLE_VALUES))
+                '%s is not in %s'
+                % (other, ', '.join("'%s'" % v for v in self.POSSIBLE_VALUES)))
         return super(EnumString, self).__eq__(other)
 
     def __ne__(self, other):
@@ -1204,14 +1209,14 @@ def _escape_char(c):
     # quoting could be done with either ' or ".
     if c == "'":
         return "\\'"
-    return unicode(c.encode('unicode_escape'))
+    return str(c.encode('unicode_escape'))
 
 # Mapping table between raw characters below \x80 and their escaped
 # counterpart, when they differ
 _INDENTED_REPR_TABLE = {
     c: e
     for c, e in map(lambda x: (x, _escape_char(x)),
-                    map(unichr, range(128)))
+                    map(chr, range(128)))
     if c != e
 }
 # Regexp matching all characters to escape.
@@ -1219,7 +1224,33 @@ _INDENTED_REPR_RE = re.compile(
     '([' + ''.join(_INDENTED_REPR_TABLE.values()) + ']+)')
 
 
+# Stolen from gecko master [1]
+# [1] https://github.com/mozilla/gecko-dev/blob/4165a2e843c494bfb3e35d8a1fbf9c61209e3675/python/mozbuild/mozbuild/util.py#L1286
+
+# The default PrettyPrinter has some issues with UTF-8, so we need to override
+# some stuff here.
+class _PrettyPrinter(pprint.PrettyPrinter):
+    def format(self, object, context, maxlevels, level):
+        if not (isinstance(object, six.text_type) or
+                isinstance(object, six.binary_type)):
+            return super(_PrettyPrinter, self).format(
+                object, context, maxlevels, level)
+        # This is super hacky and weird, but the output of 'repr' actually
+        # varies based on the default I/O encoding of the process, which isn't
+        # necessarily utf-8. Instead we open a new shell and ask what the repr
+        # WOULD be assuming the default encoding is utf-8. If you can come up
+        # with a better way of doing this without simply re-implementing the
+        # logic of "repr", please replace this.
+        env = dict(os.environ)
+        env['PYTHONIOENCODING'] = 'utf-8'
+        ret = six.ensure_text(subprocess.check_output(
+            [sys.executable], input='print(repr(%s))' % repr(object),
+            universal_newlines=True, env=env, encoding='utf-8')).strip()
+        return (ret, True, False)
+
 def indented_repr(o, indent=4):
+    return _PrettyPrinter(indent=indent).pformat(o)
+
     '''Similar to repr(), but returns an indented representation of the object
 
     One notable difference with repr is that the returned representation
@@ -1242,7 +1273,7 @@ def indented_repr(o, indent=4):
         elif isinstance(o, bytes):
             yield 'b'
             yield repr(o)
-        elif isinstance(o, unicode):
+        elif isinstance(o, str):
             yield "'"
             # We want a readable string (non escaped unicode), but some
             # special characters need escaping (e.g. \n, \t, etc.)
@@ -1272,11 +1303,11 @@ def encode(obj, encoding='utf-8'):
     if isinstance(obj, dict):
         return {
             encode(k, encoding): encode(v, encoding)
-            for k, v in obj.iteritems()
+            for k, v in obj.items()
         }
     if isinstance(obj, bytes):
         return obj
-    if isinstance(obj, unicode):
+    if isinstance(obj, str):
         return obj.encode(encoding)
     if isinstance(obj, Iterable):
         return [encode(i, encoding) for i in obj]
diff --git a/python/mozbuild/mozbuild/virtualenv.py b/python/mozbuild/mozbuild/virtualenv.py
index 38d06d71d..c67c046f3 100644
--- a/python/mozbuild/mozbuild/virtualenv.py
+++ b/python/mozbuild/mozbuild/virtualenv.py
@@ -531,9 +531,9 @@ def verify_python_version(log_handle):
 
     our = LooseVersion('%d.%d.%d' % (major, minor, micro))
 
-    if major != MINIMUM_PYTHON_MAJOR or our < MINIMUM_PYTHON_VERSION:
-        log_handle.write('Python %s or greater (but not Python 3) is '
-            'required to build. ' % MINIMUM_PYTHON_VERSION)
+    if our < MINIMUM_PYTHON_VERSION:
+        log_handle.write('Python %s or greater is required to build. '
+            % MINIMUM_PYTHON_VERSION)
         log_handle.write('You are running Python %s.\n' % our)
 
         if os.name in ('nt', 'ce'):
diff --git a/python/mozbuild/mozpack/chrome/manifest.py b/python/mozbuild/mozpack/chrome/manifest.py
index c91b99cf1..02eac0dbb 100644
--- a/python/mozbuild/mozpack/chrome/manifest.py
+++ b/python/mozbuild/mozpack/chrome/manifest.py
@@ -2,11 +2,11 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import
+
 
 import re
 import os
-from urlparse import urlparse
+from urllib.parse import urlparse
 import mozpack.path as mozpath
 from mozpack.chrome.flags import Flags
 from mozpack.errors import errors
@@ -316,7 +316,7 @@ class ManifestContract(ManifestEntry):
         return self.serialize(self.contractID, self.cid)
 
 # All manifest classes by their type name.
-MANIFESTS_TYPES = dict([(c.type, c) for c in globals().values()
+MANIFESTS_TYPES = dict([(c.type, c) for c in list(globals().values())
                        if type(c) == type and issubclass(c, ManifestEntry)
                        and hasattr(c, 'type') and c.type])
 
diff --git a/python/mozbuild/mozpack/copier.py b/python/mozbuild/mozpack/copier.py
index 1e521e52b..43ed9be4a 100644
--- a/python/mozbuild/mozpack/copier.py
+++ b/python/mozbuild/mozpack/copier.py
@@ -2,7 +2,7 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import
+
 
 import os
 import stat
@@ -113,7 +113,7 @@ class FileRegistry(object):
         '''
         Return all paths stored in the container, in the order they were added.
         '''
-        return self._files.keys()
+        return list(self._files.keys())
 
     def __len__(self):
         '''
@@ -146,7 +146,7 @@ class FileRegistry(object):
             for path, file in registry:
                 (...)
         '''
-        return self._files.iteritems()
+        return iter(self._files.items())
 
     def required_directories(self):
         '''
@@ -155,7 +155,7 @@ class FileRegistry(object):
         unspecified (virtual) root directory (and do not include said root
         directory).
         '''
-        return set(k for k, v in self._required_directories.items() if v > 0)
+        return set(k for k, v in list(self._required_directories.items()) if v > 0)
 
     def output_to_inputs_tree(self):
         '''
@@ -295,7 +295,7 @@ class FileCopier(FileRegistry):
 
         Returns a FileCopyResult that details what changed.
         '''
-        assert isinstance(destination, basestring)
+        assert isinstance(destination, str)
         assert not os.path.exists(destination) or os.path.isdir(destination)
 
         result = FileCopyResult()
@@ -563,7 +563,7 @@ class Jarrer(FileRegistry, BaseFile):
             def exists(self):
                 return self.deflater is not None
 
-        if isinstance(dest, basestring):
+        if isinstance(dest, str):
             dest = Dest(dest)
         assert isinstance(dest, Dest)
 
diff --git a/python/mozbuild/mozpack/files.py b/python/mozbuild/mozpack/files.py
index 8ce353375..bf35e39b8 100644
--- a/python/mozbuild/mozpack/files.py
+++ b/python/mozbuild/mozpack/files.py
@@ -2,7 +2,7 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import
+
 
 import errno
 import os
@@ -57,7 +57,7 @@ else:
 
     def _copyfile(src, dest):
         # False indicates `dest` should be overwritten if it exists already.
-        if isinstance(src, unicode) and isinstance(dest, unicode):
+        if isinstance(src, str) and isinstance(dest, str):
             _CopyFileW(src, dest, False)
         elif isinstance(src, str) and isinstance(dest, str):
             _CopyFileA(src, dest, False)
@@ -164,7 +164,7 @@ class BaseFile(object):
         disabled when skip_if_older is False.
         Returns whether a copy was actually performed (True) or not (False).
         '''
-        if isinstance(dest, basestring):
+        if isinstance(dest, str):
             dest = Dest(dest)
         else:
             assert isinstance(dest, Dest)
@@ -278,11 +278,11 @@ class ExecutableFile(File):
     '''
     def copy(self, dest, skip_if_older=True):
         real_dest = dest
-        if not isinstance(dest, basestring):
+        if not isinstance(dest, str):
             fd, dest = mkstemp()
             os.close(fd)
             os.remove(dest)
-        assert isinstance(dest, basestring)
+        assert isinstance(dest, str)
         # If File.copy didn't actually copy because dest is newer, check the
         # file sizes. If dest is smaller, it means it is already stripped and
         # elfhacked, so we can skip.
@@ -319,7 +319,7 @@ class AbsoluteSymlinkFile(File):
         File.__init__(self, path)
 
     def copy(self, dest, skip_if_older=True):
-        assert isinstance(dest, basestring)
+        assert isinstance(dest, str)
 
         # The logic in this function is complicated by the fact that symlinks
         # aren't universally supported. So, where symlinks aren't supported, we
@@ -410,7 +410,7 @@ class HardlinkFile(File):
     '''
 
     def copy(self, dest, skip_if_older=True):
-        assert isinstance(dest, basestring)
+        assert isinstance(dest, str)
 
         if not hasattr(os, 'link'):
             return super(HardlinkFile, self).copy(
@@ -471,7 +471,7 @@ class ExistingFile(BaseFile):
         self.required = required
 
     def copy(self, dest, skip_if_older=True):
-        if isinstance(dest, basestring):
+        if isinstance(dest, str):
             dest = Dest(dest)
         else:
             assert isinstance(dest, Dest)
@@ -517,7 +517,7 @@ class PreprocessedFile(BaseFile):
         '''
         Invokes the preprocessor to create the destination file.
         '''
-        if isinstance(dest, basestring):
+        if isinstance(dest, str):
             dest = Dest(dest)
         else:
             assert isinstance(dest, Dest)
@@ -657,7 +657,7 @@ class XPTFile(GeneratedFile):
         the individual XPTs to link.
         skip_if_older is ignored.
         '''
-        if isinstance(dest, basestring):
+        if isinstance(dest, str):
             dest = Dest(dest)
         assert isinstance(dest, Dest)
 
@@ -1108,7 +1108,7 @@ class ComposedFinder(BaseFinder):
         from mozpack.copier import FileRegistry
         self.files = FileRegistry()
 
-        for base, finder in sorted(finders.iteritems()):
+        for base, finder in sorted(finders.items()):
             if self.files.contains(base):
                 self.files.remove(base)
             for p, f in finder.find(''):
diff --git a/python/mozbuild/mozpack/manifests.py b/python/mozbuild/mozpack/manifests.py
index 27c66634b..f79b40086 100644
--- a/python/mozbuild/mozpack/manifests.py
+++ b/python/mozbuild/mozpack/manifests.py
@@ -2,8 +2,6 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, unicode_literals
-
 from contextlib import contextmanager
 import json
 
@@ -116,7 +114,7 @@ class InstallManifest(object):
         self._source_files = set()
 
         if path or fileobj:
-            with _auto_fileobj(path, fileobj, 'rb') as fh:
+            with _auto_fileobj(path, fileobj, 'r') as fh:
                 self._source_files.add(fh.name)
                 self._load_from_fileobj(fh)
 
@@ -175,7 +173,7 @@ class InstallManifest(object):
                 dest, content = fields[1:]
 
                 self.add_content(
-                    self._decode_field_entry(content).encode('utf-8'), dest)
+                    self._decode_field_entry(content), dest)
                 continue
 
             # Don't fail for non-actionable items, allowing
@@ -228,7 +226,7 @@ class InstallManifest(object):
 
         It is an error if both are specified.
         """
-        with _auto_fileobj(path, fileobj, 'wb') as fh:
+        with _auto_fileobj(path, fileobj, 'w') as fh:
             fh.write('%d\n' % self.CURRENT_VERSION)
 
             for dest in sorted(self._dests):
@@ -242,13 +240,11 @@ class InstallManifest(object):
                     for path in paths:
                         source = mozpath.join(base, path)
                         parts = ['%d' % type, mozpath.join(dest, path), source]
-                        fh.write('%s\n' % self.FIELD_SEPARATOR.join(
-                            p.encode('utf-8') for p in parts))
+                        fh.write('%s\n' % self.FIELD_SEPARATOR.join(parts))
                 else:
                     parts = ['%d' % entry[0], dest]
                     parts.extend(entry[1:])
-                    fh.write('%s\n' % self.FIELD_SEPARATOR.join(
-                        p.encode('utf-8') for p in parts))
+                    fh.write('%s\n' % self.FIELD_SEPARATOR.join(parts))
 
     def add_link(self, source, dest):
         """Add a link to this manifest.
@@ -439,7 +435,7 @@ class InstallManifest(object):
             if install_type == self.CONTENT:
                 # GeneratedFile expect the buffer interface, which the unicode
                 # type doesn't have, so encode to a str.
-                content = self._decode_field_entry(entry[1]).encode('utf-8')
+                content = self._decode_field_entry(entry[1])
                 registry.add(dest, GeneratedFile(content))
                 continue
 
diff --git a/python/mozbuild/mozpack/mozjar.py b/python/mozbuild/mozpack/mozjar.py
index a723fd2c0..0b04d233c 100644
--- a/python/mozbuild/mozpack/mozjar.py
+++ b/python/mozbuild/mozpack/mozjar.py
@@ -2,7 +2,7 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import
+
 
 from io import BytesIO
 import struct
@@ -14,9 +14,10 @@ from zipfile import (
     ZIP_DEFLATED,
 )
 from collections import OrderedDict
-from urlparse import urlparse, ParseResult
+from urllib.parse import urlparse, ParseResult
 import mozpack.path as mozpath
 from mozbuild.util import memoize
+from functools import reduce
 
 
 JAR_STORED = ZIP_STORED
@@ -72,7 +73,7 @@ class JarStruct(object):
         an instance with empty fields.
         '''
         assert self.MAGIC and isinstance(self.STRUCT, OrderedDict)
-        self.size_fields = set(t for t in self.STRUCT.itervalues()
+        self.size_fields = set(t for t in self.STRUCT.values()
                                if not t in JarStruct.TYPE_MAPPING)
         self._values = {}
         if data:
@@ -94,7 +95,7 @@ class JarStruct(object):
         # For all fields used as other fields sizes, keep track of their value
         # separately.
         sizes = dict((t, 0) for t in self.size_fields)
-        for name, t in self.STRUCT.iteritems():
+        for name, t in self.STRUCT.items():
             if t in JarStruct.TYPE_MAPPING:
                 value, size = JarStruct.get_data(t, data[offset:])
             else:
@@ -113,7 +114,7 @@ class JarStruct(object):
         Initialize an instance with empty fields.
         '''
         self.signature = self.MAGIC
-        for name, t in self.STRUCT.iteritems():
+        for name, t in self.STRUCT.items():
             if name in self.size_fields:
                 continue
             self._values[name] = 0 if t in JarStruct.TYPE_MAPPING else ''
@@ -138,9 +139,9 @@ class JarStruct(object):
         from self.STRUCT.
         '''
         serialized = struct.pack('<I', self.signature)
-        sizes = dict((t, name) for name, t in self.STRUCT.iteritems()
+        sizes = dict((t, name) for name, t in self.STRUCT.items()
                      if not t in JarStruct.TYPE_MAPPING)
-        for name, t in self.STRUCT.iteritems():
+        for name, t in self.STRUCT.items():
             if t in JarStruct.TYPE_MAPPING:
                 format, size = JarStruct.TYPE_MAPPING[t]
                 if name in sizes:
@@ -159,7 +160,7 @@ class JarStruct(object):
         variable length fields.
         '''
         size = JarStruct.TYPE_MAPPING['uint32'][1]
-        for name, type in self.STRUCT.iteritems():
+        for name, type in self.STRUCT.items():
             if type in JarStruct.TYPE_MAPPING:
                 size += JarStruct.TYPE_MAPPING[type][1]
             else:
@@ -180,7 +181,7 @@ class JarStruct(object):
         return key in self._values
 
     def __iter__(self):
-        return self._values.iteritems()
+        return iter(self._values.items())
 
     def __repr__(self):
         return "<%s %s>" % (self.__class__.__name__,
@@ -374,7 +375,7 @@ class JarReader(object):
         entries = self.entries
         if not entries:
             return JAR_STORED
-        return max(f['compression'] for f in entries.itervalues())
+        return max(f['compression'] for f in entries.values())
 
     @property
     def entries(self):
@@ -390,7 +391,7 @@ class JarReader(object):
             preload = JarStruct.get_data('uint32', self._data)[0]
         entries = OrderedDict()
         offset = self._cdir_end['cdir_offset']
-        for e in xrange(self._cdir_end['cdir_entries']):
+        for e in range(self._cdir_end['cdir_entries']):
             entry = JarCdirEntry(self._data[offset:])
             offset += entry.size
             # Creator host system. 0 is MSDOS, 3 is Unix
@@ -452,7 +453,7 @@ class JarReader(object):
             for file in jarReader:
                 ...
         '''
-        for entry in self.entries.itervalues():
+        for entry in self.entries.values():
             yield self._getreader(entry)
 
     def __getitem__(self, name):
@@ -547,7 +548,7 @@ class JarWriter(object):
         headers = {}
         preload_size = 0
         # Prepare central directory entries
-        for entry, content in self._contents.itervalues():
+        for entry, content in self._contents.values():
             header = JarLocalFileHeader()
             for name in entry.STRUCT:
                 if name in header:
@@ -562,7 +563,7 @@ class JarWriter(object):
         end['disk_entries'] = len(self._contents)
         end['cdir_entries'] = end['disk_entries']
         end['cdir_size'] = reduce(lambda x, y: x + y[0].size,
-                                  self._contents.values(), 0)
+                                  list(self._contents.values()), 0)
         # On optimized archives, store the preloaded size and the central
         # directory entries, followed by the first end of central directory.
         if self._optimize:
@@ -571,18 +572,18 @@ class JarWriter(object):
             if preload_size:
                 preload_size += offset
             self._data.write(struct.pack('<I', preload_size))
-            for entry, _ in self._contents.itervalues():
+            for entry, _ in self._contents.values():
                 entry['offset'] += offset
                 self._data.write(entry.serialize())
             self._data.write(end.serialize())
         # Store local file entries followed by compressed data
-        for entry, content in self._contents.itervalues():
+        for entry, content in self._contents.values():
             self._data.write(headers[entry].serialize())
             self._data.write(content)
         # On non optimized archives, store the central directory entries.
         if not self._optimize:
             end['cdir_offset'] = offset
-            for entry, _ in self._contents.itervalues():
+            for entry, _ in self._contents.values():
                 self._data.write(entry.serialize())
         # Store the end of central directory.
         self._data.write(end.serialize())
@@ -622,7 +623,7 @@ class JarWriter(object):
             deflater = data
         else:
             deflater = Deflater(compress, compress_level=self._compress_level)
-            if isinstance(data, basestring):
+            if isinstance(data, str):
                 deflater.write(data)
             elif hasattr(data, 'read'):
                 if hasattr(data, 'seek'):
diff --git a/testing/mozbase/manifestparser/manifestparser/ini.py b/testing/mozbase/manifestparser/manifestparser/ini.py
index e5ba249c1..c141a18b7 100644
--- a/testing/mozbase/manifestparser/manifestparser/ini.py
+++ b/testing/mozbase/manifestparser/manifestparser/ini.py
@@ -2,7 +2,7 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this file,
 # You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import
+
 
 import os
 import sys
@@ -12,7 +12,7 @@ __all__ = ['read_ini', 'combine_fields']
 
 class IniParseError(Exception):
     def __init__(self, fp, linenum, msg):
-        if isinstance(fp, basestring):
+        if isinstance(fp, str):
             path = fp
         elif hasattr(fp, 'name'):
             path = fp.name
@@ -43,12 +43,15 @@ def read_ini(fp, variables=None, default='DEFAULT', defaults_only=False,
     sections = []
     key = value = None
     section_names = set()
-    if isinstance(fp, basestring):
+    if isinstance(fp, str):
         fp = file(fp)
 
     # read the lines
     for (linenum, line) in enumerate(fp.read().splitlines(), start=1):
 
+        if isinstance(line, bytes):
+           line = line.decode('utf-8')
+
         stripped = line.strip()
 
         # ignore blank lines
@@ -66,7 +69,7 @@ def read_ini(fp, variables=None, default='DEFAULT', defaults_only=False,
         inline_prefixes = {p: -1 for p in comments}
         while comment_start == sys.maxsize and inline_prefixes:
             next_prefixes = {}
-            for prefix, index in inline_prefixes.items():
+            for prefix, index in list(inline_prefixes.items()):
                 index = line.find(prefix, index+1)
                 if index == -1:
                     continue
@@ -163,7 +166,7 @@ def combine_fields(global_vars, local_vars):
         'support-files': '%s %s',
     }
     final_mapping = global_vars.copy()
-    for field_name, value in local_vars.items():
+    for field_name, value in list(local_vars.items()):
         if field_name not in field_patterns or field_name not in global_vars:
             final_mapping[field_name] = value
             continue
diff --git a/testing/mozbase/manifestparser/manifestparser/manifestparser.py b/testing/mozbase/manifestparser/manifestparser/manifestparser.py
index 921369fd2..5b2f4c453 100755
--- a/testing/mozbase/manifestparser/manifestparser/manifestparser.py
+++ b/testing/mozbase/manifestparser/manifestparser/manifestparser.py
@@ -2,9 +2,9 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this file,
 # You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, print_function
 
-from StringIO import StringIO
+
+from io import StringIO
 import json
 import fnmatch
 import os
@@ -23,7 +23,7 @@ from .filters import (
 __all__ = ['ManifestParser', 'TestManifest', 'convert']
 
 relpath = os.path.relpath
-string = (basestring,)
+string = (str,)
 
 
 # path normalization
@@ -195,7 +195,7 @@ class ManifestParser(object):
 
             # otherwise an item
             # apply ancestor defaults, while maintaining current file priority
-            data = dict(self._ancestor_defaults.items() + data.items())
+            data = dict(list(self._ancestor_defaults.items()) + list(data.items()))
 
             test = data
             test['name'] = section
@@ -323,19 +323,19 @@ class ManifestParser(object):
         # make some check functions
         if inverse:
             def has_tags(test):
-                return not tags.intersection(test.keys())
+                return not tags.intersection(list(test.keys()))
 
             def dict_query(test):
-                for key, value in kwargs.items():
+                for key, value in list(kwargs.items()):
                     if test.get(key) == value:
                         return False
                 return True
         else:
             def has_tags(test):
-                return tags.issubset(test.keys())
+                return tags.issubset(list(test.keys()))
 
             def dict_query(test):
-                for key, value in kwargs.items():
+                for key, value in list(kwargs.items()):
                     if test.get(key) != value:
                         return False
                 return True
@@ -359,7 +359,7 @@ class ManifestParser(object):
         if tests is None:
             manifests = []
             # Make sure to return all the manifests, even ones without tests.
-            for manifest in self.manifest_defaults.keys():
+            for manifest in list(self.manifest_defaults.keys()):
                 if isinstance(manifest, tuple):
                     parentmanifest, manifest = manifest
                 if manifest not in manifests:
@@ -409,7 +409,7 @@ class ManifestParser(object):
         """
 
         files = set([])
-        if isinstance(directories, basestring):
+        if isinstance(directories, str):
             directories = [directories]
 
         # get files in directories
@@ -476,7 +476,7 @@ class ManifestParser(object):
             print('[DEFAULT]', file=fp)
             for tag in global_tags:
                 print('%s =' % tag, file=fp)
-            for key, value in global_kwargs.items():
+            for key, value in list(global_kwargs.items()):
                 print('%s = %s' % (key, value), file=fp)
             print(file=fp)
 
@@ -602,7 +602,7 @@ class ManifestParser(object):
         internal function to import directories
         """
 
-        if isinstance(pattern, basestring):
+        if isinstance(pattern, str):
             patterns = [pattern]
         else:
             patterns = pattern
diff --git a/testing/mozbase/mozinfo/mozinfo/mozinfo.py b/testing/mozbase/mozinfo/mozinfo/mozinfo.py
index 90c187568..6c5a1f322 100755
--- a/testing/mozbase/mozinfo/mozinfo/mozinfo.py
+++ b/testing/mozbase/mozinfo/mozinfo/mozinfo.py
@@ -8,7 +8,7 @@
 # linux) to the information; I certainly wouldn't want anyone parsing this
 # information and having behaviour depend on it
 
-from __future__ import absolute_import, print_function
+
 
 import os
 import platform
@@ -24,7 +24,7 @@ _os = os
 class unknown(object):
     """marker class for unknown information"""
 
-    def __nonzero__(self):
+    def __bool__(self):
         return False
 
     def __str__(self):
@@ -96,20 +96,17 @@ elif system.startswith(('MINGW', 'MSYS_NT')):
     info['os'] = 'win'
     os_version = version = unknown
 elif system == "Linux":
-    if hasattr(platform, "linux_distribution"):
-        (distro, os_version, codename) = platform.linux_distribution()
-    else:
-        (distro, os_version, codename) = platform.dist()
     if not processor:
         processor = machine
-    version = "%s %s" % (distro, os_version)
+
+    distro = 'OE/Yocto'
+    os_version = version = unknown
 
     # Bug in Python 2's `platform` library:
     # It will return a triple of empty strings if the distribution is not supported.
     # It works on Python 3. If we don't have an OS version,
     # the unit tests fail to run.
     if not distro and not os_version and not codename:
-        distro = 'lfs'
         version = release
         os_version = release
 
@@ -131,7 +128,7 @@ else:
     os_version = version = unknown
 
 info['version'] = version
-info['os_version'] = StringVersion(os_version)
+info['os_version'] = version
 
 # processor type and bits
 if processor in ["i386", "i686"]:
@@ -188,12 +185,7 @@ def update(new_info):
                      to a json file containing the new info.
     """
 
-    PY3 = sys.version_info[0] == 3
-    if PY3:
-        string_types = str,
-    else:
-        string_types = basestring,
-    if isinstance(new_info, string_types):
+    if isinstance(new_info, str):
         # lazy import
         import mozfile
         import json
@@ -295,7 +287,7 @@ def main(args=None):
 
     # print out choices if requested
     flag = False
-    for key, value in options.__dict__.items():
+    for key, value in list(options.__dict__.items()):
         if value is True:
             print('%s choices: %s' % (key, ' '.join([str(choice)
                                                      for choice in choices[key]])))
@@ -304,7 +296,7 @@ def main(args=None):
         return
 
     # otherwise, print out all info
-    for key, value in info.items():
+    for key, value in list(info.items()):
         print('%s: %s' % (key, value))
 
 
diff --git a/testing/mozbase/mozprocess/mozprocess/processhandler.py b/testing/mozbase/mozprocess/mozprocess/processhandler.py
index 3efb650b7..2575a4702 100644
--- a/testing/mozbase/mozprocess/mozprocess/processhandler.py
+++ b/testing/mozbase/mozprocess/mozprocess/processhandler.py
@@ -2,7 +2,7 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this file,
 # You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from __future__ import absolute_import, print_function
+
 
 import errno
 import os
@@ -13,7 +13,7 @@ import threading
 import time
 import traceback
 
-from Queue import Queue, Empty
+from queue import Queue, Empty
 from datetime import datetime
 
 
@@ -124,14 +124,14 @@ class ProcessHandlerMixin(object):
             thread = threading.current_thread().name
             print("DBG::MOZPROC PID:{} ({}) | {}".format(self.pid, thread, msg))
 
-        def __del__(self, _maxint=sys.maxint):
+        def __del__(self, _maxint=sys.maxsize):
             if isWin:
                 handle = getattr(self, '_handle', None)
                 if handle:
                     if hasattr(self, '_internal_poll'):
                         self._internal_poll(_deadstate=_maxint)
                     else:
-                        self.poll(_deadstate=sys.maxint)
+                        self.poll(_deadstate=sys.maxsize)
                 if handle or self._job or self._io_port:
                     self._cleanup()
             else:
@@ -243,7 +243,7 @@ class ProcessHandlerMixin(object):
                      p2cread, p2cwrite,
                      c2pread, c2pwrite,
                      errread, errwrite) = args_tuple
-                if not isinstance(args, basestring):
+                if not isinstance(args, str):
                     args = subprocess.list2cmdline(args)
 
                 # Always or in the create new process group
diff --git a/third_party/python/which/which.py b/third_party/python/which/which.py
index 9c7d10835..f02b2616e 100644
--- a/third_party/python/which/which.py
+++ b/third_party/python/which/which.py
@@ -90,13 +90,13 @@ def _getRegisteredExecutable(exeName):
     if sys.platform.startswith('win'):
         if os.path.splitext(exeName)[1].lower() != '.exe':
             exeName += '.exe'
-        import _winreg
+        import winreg
         try:
             key = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\" +\
                   exeName
-            value = _winreg.QueryValue(_winreg.HKEY_LOCAL_MACHINE, key)
+            value = winreg.QueryValue(winreg.HKEY_LOCAL_MACHINE, key)
             registered = (value, "from HKLM\\"+key)
-        except _winreg.error:
+        except winreg.error:
             pass
         if registered and not os.path.exists(registered[0]):
             registered = None
@@ -244,7 +244,7 @@ def which(command, path=None, verbose=0, exts=None):
     If no match is found for the command, a WhichError is raised.
     """
     try:
-        match = whichgen(command, path, verbose, exts).next()
+        match = next(whichgen(command, path, verbose, exts))
     except StopIteration:
         raise WhichError("Could not find '%s' on the path." % command)
     return match
@@ -281,17 +281,17 @@ def main(argv):
     try:
         optlist, args = getopt.getopt(argv[1:], 'haVvqp:e:',
             ['help', 'all', 'version', 'verbose', 'quiet', 'path=', 'exts='])
-    except getopt.GetoptError, msg:
+    except getopt.GetoptError as msg:
         sys.stderr.write("which: error: %s. Your invocation was: %s\n"\
                          % (msg, argv))
         sys.stderr.write("Try 'which --help'.\n")
         return 1
     for opt, optarg in optlist:
         if opt in ('-h', '--help'):
-            print _cmdlnUsage
+            print(_cmdlnUsage)
             return 0
         elif opt in ('-V', '--version'):
-            print "which %s" % __version__
+            print("which %s" % __version__)
             return 0
         elif opt in ('-a', '--all'):
             all = 1
@@ -319,9 +319,9 @@ def main(argv):
         nmatches = 0
         for match in whichgen(arg, path=altpath, verbose=verbose, exts=exts):
             if verbose:
-                print "%s (%s)" % match
+                print("%s (%s)" % match)
             else:
-                print match
+                print(match)
             nmatches += 1
             if not all:
                 break
-- 
2.21.0

