Bug 1406668 - Make build/moz.configure/*.configure compliant to the pep8 format + add to the list of directories to check r=glandium
authorSylvestre Ledru <sledru@mozilla.com>
Thu, 12 Oct 2017 15:22:59 +0200
changeset 385816 d14dd0e5c41a54d4c5a82d7c82245c03854e5b5e
parent 385815 be43001142a8242083e6f1ab2eb5e38be69d935b
child 385817 6074db12d685655fe5692d59471b3c32cc967dc9
push id32668
push userarchaeopteryx@coole-files.de
push dateThu, 12 Oct 2017 21:56:02 +0000
treeherdermozilla-central@46a75c66bb51 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1406668 - Make build/moz.configure/*.configure compliant to the pep8 format + add to the list of directories to check r=glandium MozReview-Commit-ID: 89NxxGUVjHV
new file mode 100644
--- /dev/null
+++ b/build/moz.configure/.flake8
@@ -0,0 +1,5 @@
+# F821: undefined name
+#       This is the moz.configure style
+ignore = F821
--- a/build/moz.configure/android-ndk.configure
+++ b/build/moz.configure/android-ndk.configure
@@ -6,28 +6,31 @@
 js_option('--with-android-ndk', nargs=1,
           help='location where the Android NDK can be found')
 js_option('--with-android-toolchain', nargs=1,
           help='location of the Android toolchain')
 def min_android_version(target):
     if target.cpu in ['aarch64', 'x86_64', 'mips64']:
         # 64-bit support was added in API 21.
         return '21'
     return '9'
           help='android platform version',
 @depends('--with-android-version', min_android_version, '--help')
 @imports(_from='__builtin__', _import='ValueError')
 def android_version(value, min_version, _):
     if not value:
         # Someone has passed --without-android-version.
         die('--with-android-version cannot be disabled.')
@@ -36,31 +39,35 @@ def android_version(value, min_version, 
         die('--with-android-version expects an integer value')
     if version < int(min_version):
         die('--with-android-version must be at least %s (got %s)',
             min_version, value[0])
     return version
 add_old_configure_assignment('android_version', android_version)
 @depends('--with-android-ndk', build_project, '--help')
 def ndk(value, build_project, help):
     if help:
     if build_project == 'mobile/android' and not value:
         die('You must specify --with-android-ndk=/path/to/ndk when '
             'building mobile/android')
     if value:
         return value[0]
 set_config('ANDROID_NDK', ndk)
 add_old_configure_assignment('android_ndk', ndk)
 @checking('for android ndk version')
 @imports(_from='__builtin__', _import='open')
 def ndk_version(ndk):
     if not ndk:
         # Building 'js/src' for non-Android.
     with open(os.path.join(ndk, 'source.properties'), 'r') as f:
@@ -68,39 +75,44 @@ def ndk_version(ndk):
             if not line.startswith('Pkg.Revision'):
             (_, version) = line.split('=')
             if version:
                 return version.strip()
             die('Unexpected Pkg.Revision line in source.properties')
     die('Cannot determine NDK version from source.properties')
 def ndk_major_version(ndk_version):
     if not ndk_version:
         # Building 'js/src' for non-Android.
     (major, minor, revision) = ndk_version.split('.')
     if major:
         return major
     die('Unexpected NDK version string: ' + ndk_version)
-set_config('ANDROID_NDK_MAJOR_VERSION', ndk_major_version);
+set_config('ANDROID_NDK_MAJOR_VERSION', ndk_major_version)
 def ndk_minor_version(ndk_version):
     if not ndk_version:
         # Building 'js/src' for non-Android.
     (major, minor, revision) = ndk_version.split('.')
     if minor:
         return minor
     die('Unexpected NDK version string: ' + ndk_version)
-set_config('ANDROID_NDK_MINOR_VERSION', ndk_minor_version);
+set_config('ANDROID_NDK_MINOR_VERSION', ndk_minor_version)
 @depends(target, android_version, ndk, '--help')
 @checking('for android platform directory')
 @imports(_from='os.path', _import='isdir')
 def android_platform(target, android_version, ndk, _):
     if target.os != 'Android':
@@ -126,25 +138,28 @@ def android_platform(target, android_ver
                                 'arch-%s' % target_dir_name)
     if not isdir(platform_dir):
         die("Android platform directory not found. With the current "
             "configuration, it should be in %s" % platform_dir)
     return platform_dir
 add_old_configure_assignment('android_platform', android_platform)
 def extra_toolchain_flags(platform_dir):
     if not platform_dir:
         return []
     return ['-idirafter',
             os.path.join(platform_dir, 'usr', 'include')]
 @depends(target, host, ndk, '--with-android-toolchain', '--help')
 @checking('for the Android toolchain directory', lambda x: x or 'not found')
 @imports(_from='os.path', _import='isdir')
 @imports(_from='mozbuild.shellutil', _import='quote')
 def android_toolchain(target, host, ndk, toolchain, _):
     if not ndk:
     if toolchain:
@@ -170,38 +185,43 @@ def android_toolchain(target, host, ndk,
             toolchain = toolchain_format % (ndk, target_base, version,
                                             host.kernel.lower(), 'x86')
             log.debug('Trying %s' % quote(toolchain))
         if isdir(toolchain):
             return toolchain
         die('You have to specify --with-android-toolchain='
 set_config('ANDROID_TOOLCHAIN', android_toolchain)
 def android_toolchain_prefix_base(target):
     if target.cpu == 'x86':
         # Ideally, the --target should just have the right x86 variant
         # in the first place.
         return 'i686-linux-android'
     return target.toolchain
 @depends(android_toolchain_prefix_base, android_toolchain)
 def android_toolchain_prefix(prefix_base, toolchain):
     if toolchain:
         return '%s/bin/%s-' % (toolchain, prefix_base)
 imply_option('--with-toolchain-prefix', android_toolchain_prefix,
        help='Options compiler should pass for standard C++ library')
 @depends('STLPORT_CPPFLAGS', ndk, '--help')
 @imports(_from='os.path', _import='isdir')
 def stlport_cppflags(value, ndk, _):
     if value and len(value):
         return value
     if not ndk:
@@ -226,25 +246,28 @@ def stlport_cppflags(value, ndk, _):
     # Add android/support/include/ for prototyping long double math
     # functions, locale-specific C library functions, multibyte support,
     # etc.
     return "-I%s -I%s -I%s" % (cxx_include,
                                os.path.join(ndk, 'sources', 'android',
                                             'support', 'include'),
 add_old_configure_assignment('stlport_cppflags', stlport_cppflags)
 @depends(stlport_cppflags, android_platform, android_toolchain,
          android_toolchain_prefix_base, '--help')
 def bindgen_cflags_defaults(stlport_cppflags, android_platform, toolchain,
                             toolchain_prefix, _):
     if not stlport_cppflags:
-    gcc_include = os.path.join(toolchain, 'lib', 'gcc', toolchain_prefix, '4.9')
+    gcc_include = os.path.join(
+        toolchain, 'lib', 'gcc', toolchain_prefix, '4.9')
     cflags_format = "%s -isystem %s -gcc-toolchain %s -I%s -I%s"
     return cflags_format % (stlport_cppflags,
                             os.path.join(android_platform, 'usr', 'include'),
                             os.path.join(gcc_include, 'include'),
                             os.path.join(gcc_include, 'include-fixed'))
--- a/build/moz.configure/checks.configure
+++ b/build/moz.configure/checks.configure
@@ -6,26 +6,29 @@
 # Templates implementing some generic checks.
 # ==============================================================
 # Declare some exceptions. This is cumbersome, but since we shouldn't need a
 # lot of them, let's stack them all here. When adding a new one, put it in the
 # _declare_exceptions template, and add it to the return statement. Then
 # destructure in the assignment below the function declaration.
 @imports(_from='__builtin__', _import='Exception')
 def _declare_exceptions():
     class FatalCheckError(Exception):
         '''An exception to throw from a function decorated with @checking.
         It will result in calling die() with the given message.
         Debugging messages emitted from the decorated function will also be
         printed out.'''
     return (FatalCheckError,)
 (FatalCheckError,) = _declare_exceptions()
 del _declare_exceptions
 # Helper to display "checking" messages
 #   @checking('for foo')
 #   def foo():
 #       return 'foo'
@@ -37,16 +40,18 @@ del _declare_exceptions
 #       return ret
 # This can be combined with e.g. @depends:
 #   @depends(some_option)
 #   @checking('for something')
 #   def check(value):
 #       ...
 # An optional callback can be given, that will be used to format the returned
 # value when displaying it.
 def checking(what, callback=None):
     def decorator(func):
         def wrapped(*args, **kwargs):
             log.info('checking %s... ', what)
             with log.queue_debug():
                 error, ret = None, None
--- a/build/moz.configure/compile-checks.configure
+++ b/build/moz.configure/compile-checks.configure
@@ -63,28 +63,31 @@ def check_header(header, language='C++',
     set_define(header_var, have_header)
     return have_header
 # A convenience wrapper for check_header for checking multiple headers.
 # returns an array of the resulting checks in order corresponding to the
 # provided headers.
 # - `headers` are the headers to be checked.
 # - `kwargs` are keyword arguments passed verbatim to check_header.
 def check_headers(*headers, **kwargs):
     checks = []
     for header in headers:
         checks.append(check_header(header, **kwargs))
     return checks
 def warnings_cflags():
     return []
 def warnings_cxxflags():
     return []
 # Tests whether GCC or clang support the given warning flag, and if it is,
 # add it to the list of warning flags for the build.
 # - `warning` is the warning flag (e.g. -Wfoo)
@@ -144,11 +147,13 @@ def check_and_add_gcc_warning(warning, c
 # Add the given warning to the list of warning flags for the build.
 # - `warning` is the warning flag (e.g. -Wfoo)
 # - `compiler` (optional) is the compiler to add the flag for (c_compiler or
 #   cxx_compiler, from toolchain.configure). When omitted, the warning flag
 #   is added for both compilers.
 # - `when` (optional) is a @depends function or option name conditioning
 #   when the warning flag is wanted.
 def add_gcc_warning(warning, compiler=None, when=None):
     check_and_add_gcc_warning(warning, compiler, when, check=False)
--- a/build/moz.configure/compilers-util.configure
+++ b/build/moz.configure/compilers-util.configure
@@ -1,14 +1,15 @@
 # -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # This Source Code Form is subject to the terms of the Mozilla Public
 # 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/.
 @imports(_from='mozbuild.configure', _import='SandboxDependsFunction')
 def compiler_class(compiler, host_or_target):
     is_target = host_or_target is target
     class Compiler(SandboxDependsFunction):
         # Generates a test program and attempts to compile it. In case of
@@ -49,17 +50,18 @@ def compiler_class(compiler, host_or_tar
             def func(compiler, flags, extra_flags):
                 flags = flags or []
                 if is_target:
                     flags += extra_flags or []
                 if try_invoke_compiler(
-                    compiler.wrapper + [compiler.compiler] + compiler.flags,
-                    compiler.language, source, flags,
-                    onerror=onerror) is not None:
+                        compiler.wrapper +
+                        [compiler.compiler] + compiler.flags,
+                        compiler.language, source, flags,
+                        onerror=onerror) is not None:
                     return True
             return func
     compiler.__class__ = Compiler
     return compiler
--- a/build/moz.configure/headers.configure
+++ b/build/moz.configure/headers.configure
@@ -67,27 +67,32 @@ check_headers(
 # TODO: Move these checks to file specific to --enable-project=js.
 have_perf_event_h = check_header('linux/perf_event.h',
           help='location where the Linux kernel headers can be found',
-passed_linux_header_flags = depends_if('--with-linux-headers')(lambda v: ['-I%s' % v[0]])
+passed_linux_header_flags = depends_if(
+    '--with-linux-headers')(lambda v: ['-I%s' % v[0]])
                      body='return sizeof(__NR_perf_event_open);',
                      check_msg='for perf_event_open system call'),
 def have_perf_event_open(have_perf_event_open):
     if have_perf_event_open:
         return True
 set_config('HAVE_LINUX_PERF_EVENT_H', have_perf_event_open)
 @depends(passed_linux_header_flags, have_perf_event_open)
 def linux_headers_includes(passed_linux_header_flags, have_perf_event_open):
     if have_perf_event_open and passed_linux_header_flags:
         return passed_linux_header_flags[0]
 set_config('LINUX_HEADERS_INCLUDES', linux_headers_includes)
--- a/build/moz.configure/init.configure
+++ b/build/moz.configure/init.configure
@@ -6,16 +6,18 @@
 option(env='DIST', nargs=1, help='DIST directory')
 # Do not allow objdir == srcdir builds.
 # ==============================================================
 @depends('--help', 'DIST')
 @imports(_from='os.path', _import='exists')
 def check_build_environment(help, dist):
     topobjdir = os.path.realpath(os.path.abspath('.'))
     topsrcdir = os.path.realpath(os.path.abspath(
         os.path.join(os.path.dirname(__file__), '..', '..')))
     if dist:
@@ -37,17 +39,17 @@ def check_build_environment(help, dist):
             '  * Building directly in the main source directory is not allowed.\n'
             '  *\n'
             '  * To build, you must run configure from a separate directory\n'
             '  * (referred to as an object directory).\n'
             '  *\n'
             '  * If you are building with a mozconfig, you will need to change your\n'
             '  * mozconfig to point to a different object directory.\n'
             '  ***'
-        )
+            )
     # Check for a couple representative files in the source tree
     conflict_files = [
         '*         %s' % f for f in ('Makefile', 'config/autoconf.mk')
         if exists(os.path.join(topsrcdir, f))
     if conflict_files:
         die('  ***\n'
@@ -56,20 +58,21 @@ def check_build_environment(help, dist):
             '  *   This indicates that you previously built in the source tree.\n'
             '  *   A source tree build can confuse the separate objdir build.\n'
             '  *\n'
             '  *   To clean up the source tree:\n'
             '  *     1. cd %s\n'
             '  *     2. gmake distclean\n'
             '  ***'
             % ('\n  '.join(conflict_files), topsrcdir)
-        )
+            )
     return result
 set_config('TOPSRCDIR', check_build_environment.topsrcdir)
 set_config('TOPOBJDIR', check_build_environment.topobjdir)
 set_config('MOZ_BUILD_ROOT', check_build_environment.topobjdir)
 set_config('DIST', check_build_environment.dist)
     '_topsrcdir', check_build_environment.topsrcdir)
@@ -86,29 +89,33 @@ set_config('MOZ_AUTOMATION', depends_if(
 option(env='OLD_CONFIGURE', nargs=1, help='Path to the old configure script')
 option(env='MOZ_CURRENT_PROJECT', nargs=1, help='Current build project')
 option(env='MOZCONFIG', nargs=1, help='Mozconfig location')
 option('--with-external-source-dir', env='EXTERNAL_SOURCE_DIR', nargs=1,
        help='External directory containing additional build files')
 def external_source_dir(value):
     if value:
         return value[0]
 set_config('EXTERNAL_SOURCE_DIR', external_source_dir)
 add_old_configure_assignment('EXTERNAL_SOURCE_DIR', external_source_dir)
 # Read user mozconfig
 # ==============================================================
 # Note: the dependency on --help is only there to always read the mozconfig,
 # even when --help is passed. Without this dependency, the function wouldn't
 # be called when --help is passed, and the mozconfig wouldn't be read.
          check_build_environment, '--with-external-source-dir',
 @imports(_from='mozbuild.mozconfig', _import='MozconfigLoader')
 def mozconfig(current_project, mozconfig, old_configure, build_env,
               external_source_dir, help):
     if not old_configure:
         die('The OLD_CONFIGURE environment variable must be set')
@@ -138,23 +145,26 @@ def mozconfig(current_project, mozconfig
     loader = MozconfigLoader(topsrcdir)
     current_project = current_project[0] if current_project else None
     mozconfig = mozconfig[0] if mozconfig else None
     mozconfig = loader.find_mozconfig(env={'MOZCONFIG': mozconfig})
     mozconfig = loader.read_mozconfig(mozconfig, moz_build_app=current_project)
     return mozconfig
 set_config('MOZCONFIG', depends(mozconfig)(lambda m: m['path']))
 option(env='PYTHON', nargs=1, help='Python interpreter')
 # Setup python virtualenv
 # ==============================================================
 @depends('PYTHON', check_build_environment, mozconfig, '--help')
 @imports(_from='mozbuild.configure.util', _import='LineIO')
 @imports(_from='mozbuild.virtualenv', _import='VirtualenvManager')
 @imports(_from='mozbuild.virtualenv', _import='verify_python_version')
@@ -188,17 +198,18 @@ def virtualenv_python(env_python, build_
             topsrcdir, topobjdir,
             os.path.join(topobjdir, '_virtualenv'), out,
             os.path.join(topsrcdir, 'build', 'virtualenv_packages.txt'))
     if python:
         # If we're not in the virtualenv, we need the which module for
         # find_program.
         if normsep(sys.executable) != normsep(manager.python_path):
-            sys.path.append(os.path.join(topsrcdir, 'third_party', 'python', 'which'))
+            sys.path.append(os.path.join(
+                topsrcdir, 'third_party', 'python', 'which'))
         found_python = find_program(python)
         if not found_python:
             die('The PYTHON environment variable does not contain '
                 'a valid path. Cannot find %s', python)
         python = found_python
         python = sys.executable
@@ -217,37 +228,42 @@ def virtualenv_python(env_python, build_
         sys.exit(subprocess.call([python] + sys.argv))
     # We are now in the virtualenv
     if not distutils.sysconfig.get_python_lib():
         die('Could not determine python site packages directory')
     return python
 set_config('PYTHON', virtualenv_python)
 add_old_configure_assignment('PYTHON', virtualenv_python)
 # Inject mozconfig options
 # ==============================================================
 # All options defined above this point can't be injected in mozconfig_options
 # below, so collect them.
 def early_options():
     def early_options():
         return set(
             for option in __sandbox__._options.itervalues()
             if option.env
     return early_options
 early_options = early_options()
 @depends(mozconfig, 'MOZ_AUTOMATION', '--help')
 # This gives access to the sandbox. Don't copy this blindly.
 def mozconfig_options(mozconfig, automation, help):
     if mozconfig['path']:
         if 'MOZ_AUTOMATION_MOZCONFIG' in mozconfig['env']['added']:
             if not automation:
@@ -288,16 +304,18 @@ def mozconfig_options(mozconfig, automat
 # ==============================================================
 option(env='MOZILLABUILD', nargs=1,
        help='Path to Mozilla Build (Windows-only)')
 option(env='CONFIG_SHELL', nargs=1, help='Path to a POSIX shell')
 # It feels dirty replicating this from python/mozbuild/mozbuild/mozconfig.py,
 # but the end goal being that the configure script would go away...
 @checking('for a shell')
 def shell(value, mozillabuild):
     if value:
         return find_program(value[0])
     shell = 'sh'
     if mozillabuild:
@@ -307,16 +325,17 @@ def shell(value, mozillabuild):
     return find_program(shell)
 # Python 3
 # ========
 option(env='PYTHON3', nargs=1, help='Python 3 interpreter (3.5 or later)')
 @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='mozbuild.pythonutil', _import='find_python3_executable')
 @imports(_from='mozbuild.pythonutil', _import='python_executable_version')
 def python3(env_python):
     python = env_python[0] if env_python else None
@@ -343,68 +362,75 @@ def python3(env_python):
         python = python.decode('utf-8')
     return namespace(
         str_version='.'.join(str(v) for v in version),
 set_config('PYTHON3', depends_if(python3)(lambda p: p.path))
 set_config('PYTHON3_VERSION', depends_if(python3)(lambda p: p.str_version))
 # Source checkout and version control integration.
 # ================================================
 @depends(check_build_environment, 'MOZ_AUTOMATION', '--help')
 @checking('for vcs source checkout')
 def vcs_checkout_type(build_env, automation, _):
     if os.path.exists(os.path.join(build_env.topsrcdir, '.hg')):
         return 'hg'
     elif os.path.exists(os.path.join(build_env.topsrcdir, '.git')):
         return 'git'
     elif automation:
         raise FatalCheckError('unable to resolve VCS type; must run '
                               'from a source checkout when MOZ_AUTOMATION '
                               'is set')
 # Resolve VCS binary for detected repository type.
 # TODO remove hg.exe once bug 1382940 addresses ambiguous executables case.
 hg = check_prog('HG', ('hg.exe', 'hg',), allow_missing=True,
                 when=depends(vcs_checkout_type)(lambda x: x == 'hg'))
 git = check_prog('GIT', ('git',), allow_missing=True,
                  when=depends(vcs_checkout_type)(lambda x: x == 'git'))
 @checking('for Mercurial version')
 def hg_version(hg):
     # HGPLAIN in Mercurial 1.5+ forces stable output, regardless of set
     # locale or encoding.
     env = dict(os.environ)
     env['HGPLAIN'] = '1'
     out = check_cmd_output(hg, '--version', env=env)
     match = re.search(r'Mercurial Distributed SCM \(version ([^\)]+)', out)
     if not match:
-        raise FatalCheckError('unable to determine Mercurial version: %s' % out)
+        raise FatalCheckError(
+            'unable to determine Mercurial version: %s' % out)
     # The version string may be "unknown" for Mercurial run out of its own
     # source checkout or for bad builds. But LooseVersion handles it.
     return Version(match.group(1))
 # Resolve Mercurial config items so other checks have easy access.
 # Do NOT set this in the config because it may contain sensitive data
 # like API keys.
 @depends_all(check_build_environment, hg, hg_version)
 def hg_config(build_env, hg, version):
     env = dict(os.environ)
     env['HGPLAIN'] = '1'
     # Warnings may get sent to stderr. But check_cmd_output() ignores
     # stderr if exit code is 0. And the command should always succeed if
@@ -425,32 +451,35 @@ def hg_config(build_env, hg, version):
     config = {}
     for line in out.strip().splitlines():
         key, value = [s.strip() for s in line.split('=', 1)]
         config[key] = value
     return config
 @checking('for Git version')
 def git_version(git):
     out = check_cmd_output(git, '--version').rstrip()
     match = re.search('git version (.*)$', out)
     if not match:
         raise FatalCheckError('unable to determine Git version: %s' % out)
     return Version(match.group(1))
 # Only set VCS_CHECKOUT_TYPE if we resolved the VCS binary.
 # Require resolved VCS info when running in automation so automation's
 # environment is more well-defined.
 @depends(vcs_checkout_type, hg_version, git_version, 'MOZ_AUTOMATION')
 def exposed_vcs_checkout_type(vcs_checkout_type, hg, git, automation):
     if vcs_checkout_type == 'hg':
         if hg:
             return 'hg'
         if automation:
             raise FatalCheckError('could not resolve Mercurial binary info')
@@ -459,44 +488,50 @@ def exposed_vcs_checkout_type(vcs_checko
         if git:
             return 'git'
         if automation:
             raise FatalCheckError('could not resolve Git binary info')
     elif vcs_checkout_type:
         raise FatalCheckError('unhandled VCS type: %s' % vcs_checkout_type)
 set_config('VCS_CHECKOUT_TYPE', exposed_vcs_checkout_type)
 # Obtain a Repository interface for the current VCS repository.
 @depends(check_build_environment, exposed_vcs_checkout_type, hg, git)
 @imports(_from='mozversioncontrol', _import='get_repository_object')
 def vcs_repository(build_env, vcs_checkout_type, hg, git):
     if vcs_checkout_type == 'hg':
         return get_repository_object(build_env.topsrcdir, hg=hg)
     elif vcs_checkout_type == 'git':
         return get_repository_object(build_env.topsrcdir, git=git)
     elif vcs_checkout_type:
         raise FatalCheckError('unhandled VCS type: %s' % vcs_checkout_type)
 @checking('for sparse checkout')
 def vcs_sparse_checkout(repo):
     return repo.sparse_checkout_present()
 set_config('VCS_SPARSE_CHECKOUT', vcs_sparse_checkout)
 # Host and target systems
 # ==============================================================
 option('--host', nargs=1, help='Define the system type performing the build')
 option('--target', nargs=1,
        help='Define the system type where the resulting executables will be '
 @imports(_from='mozbuild.configure.constants', _import='CPU')
 @imports(_from='mozbuild.configure.constants', _import='CPU_bitness')
 @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')
 def split_triplet(triplet, allow_unknown=False):
@@ -659,72 +694,83 @@ def host(value, shell):
         config_guess = os.path.join(os.path.dirname(__file__), '..',
                                     'autoconf', 'config.guess')
         host = subprocess.check_output([shell, config_guess]).strip()
         host = value[0]
     return split_triplet(config_sub(shell, host))
 host = help_host_target | host
 @depends('--target', host, shell)
 @checking('for target system type', lambda t: t.alias)
 def target(value, host, shell):
     if not value:
         return host
     return split_triplet(config_sub(shell, value[0]))
 target = help_host_target | target
 @depends(host, target)
 @checking('whether cross compiling')
 def cross_compiling(host, target):
     return host != target
 set_config('CROSS_COMPILE', cross_compiling)
 set_define('CROSS_COMPILE', cross_compiling)
 add_old_configure_assignment('CROSS_COMPILE', cross_compiling)
 def have_64_bit(target):
     if target.bitness == 64:
         return True
 set_config('HAVE_64BIT_BUILD', have_64_bit)
 set_define('HAVE_64BIT_BUILD', have_64_bit)
 add_old_configure_assignment('HAVE_64BIT_BUILD', have_64_bit)
 def host_os_kernel_major_version(host):
     versions = host.raw_os.split('.')
     version = ''.join(x for x in versions[0] if x.isdigit())
     return version
 set_config('HOST_MAJOR_VERSION', host_os_kernel_major_version)
 # Autoconf needs these set
 def host_for_old_configure(host):
     return '--host=%s' % host.alias
 def target_for_old_configure(target):
     target_alias = target.alias
     # old-configure does plenty of tests against $target and $target_os
     # and expects darwin for iOS, so make it happy.
     if target.os == 'iOS':
         target_alias = target_alias.replace('-ios', '-darwin')
     return '--target=%s' % target_alias
 # These variables are for compatibility with the current moz.builds and
 # old-configure. Eventually, we'll want to canonicalize better.
 def target_variables(target):
     if target.kernel == 'kFreeBSD':
@@ -745,16 +791,17 @@ def target_variables(target):
     return namespace(
         INTEL_ARCHITECTURE=target.cpu in ('x86', 'x86_64') or None,
 set_config('OS_TARGET', target_variables.OS_TARGET)
 set_config('OS_ARCH', target_variables.OS_ARCH)
 set_config('OS_TEST', target_variables.OS_TEST)
@@ -771,95 +818,114 @@ def host_variables(host):
     if host.kernel == 'kFreeBSD':
         os_arch = 'GNU_kFreeBSD'
         os_arch = host.kernel
     return namespace(
 set_config('HOST_CPU_ARCH', host.cpu)
 set_config('HOST_OS_ARCH', host_variables.HOST_OS_ARCH)
 def target_is_windows(target):
     if target.kernel == 'WINNT':
         return True
 set_define('_WINDOWS', target_is_windows)
 set_define('WIN32', target_is_windows)
 set_define('XP_WIN', target_is_windows)
 set_define('XP_WIN32', target_is_windows)
 def target_is_unix(target):
     if target.kernel != 'WINNT':
         return True
 set_define('XP_UNIX', target_is_unix)
 def target_is_darwin(target):
     if target.kernel == 'Darwin':
         return True
 set_define('XP_DARWIN', target_is_darwin)
 def target_is_ios(target):
     if target.kernel == 'Darwin' and target.os == 'iOS':
         return True
 set_define('XP_IOS', target_is_ios)
 def target_is_osx(target):
     if target.kernel == 'Darwin' and target.os == 'OSX':
         return True
 set_define('XP_MACOSX', target_is_osx)
 def target_is_linux(target):
     if target.kernel == 'Linux':
         return True
 set_define('XP_LINUX', target_is_linux)
 def target_is_solaris(target):
     if target.kernel == 'SunOS':
         return True
 set_define('XP_SOLARIS', target_is_solaris)
 # The application/project to build
 # ==============================================================
 option('--enable-application', nargs=1, env='MOZ_BUILD_APP',
        help='Application to build. Same as --enable-project.')
 @depends('--enable-application', '--help')
 def application(app, help):
     if app:
         return app
 imply_option('--enable-project', application)
 @depends(check_build_environment, '--help')
 def default_project(build_env, help):
     if build_env.topobjdir.endswith('/js/src'):
         return 'js'
     return 'browser'
 option('--enable-project', nargs=1, default=default_project,
        help='Project to build')
 @depends('--enable-project', '--with-external-source-dir',
          check_build_environment, '--help')
 @imports(_from='os.path', _import='exists')
 def include_project_configure(project, external_source_dir, build_env, help):
     if not project:
         die('--enable-project is required.')
     base_dir = build_env.topsrcdir
@@ -873,16 +939,17 @@ def include_project_configure(project, e
 @depends(include_project_configure, check_build_environment, '--help')
 def build_project(include_project_configure, build_env, help):
     ret = os.path.dirname(os.path.relpath(include_project_configure,
     return ret
 set_config('MOZ_BUILD_APP', build_project)
 set_define('MOZ_BUILD_APP', build_project)
 add_old_configure_assignment('MOZ_BUILD_APP', build_project)
 # set RELEASE_OR_BETA and NIGHTLY_BUILD variables depending on the cycle we're in
 # The logic works like this:
 # - if we have "a1" in GRE_MILESTONE, we're building Nightly (define NIGHTLY_BUILD)
@@ -903,16 +970,17 @@ def milestone(build_env, _):
         is_nightly = True
     elif 'a' not in milestone:
         is_release_or_beta = True
     return namespace(version=milestone,
 set_config('GRE_MILESTONE', milestone.version)
 set_config('NIGHTLY_BUILD', milestone.is_nightly)
 set_define('NIGHTLY_BUILD', milestone.is_nightly)
 add_old_configure_assignment('NIGHTLY_BUILD', milestone.is_nightly)
 set_config('RELEASE_OR_BETA', milestone.is_release_or_beta)
 set_define('RELEASE_OR_BETA', milestone.is_release_or_beta)
@@ -920,22 +988,24 @@ add_old_configure_assignment('RELEASE_OR
 # The app update channel is 'default' when not supplied. The value is used in
 # the application's confvars.sh (and is made available to a project specific
 # moz.configure).
        help='Select application update channel',
 def update_channel(channel):
     if channel[0] == '':
         return 'default'
     return channel[0].lower()
 set_config('MOZ_UPDATE_CHANNEL', update_channel)
 set_define('MOZ_UPDATE_CHANNEL', update_channel)
 add_old_configure_assignment('MOZ_UPDATE_CHANNEL', update_channel)
 # A template providing a shorthand for setting a variable. The created
 # option will only be settable with imply_option.
 # It is expected that a project-specific moz.configure will call imply_option
@@ -944,17 +1014,18 @@ add_old_configure_assignment('MOZ_UPDATE
 # will additionally cause the variable to be set using set_define and
 # add_old_configure_assignment. util.configure would be an appropriate place for
 # this, but it uses add_old_configure_assignment, which is defined in this file.
 def project_flag(env=None, set_for_old_configure=False,
                  set_as_define=False, **kwargs):
     if not env:
-        configure_error("A project_flag must be passed a variable name to set.")
+        configure_error(
+            "A project_flag must be passed a variable name to set.")
     opt = option(env=env, possible_origins=('implied',), **kwargs)
     def option_implementation(value):
         if value:
             if len(value):
                 return value
@@ -962,22 +1033,26 @@ def project_flag(env=None, set_for_old_c
     set_config(env, option_implementation)
     if set_as_define:
         set_define(env, option_implementation)
     if set_for_old_configure:
         add_old_configure_assignment(env, option_implementation)
 # milestone.is_nightly corresponds to cases NIGHTLY_BUILD is set.
 @depends(milestone, '--help')
 def enabled_in_nightly(milestone, _):
     return milestone.is_nightly
 # Set the MOZ_CONFIGURE_OPTIONS variable with all the options that
 # were passed somehow (environment, command line, mozconfig)
 @imports(_from='mozbuild.shellutil', _import='quote')
 def all_configure_options():
     result = []
     previous = None
     for option in __sandbox__._options.itervalues():
         # __sandbox__._options contains items for both option.name and
@@ -999,16 +1074,17 @@ def all_configure_options():
         # because we don't know their actual defaults. (Keep the conditions
         # separate for ease of understanding and ease of removal)
         elif (option.help == 'Help missing for old configure options' and
                 option in __sandbox__._raw_options):
     return quote(*result)
 set_config('MOZ_CONFIGURE_OPTIONS', all_configure_options)
 # This is temporary until js/src/configure and configure are merged.
 # Use instead of option() in js/moz.configure and more generally, for
 # options that are shared between configure and js/src/configure.
 def js_option(*args, **kwargs):
--- a/build/moz.configure/java.configure
+++ b/build/moz.configure/java.configure
@@ -5,58 +5,64 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 # Java detection
 # ========================================================
 option('--with-java-bin-path', nargs=1,
        help='Location of Java binaries (java, javac, jar)')
 @imports(_from='os', _import='environ')
 def java_search_paths(path):
     if path:
         # Look for javac and jar in the specified path.
         return path
     # With no path specified, look for javac and jar in $JAVA_HOME (if set)
     # and $PATH.
     if 'JAVA_HOME' in environ:
         return [os.path.join(environ['JAVA_HOME'], 'bin'),
                 environ.get('PATH', '')]
     return [environ.get('PATH')]
 # Finds the given java tool, failing with a custom error message if we can't
 # find it.
 def check_java_tool(tool):
     check = check_prog(tool.upper(), (tool,), paths=java_search_paths,
     def require_tool(result):
         if result is None:
             die("The program %s was not found.  Set $JAVA_HOME to your Java "
                 "SDK directory or use '--with-java-bin-path={java-bin-dir}'"
                 % tool)
         return result
     return require_tool
 javac = check_java_tool('javac')
 @checking('for javac version')
 def javac_version(javac):
         output = subprocess.check_output([javac, '-version'],
         version = Version(output.split(' ')[-1])
         if version < '1.8':
-            die('javac 1.8 or higher is required (found %s). Check the JAVA_HOME environment variable.' % version)
+            die('javac 1.8 or higher is required (found %s). '
+                'Check the JAVA_HOME environment variable.' % version)
         return version
     except subprocess.CalledProcessError as e:
         die('Failed to get javac version: %s', e.output)
--- a/build/moz.configure/keyfiles.configure
+++ b/build/moz.configure/keyfiles.configure
@@ -54,12 +54,11 @@ def id_and_secret_keyfile(desc, default=
     content = keyfile(desc, help='Use the client id and secret key contained '
                                  'in the given keyfile for %s requests' % desc,
     name = desc.upper().replace(' ', '_')
     set_config('MOZ_%s_CLIENTID' % name, content.id)
     set_config('MOZ_%s_KEY' % name, content.secret)
--- a/build/moz.configure/memory.configure
+++ b/build/moz.configure/memory.configure
@@ -8,16 +8,17 @@
 def moz_jemalloc4(value):
     die('MOZ_JEMALLOC4 is deprecated')
 option('--enable-jemalloc', env='MOZ_MEMORY',
        help='Replace memory allocator with jemalloc')
 @depends('--enable-jemalloc', target, build_project, c_compiler)
 def jemalloc(value, target, build_project, c_compiler):
     if value.origin != 'default':
         return bool(value) or None
     if build_project == 'js':
         return True
@@ -43,27 +44,30 @@ add_old_configure_assignment('MOZ_MEMORY
 # Because --enable-jemalloc doesn't use a default because of the dependency
 # on the target, we can't use a js_option for it to propagate to js/src
 # through the old-configure.
 def jemalloc_for_old_configure(jemalloc):
     return '--%s-jemalloc' % ('enable' if jemalloc else 'disable')
        help='Enable ability to dynamically replace the malloc implementation')
 @depends('--enable-replace-malloc', jemalloc, milestone, build_project)
 def replace_malloc(value, jemalloc, milestone, build_project):
     # Enable on central for the debugging opportunities it adds.
     if value and not jemalloc:
         die('--enable-replace-malloc requires --enable-jemalloc')
     if value.origin != 'default':
         return bool(value) or None
     if milestone.is_nightly and jemalloc and build_project != 'js':
         return True
 set_config('MOZ_REPLACE_MALLOC', replace_malloc)
 set_define('MOZ_REPLACE_MALLOC', replace_malloc)
 add_old_configure_assignment('MOZ_REPLACE_MALLOC', replace_malloc)
--- a/build/moz.configure/old.configure
+++ b/build/moz.configure/old.configure
@@ -1,23 +1,25 @@
 # -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # This Source Code Form is subject to the terms of the Mozilla Public
 # 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/.
 def encoded_open(path, mode):
     encoding = 'mbcs' if sys.platform == 'win32' else 'utf-8'
     return codecs.open(path, mode, encoding)
 option(env='AUTOCONF', nargs=1, help='Path to autoconf 2.13')
 @depends(mozconfig, 'AUTOCONF')
 @checking('for autoconf')
 @imports(_from='os.path', _import='exists')
 def autoconf(mozconfig, autoconf):
     mozconfig_autoconf = None
     if mozconfig['path']:
         make_extra = mozconfig['make_extra']
@@ -51,16 +53,17 @@ def autoconf(mozconfig, autoconf):
     if not autoconf:
         die('Could not find autoconf 2.13')
     if not exists(autoconf):
         die('Could not find autoconf 2.13 at %s', autoconf)
     return autoconf
 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')
@@ -112,18 +115,19 @@ def prepare_configure(old_configure, moz
         script = script.replace('>./config.log', '>>./config.log')
         with open(old_configure, 'wb') as fh:
     cmd = [shell, old_configure]
     with encoded_open('old-configure.vars', 'w') as out:
         log.debug('Injecting the following to old-configure:')
         def inject(command):
-            print(command, file=out)
+            print(command, file=out) # noqa Python 2vs3
             log.debug('| %s', command)
         if mozconfig['path']:
             for key, value in mozconfig['vars']['added'].items():
                 inject("%s=%s" % (key, quote(value)))
             for key, (old, value) in mozconfig['vars']['modified'].items():
                 inject("%s=%s" % (key, quote(value)))
             for t in ('env', 'vars'):
@@ -355,17 +359,17 @@ def old_configure(prepare_configure, ext
     raw_config = {}
     with encoded_open('config.data', 'r') as fh:
         code = compile(fh.read(), 'config.data', 'exec')
         # 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
+        exec code in raw_config # noqa
     # Ensure all the flags known to old-configure appear in the
     # @old_configure_options above.
     all_options = set(all_options)
     for flag in raw_config['flags']:
         if flag not in all_options:
             die('Missing option in `@old_configure_options` in %s: %s',
                 __file__, flag)
@@ -379,16 +383,18 @@ def old_configure(prepare_configure, ext
 # set_config is only available in the global namespace, not directly in
 # @depends functions, but we do need to enumerate the result of
 # old_configure, so we cheat.
 def set_old_configure_config(name, value):
     __sandbox__.set_config_impl(name, value)
 # Same as set_old_configure_config, but for set_define.
 def set_old_configure_define(name, value):
     __sandbox__.set_define_impl(name, value)
 def post_old_configure(raw_config):
--- a/build/moz.configure/pkg.configure
+++ b/build/moz.configure/pkg.configure
@@ -1,21 +1,24 @@
 # -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # This Source Code Form is subject to the terms of the Mozilla Public
 # 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/.
 def pkg_config(compile_env):
     if compile_env:
         return ('pkg-config',)
 pkg_config = check_prog('PKG_CONFIG', pkg_config, allow_missing=True)
 @checking('for pkg-config version')
 def pkg_config_version(pkg_config):
     return Version(check_cmd_output(pkg_config, '--version').rstrip())
 # Locates the given module using pkg-config.
 # - `var` determines the name of variables to set when the package is found.
@@ -24,16 +27,18 @@ def pkg_config_version(pkg_config):
 #   strings describing packages to locate, or depends function that will
 #   resolve to such a string or list of strings.
 # - `when` a depends function that will determine whether to perform
 #   any checks (default is to always perform checks).
 # - `allow_missing` If set, failure to fulfill the package description
 #   will not result in an error or logged message, and any error message
 #   will be returned to the caller.
 #   Returns `True` when the package description is fulfilled.
 def pkg_check_modules(var, package_desc, when=always,
     if isinstance(package_desc, (tuple, list)):
         package_desc = ' '.join(package_desc)
     package_desc = dependable(package_desc)
     @depends(when, '--enable-compile-environment')
--- a/build/moz.configure/rust.configure
+++ b/build/moz.configure/rust.configure
@@ -4,26 +4,28 @@
 # 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/.
 # Rust is required by `rust_compiler` below. We allow_missing here
 # to propagate failures to the better error message there.
 rustc = check_prog('RUSTC', ['rustc'], allow_missing=True)
 cargo = check_prog('CARGO', ['cargo'], allow_missing=True)
 @checking('rustc version', lambda info: info.version)
 def rustc_info(rustc):
     out = check_cmd_output(rustc, '--version', '--verbose').splitlines()
     info = dict((s.strip() for s in line.split(':', 1)) for line in out[1:])
     return namespace(
         version=Version(info.get('release', '0')),
         commit=info.get('commit-hash', 'unknown'),
 @checking('cargo version', lambda info: info.version)
 def cargo_info(cargo):
     out = check_cmd_output(cargo, '--version', '--verbose').splitlines()
     info = dict((s.strip() for s in line.split(':', 1)) for line in out[1:])
     version = info.get('release')
     # Older versions of cargo didn't support --verbose, in which case, they
@@ -38,16 +40,17 @@ def cargo_info(cargo):
         if not m:
             die('Could not determine cargo version from output: %s', out)
         version = m.group(1)
     return namespace(
 @depends(rustc_info, cargo_info)
 @imports(_from='textwrap', _import='dedent')
 def rust_compiler(rustc_info, cargo_info):
     if not rustc_info:
         Rust compiler not found.
         To compile rust language sources, you must have 'rustc' in your path.
         See https://www.rust-lang.org/ for more information.
@@ -168,17 +171,18 @@ def rust_triple_alias(host_or_target):
         rustc_target = rust_supported_targets.per_os.get(
             (host_or_target.cpu, host_or_target_os))
         if rustc_target is None:
             rustc_target = rust_supported_targets.per_raw_os.get(
                 (host_or_target.cpu, host_or_target_raw_os))
         if rustc_target is None:
-            die("Don't know how to translate {} for rustc".format(host_or_target.alias))
+            die("Don't know how to translate {} for rustc".format(
+                host_or_target.alias))
         # Check to see whether our rustc has a reasonably functional stdlib
         # for our chosen target.
         target_arg = '--target=' + rustc_target.alias
         in_fd, in_path = mkstemp(prefix='conftest', suffix='.rs')
         out_fd, out_path = mkstemp(prefix='conftest', suffix='.rlib')
@@ -192,16 +196,17 @@ def rust_triple_alias(host_or_target):
             cmd = [
                 '--crate-type', 'staticlib',
                 '-o', out_path,
             def failed():
                 Cannot compile for {} with {}
                 The target may be unsupported, or you may not have
                 a rust std library for that target installed. Try:
                   rustup target add {}
                 '''.format(host_or_target.alias, rustc, rustc_target.alias)))
@@ -212,25 +217,28 @@ def rust_triple_alias(host_or_target):
         # This target is usable.
         return rustc_target.alias
     return rust_target
 rust_target_triple = rust_triple_alias(target)
 rust_host_triple = rust_triple_alias(host)
 set_config('RUST_TARGET', rust_target_triple)
 set_config('RUST_HOST_TARGET', rust_host_triple)
 def rust_target_env_name(triple):
-    return triple.upper().replace('-','_')
+    return triple.upper().replace('-', '_')
 # We need this to form various Cargo environment variables, as there is no
 # uppercase function in make, and we don't want to shell out just for
 # converting a string to uppercase.
 set_config('RUST_TARGET_ENV_NAME', rust_target_env_name)
 # This is used for putting source info into symbol files.
 set_config('RUSTC_COMMIT', depends(rustc_info)(lambda i: i.commit))
--- a/build/moz.configure/toolchain.configure
+++ b/build/moz.configure/toolchain.configure
@@ -10,32 +10,35 @@ option(env='MOZ_PGO', help='Build with p
 set_config('MOZ_PGO', depends('MOZ_PGO')(lambda x: bool(x)))
 add_old_configure_assignment('MOZ_PGO', depends('MOZ_PGO')(lambda x: bool(x)))
 # yasm detection
 # ==============================================================
 yasm = check_prog('YASM', ['yasm'], allow_missing=True)
 @checking('yasm version')
 def yasm_version(yasm):
     version = check_cmd_output(
         yasm, '--version',
         onerror=lambda: die('Failed to get yasm version.')
     return Version(version)
 # Until we move all the yasm consumers out of old-configure.
 # bug 1257904
 @depends(yasm, target)
 def yasm_asflags(yasm, target):
     if yasm:
         asflags = {
             ('OSX', 'x86'): '-f macho32',
             ('OSX', 'x86_64'): '-f macho64',
             ('WINNT', 'x86'): '-f win32',
             ('WINNT', 'x86_64'): '-f x64',
@@ -46,43 +49,49 @@ def yasm_asflags(yasm, target):
             if target.cpu == 'x86':
                 asflags = '-f elf32'
             elif target.cpu == 'x86_64':
                 asflags = '-f elf64'
         if asflags:
             asflags += ' -rnasm -pnasm'
         return asflags
 set_config('YASM_ASFLAGS', yasm_asflags)
 def have_yasm(value):
     if value:
         return True
 set_config('HAVE_YASM', have_yasm)
 # Until the YASM variable is not necessary in old-configure.
 add_old_configure_assignment('YASM', have_yasm)
 # Android NDK
 # ==============================================================
 @depends('--disable-compile-environment', build_project, '--help')
 def compiling_android(compile_env, build_project, _):
     return compile_env and build_project in ('mobile/android', 'js')
 include('android-ndk.configure', when=compiling_android)
 # MacOS deployment target version
 # ==============================================================
 # This needs to happen before any compilation test is done.
 option('--enable-macos-target', env='MACOSX_DEPLOYMENT_TARGET', nargs=1,
        default='10.7', help='Set the minimum MacOS version needed at runtime')
 @depends('--enable-macos-target', target)
 @imports(_from='os', _import='environ')
 def macos_target(value, target):
     if value and target.os == 'OSX':
         # Ensure every compiler process we spawn uses this value.
         environ['MACOSX_DEPLOYMENT_TARGET'] = value[0]
         return value[0]
     if value and value.origin != 'default':
@@ -92,17 +101,18 @@ def macos_target(value, target):
 set_config('MACOSX_DEPLOYMENT_TARGET', macos_target)
 add_old_configure_assignment('MACOSX_DEPLOYMENT_TARGET', macos_target)
 # Xcode state
 # ===========
-       help='Do not check that Xcode is installed and properly configured')
+          help='Do not check that Xcode is installed and properly configured')
 @depends(host, '--disable-xcode-checks')
 def xcode_path(host, xcode_checks):
     if host.kernel != 'Darwin' or not xcode_checks:
     # xcode-select -p prints the path to the installed Xcode. It
     # should exit 0 and return non-empty result if Xcode is installed.
@@ -122,71 +132,83 @@ def xcode_path(host, xcode_checks):
     # Now look for the Command Line Tools.
     def no_cltools():
         die('Could not find installed Xcode Command Line Tools; '
             'run `xcode-select --install` and follow the instructions '
             'to install them then try again; if you wish to build without '
             'Xcode Command Line Tools installed, '
             'add the --disable-xcode-checks configure flag')
-    res = check_cmd_output('pkgutil', '--pkg-info',
-                           'com.apple.pkg.CLTools_Executables',
-                            onerror=no_cltools)
+    check_cmd_output('pkgutil', '--pkg-info',
+                     'com.apple.pkg.CLTools_Executables',
+                     onerror=no_cltools)
     return xcode_path
 set_config('XCODE_PATH', xcode_path)
 # Compiler wrappers
 # ==============================================================
 # Normally, we'd use js_option and automatically have those variables
 # propagated to js/src, but things are complicated by possible additional
 # wrappers in CC/CXX, and by other subconfigures that do not handle those
 # options and do need CC/CXX altered.
 option('--with-compiler-wrapper', env='COMPILER_WRAPPER', nargs=1,
        help='Enable compiling with wrappers such as distcc and ccache')
 option('--with-ccache', env='CCACHE', nargs='?',
        help='Enable compiling with ccache')
 def ccache(value):
     if len(value):
         return value
     # If --with-ccache was given without an explicit value, we default to
     # 'ccache'.
     return 'ccache'
 ccache = check_prog('CCACHE', progs=(), input=ccache)
 # Distinguish ccache from sccache.
 def ccache_is_sccache(ccache):
     return check_cmd_output(ccache, '--version').startswith('sccache')
 @depends(ccache, ccache_is_sccache)
 def using_ccache(ccache, ccache_is_sccache):
     return ccache and not ccache_is_sccache
 @depends_if(ccache, ccache_is_sccache)
 def using_sccache(ccache, ccache_is_sccache):
     return ccache and ccache_is_sccache
 set_config('MOZ_USING_CCACHE', using_ccache)
 set_config('MOZ_USING_SCCACHE', using_sccache)
-option(env='SCCACHE_VERBOSE_STATS', help='Print verbose sccache stats after build')
+       help='Print verbose sccache stats after build')
 @depends(using_sccache, 'SCCACHE_VERBOSE_STATS')
 def sccache_verbose_stats(using_sccache, verbose_stats):
     return using_sccache and bool(verbose_stats)
 set_config('SCCACHE_VERBOSE_STATS', sccache_verbose_stats)
 @depends('--with-compiler-wrapper', ccache)
 @imports(_from='mozbuild.shellutil', _import='split', _as='shell_split')
 def compiler_wrapper(wrapper, ccache):
     if wrapper:
         raw_wrapper = wrapper[0]
         wrapper = shell_split(raw_wrapper)
         wrapper_program = find_program(wrapper[0])
         if not wrapper_program:
@@ -197,68 +219,78 @@ def compiler_wrapper(wrapper, ccache):
     if ccache:
         if wrapper:
             return tuple([ccache] + wrapper)
             return (ccache,)
     elif wrapper:
         return tuple(wrapper)
 add_old_configure_assignment('COMPILER_WRAPPER', compiler_wrapper)
 def using_compiler_wrapper(compiler_wrapper):
     return True
 set_config('MOZ_USING_COMPILER_WRAPPER', using_compiler_wrapper)
 # GC rooting and hazard analysis.
 # ==============================================================
 option(env='MOZ_HAZARD', help='Build for the GC rooting hazard analysis')
 def hazard_analysis(value):
     if value:
         return True
 set_config('MOZ_HAZARD', hazard_analysis)
 # Cross-compilation related things.
 # ==============================================================
 js_option('--with-toolchain-prefix', env='TOOLCHAIN_PREFIX', nargs=1,
           help='Prefix for the target toolchain')
 @depends('--with-toolchain-prefix', target, cross_compiling)
 def toolchain_prefix(value, target, cross_compiling):
     if value:
         return tuple(value)
     if cross_compiling:
         return ('%s-' % target.toolchain, '%s-' % target.alias)
 @depends(toolchain_prefix, target)
 def first_toolchain_prefix(toolchain_prefix, target):
     # Pass TOOLCHAIN_PREFIX down to the build system if it was given from the
     # command line/environment (in which case there's only one value in the tuple),
     # or when cross-compiling for Android.
     if toolchain_prefix and (target.os == 'Android' or len(toolchain_prefix) == 1):
         return toolchain_prefix[0]
 set_config('TOOLCHAIN_PREFIX', first_toolchain_prefix)
 add_old_configure_assignment('TOOLCHAIN_PREFIX', first_toolchain_prefix)
 # Compilers
 # ==============================================================
 def try_preprocess(compiler, language, source):
     return try_invoke_compiler(compiler, language, source, ['-E'])
 @imports(_from='mozbuild.configure.constants', _import='CompilerType')
 @imports(_from='textwrap', _import='dedent')
 def get_compiler_info(compiler, language):
     '''Returns information about the given `compiler` (command line in the
@@ -427,17 +459,18 @@ def check_compiler(compiler, language, t
             # MSVC 2015 headers include C++14 features, but don't guard them
             # with appropriate checks.
             if info.type == 'clang-cl' and info.language_version != cxx14_version:
             # GCC 4.9 indicates that it implements draft C++14 features
             # instead of the full language.
             elif info.type == 'gcc' and not \
-                (info.language_version == draft_cxx14_version or info.language_version == cxx14_version):
+                (info.language_version == draft_cxx14_version or
+                 info.language_version == cxx14_version):
     # We force clang-cl to emulate Visual C++ 2015 Update 3.
     if info.type == 'clang-cl' and info.version != '19.00.24213':
         # This flag is a direct clang-cl flag that doesn't need -Xclang,
         # add it directly.
@@ -477,17 +510,22 @@ def check_compiler(compiler, language, t
 @imports(_from='__builtin__', _import='open')
 def get_vc_paths(topsrcdir):
     def vswhere(args):
         encoding = 'mbcs' if sys.platform == 'win32' else 'utf-8'
-        return json.loads(subprocess.check_output([os.path.join(topsrcdir, 'build/win32/vswhere.exe'), '-format', 'json'] + args).decode(encoding, 'replace'))
+        return json.loads(
+            subprocess.check_output([
+                os.path.join(topsrcdir, 'build/win32/vswhere.exe'),
+                '-format',
+                'json'
+            ] + args).decode(encoding, 'replace'))
     # Can't pass -requires with -legacy, so query each separately.
     # Legacy versions first (VS2015)
     for install in vswhere(['-legacy', '-version', '[14.0,15.0)']):
         version = Version(install['installationVersion'])
         # Skip anything older than VS2015.
         if version < '14':
@@ -496,34 +534,39 @@ def get_vc_paths(topsrcdir):
         yield (Version(install['installationVersion']), {
             'x64': [os.path.join(path, r'VC\bin\amd64')],
             # The x64->x86 cross toolchain requires DLLs from the native x64 toolchain.
             'x86': [os.path.join(path, r'VC\bin\amd64_x86'), os.path.join(path, r'VC\bin\amd64')],
     # Then VS2017 and newer.
     for install in vswhere(['-requires', 'Microsoft.VisualStudio.Component.VC.Tools.x86.x64']):
         path = install['installationPath']
-        tools_version = open(os.path.join(path, r'VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt'), 'rb').read().strip()
-        tools_path = os.path.join(path, r'VC\Tools\MSVC', tools_version, r'bin\HostX64')
+        tools_version = open(os.path.join(
+            path, r'VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt'), 'rb').read().strip()
+        tools_path = os.path.join(
+            path, r'VC\Tools\MSVC', tools_version, r'bin\HostX64')
         yield (Version(install['installationVersion']), {
             'x64': [os.path.join(tools_path, 'x64')],
             # The x64->x86 cross toolchain requires DLLs from the native x64 toolchain.
             'x86': [os.path.join(tools_path, 'x86'), os.path.join(tools_path, 'x64')],
 js_option('--with-visual-studio-version', nargs=1,
           choices=('2015', '2017'),
           help='Select a specific Visual Studio version to use')
 def vs_major_version(value):
     if value:
         return {'2015': 14,
                 '2017': 15}[value[0]]
 @depends(host, target, vs_major_version, check_build_environment, '--with-visual-studio-version')
 @imports(_from='__builtin__', _import='sorted')
 @imports(_from='operator', _import='itemgetter')
 def vc_compiler_path(host, target, vs_major_version, env, vs_release_name):
     if host.kernel != 'WINNT':
     vc_target = {
@@ -533,17 +576,18 @@ def vc_compiler_path(host, target, vs_ma
     if vc_target is None:
     all_versions = sorted(get_vc_paths(env.topsrcdir), key=itemgetter(0))
     if not all_versions:
     if vs_major_version:
-        versions = [d for (v, d) in all_versions if v.major == vs_major_version]
+        versions = [d for (v, d) in all_versions if v.major ==
+                    vs_major_version]
         if not versions:
             die('Visual Studio %s could not be found!' % vs_release_name)
         data = versions[0]
         # Choose the newest version.
         data = all_versions[-1][1]
     paths = data.get(vc_target)
     if not paths:
@@ -649,17 +693,17 @@ def compiler(language, host_or_target, c
         ('C++', host): 'HOST_CXX',
     }[language, host_or_target]
     default_compilers = {
         'C': lambda: default_c_compilers(host_or_target),
         'C++': lambda: default_cxx_compilers(c_compiler),
-    what='the %s %s compiler' % (host_or_target_str, language)
+    what = 'the %s %s compiler' % (host_or_target_str, language)
     option(env=var, nargs=1, help='Path to %s' % what)
     # Handle the compiler given by the user through one of the CC/CXX/HOST_CC/
     # HOST_CXX variables.
     @imports(_from='itertools', _import='takewhile')
     @imports(_from='mozbuild.shellutil', _import='split', _as='shell_split')
@@ -882,29 +926,28 @@ def compiler(language, host_or_target, c
     def compiler_error():
         raise FatalCheckError('Failed compiling a simple %s source with %s'
                               % (language, what))
     valid_compiler.try_compile(check_msg='%s works' % what,
     # Set CPP/CXXCPP for both the build system and old-configure. We don't
     # need to check this works for preprocessing, because we already relied
     # on $CC -E/$CXX -E doing preprocessing work to validate the compiler
     # in the first place.
     if host_or_target == target:
         pp_var = {
             'C': 'CPP',
             'C++': 'CXXCPP',
         preprocessor = depends_if(valid_compiler)(
-                lambda x: list(x.wrapper) + [x.compiler, '-E'] + list(x.flags))
+            lambda x: list(x.wrapper) + [x.compiler, '-E'] + list(x.flags))
         set_config(pp_var, preprocessor)
         add_old_configure_assignment(pp_var, preprocessor)
     if language == 'C':
         linker_var = {
             target: 'LD',
             host: 'HOST_LD',
@@ -937,92 +980,103 @@ host_c_compiler = compiler('C', host, ot
 host_cxx_compiler = compiler('C++', host, c_compiler=host_c_compiler,
 # Generic compiler-based conditions.
 non_msvc_compiler = depends(c_compiler)(lambda info: info.type != 'msvc')
 building_with_gcc = depends(c_compiler)(lambda info: info.type == 'gcc')
 def msvs_version(info):
     # clang-cl emulates the same version scheme as cl. And MSVS_VERSION needs to
     # be set for GYP on Windows.
     if info.type in ('clang-cl', 'msvc'):
         if info.version >= '19.10':
             return '2017'
         elif info.version >= '19.00':
             return '2015'
     return ''
 set_config('MSVS_VERSION', msvs_version)
          try_compile(body='static_assert(sizeof(void *) == 8, "")',
                      check_msg='for 64-bit OS'))
 def check_have_64_bit(have_64_bit, compiler_have_64_bit):
     if have_64_bit != compiler_have_64_bit:
         configure_error('The target compiler does not agree with configure '
                         'about the target bitness.')
        help='Options bindgen should pass to the C/C++ parser')
 @checking('bindgen cflags', lambda s: s if s and s.strip() else 'no')
 def bindgen_cflags(value):
     if value and len(value):
         # Reformat the env value for substitution into a toml list.
         flags = value[0].split()
         return ', '.join('"' + flag + '"' for flag in flags)
     return ''
 set_config('BINDGEN_CFLAGS', bindgen_cflags)
 def default_debug_flags(compiler_info):
     # Debug info is ON by default.
     if compiler_info.type in ('msvc', 'clang-cl'):
         return '-Zi'
     return '-g'
        help='Debug compiler flags')
              depends_if('--enable-debug')(lambda v: v))
           help='Enable debug symbols using the given compiler flags')
            depends_if('--enable-debug-symbols')(lambda _: True))
 @depends('MOZ_DEBUG_FLAGS', '--enable-debug-symbols', default_debug_flags)
 def debug_flags(env_debug_flags, enable_debug_flags, default_debug_flags):
     # If MOZ_DEBUG_FLAGS is set, and --enable-debug-symbols is set to a value,
     # --enable-debug-symbols takes precedence. Note, the value of
     # --enable-debug-symbols may be implied by --enable-debug.
     if len(enable_debug_flags):
         return enable_debug_flags[0]
     if env_debug_flags:
         return env_debug_flags[0]
     return default_debug_flags
 set_config('MOZ_DEBUG_FLAGS', debug_flags)
 add_old_configure_assignment('MOZ_DEBUG_FLAGS', debug_flags)
 def color_cflags(info):
     # We could test compiling with flags. By why incur the overhead when
     # color support should always be present in a specific toolchain
     # version?
     # Code for auto-adding this flag to compiler invocations needs to
     # determine if an existing flag isn't already present. That is likely
@@ -1032,16 +1086,17 @@ def color_cflags(info):
     # before adding flags to return values.
     if info.type == 'gcc' and info.version >= '4.9.0':
         return '-fdiagnostics-color'
     elif info.type == 'clang':
         return '-fcolor-diagnostics'
         return ''
 set_config('COLOR_CFLAGS', color_cflags)
 # Some standard library headers (notably bionic on Android) declare standard
 # functions (e.g. getchar()) and also #define macros for those standard
 # functions.  libc++ deals with this by doing something like the following
 # (explanatory comments added):
 #   #ifdef FUNC
@@ -1073,47 +1128,55 @@ set_config('COLOR_CFLAGS', color_cflags)
 # However, libc++ will only define _LIBCPP_INLINE_VISIBILITY if there is no
 # existing definition.  We can therefore define it to the empty string (since
 # we are properly managing visibility ourselves) and avoid this whole mess.
 # Note that we don't need to do this with gcc, as libc++ detects gcc and
 # effectively does the same thing we are doing here.
 # _LIBCPP_ALWAYS_INLINE needs similar workarounds, since it too declares
 # hidden visibility.
 @depends(c_compiler, target)
 def libcxx_override_visibility(c_compiler, target):
     if c_compiler.type == 'clang' and target.os == 'Android':
         return ''
 set_define('_LIBCPP_INLINE_VISIBILITY', libcxx_override_visibility)
-set_define('_LIBCPP_INLINE_VISIBILITY_EXCEPT_GCC49', libcxx_override_visibility)
+           libcxx_override_visibility)
 set_define('_LIBCPP_ALWAYS_INLINE', libcxx_override_visibility)
 set_define('_LIBCPP_ALWAYS_INLINE_EXCEPT_GCC49', libcxx_override_visibility)
 @depends(target, check_build_environment)
 def visibility_flags(target, env):
     if target.os != 'WINNT':
         if target.kernel == 'Darwin':
             return ('-fvisibility=hidden', '-fvisibility-inlines-hidden')
         return ('-I%s/system_wrappers' % os.path.join(env.dist),
                 '%s/config/gcc_hidden.h' % env.topsrcdir)
 @depends(target, visibility_flags)
 def wrap_system_includes(target, visibility_flags):
     if visibility_flags and target.kernel != 'Darwin':
         return True
            depends(visibility_flags)(lambda v: bool(v) or None))
            depends(visibility_flags)(lambda v: bool(v) or None))
 set_config('WRAP_SYSTEM_INCLUDES', wrap_system_includes)
 set_config('VISIBILITY_FLAGS', visibility_flags)
 @imports(_from='__builtin__', _import='min')
 def pgo_flags(compiler):
     if compiler.type in ('gcc', 'clang'):
         return namespace(
@@ -1137,104 +1200,115 @@ def pgo_flags(compiler):
             # optimization/PGO case. I think it's probably a compiler bug,
             # but we work around it here.
             use_cflags=['-GL', '-wd4624', '-wd4952'],
             # XXX: should be -LTCG:PGOPTIMIZE, but that fails on libxul.
             # Probably also a compiler bug, but what can you do?
             use_ldflags=['-LTCG:PGUPDATE', cgthreads],
 set_config('PROFILE_GEN_CFLAGS', pgo_flags.gen_cflags)
 set_config('PROFILE_GEN_LDFLAGS', pgo_flags.gen_ldflags)
 set_config('PROFILE_USE_CFLAGS', pgo_flags.use_cflags)
 set_config('PROFILE_USE_LDFLAGS', pgo_flags.use_ldflags)
 # We only want to include windows.configure when we are compiling on
 # Windows, for Windows.
 @depends(target, host)
 def is_windows(target, host):
     return host.kernel == 'WINNT' and target.kernel == 'WINNT'
 include('windows.configure', when=is_windows)
 # Shader Compiler for Windows (and MinGW Cross Compile)
 # ==============================================================
 fxc = check_prog('FXC', ('fxc.exe', 'fxc2.exe'), when=depends(target)
                  (lambda t: t.kernel == 'WINNT'))
 wine = check_prog('WINE', ['wine'], when=depends(target, host)
                   (lambda t, h: t.kernel == 'WINNT' and h.kernel == 'Linux'))
 # Security Hardening
 # ==============================================================
 option('--enable-hardening', env='MOZ_SECURITY_HARDENING',
        help='Enables security hardening compiler options')
 @depends('--enable-hardening', c_compiler)
 def security_hardening_cflags(value, c_compiler):
     if value and c_compiler.type in ['gcc', 'clang']:
         return '-fstack-protector-strong'
 add_old_configure_assignment('HARDENING_CFLAGS', security_hardening_cflags)
 imply_option('--enable-pie', depends_if('--enable-hardening')(lambda v: v))
        help='Rust compiler flags')
 set_config('RUSTFLAGS', depends('RUSTFLAGS')(lambda flags: flags))
 imply_option('--enable-release', mozilla_official)
 imply_option('--enable-release', depends_if('MOZ_AUTOMATION')(lambda x: True))
           help='Build with more conservative, release engineering-oriented '
                'options. This may slow down builds.')
 def developer_options(value):
     if not value:
         return True
 add_old_configure_assignment('DEVELOPER_OPTIONS', developer_options)
 set_config('DEVELOPER_OPTIONS', developer_options)
 # Linker detection
 # ==============================================================
 def is_linker_option_enabled(target):
     if target.kernel not in ('Darwin', 'WINNT', 'SunOS'):
         return True
        help='Enable GNU Gold Linker when it is not already the default',
 imply_option('--enable-linker', 'gold', when='--enable-gold')
 def enable_gnu_linker(enable_gold_option, c_compiler, developer_options, build_env,
                       toolchain_flags, linker_name):
     # Used to check the kind of linker
     version_check = ['-Wl,--version']
     cmd_base = c_compiler.wrapper + [c_compiler.compiler] + c_compiler.flags
     if toolchain_flags:
         cmd_base += toolchain_flags
     def resolve_gold():
         # Try to force the usage of gold
         targetDir = os.path.join(build_env.topobjdir, 'build', 'unix', 'gold')
         gold_detection_arg = '-print-prog-name=ld.gold'
-        gold = check_cmd_output(c_compiler.compiler, gold_detection_arg).strip()
+        gold = check_cmd_output(c_compiler.compiler,
+                                gold_detection_arg).strip()
         if not gold:
         goldFullPath = find_program(gold)
         if goldFullPath is None:
         if os.path.exists(targetDir):
@@ -1280,51 +1354,57 @@ def enable_gnu_linker(enable_gold_option
     # For other platforms without gold or the GNU linker
     return namespace(
 js_option('--enable-linker', nargs=1,
           choices=('bfd', 'gold', 'lld', 'other'),
           help='Select the linker',
 @depends('--enable-linker', c_compiler, developer_options, check_build_environment,
          extra_toolchain_flags, when=is_linker_option_enabled)
 @checking('for linker', lambda x: x.KIND)
 def select_linker(linker, c_compiler, developer_options, build_env, toolchain_flags):
     linker = linker[0] if linker else 'other'
     if linker in ('gold', 'bfd', 'other'):
         return enable_gnu_linker(linker == 'gold', c_compiler, developer_options,
                                  build_env, toolchain_flags, linker)
     if linker == 'lld':
         version_check = ['-Wl,--version']
-        cmd_base = c_compiler.wrapper + [c_compiler.compiler] + c_compiler.flags
+        cmd_base = c_compiler.wrapper + \
+            [c_compiler.compiler] + c_compiler.flags
         lld = "-fuse-ld=" + linker
         cmd = cmd_base + [lld] + version_check
         if 'LLD' in check_cmd_output(*cmd).decode('utf-8'):
             return namespace(
             die("Could not use lld as linker")
-set_config('LD_IS_BFD', depends(select_linker.KIND)(lambda x: x == 'bfd' or None))
+set_config('LD_IS_BFD', depends(select_linker.KIND)
+           (lambda x: x == 'bfd' or None))
 set_config('LINKER_LDFLAGS', select_linker.LINKER_FLAG)
 # Code Coverage
 # ==============================================================
 js_option('--enable-coverage', env='MOZ_CODE_COVERAGE',
-       help='Enable code coverage')
+          help='Enable code coverage')
 def code_coverage(value):
     if value:
         return True
 set_config('MOZ_CODE_COVERAGE', code_coverage)
 set_define('MOZ_CODE_COVERAGE', code_coverage)
--- a/build/moz.configure/util.configure
+++ b/build/moz.configure/util.configure
@@ -1,14 +1,15 @@
 # -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # This Source Code Form is subject to the terms of the Mozilla Public
 # 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/.
 def die(*args):
     'Print an error and terminate configure.'
 @imports(_from='mozbuild.configure', _import='ConfigureError')
@@ -17,16 +18,18 @@ def configure_error(message):
     Primarily for use in moz.configure templates to sanity check
     their inputs from moz.configure usage.'''
     raise ConfigureError(message)
 # A wrapper to obtain a process' output that returns the output generated
 # by running the given command if it exits normally, and streams that
 # output to log.debug and calls die or the given error callback if it
 # does not.
 @imports(_from='__builtin__', _import='unicode')
 @imports(_from='mozbuild.configure.util', _import='LineIO')
 @imports(_from='mozbuild.shellutil', _import='quote')
 def check_cmd_output(*args, **kwargs):
     onerror = kwargs.pop('onerror', None)
@@ -62,16 +65,17 @@ def check_cmd_output(*args, **kwargs):
                 log.debug('Its %s was:', desc)
                 with LineIO(lambda l: log.debug('| %s', l)) as o:
         if onerror:
             return onerror()
         die('Command `%s` failed with exit status %d.' %
             (quote(*args), retcode))
 def is_absolute_or_relative(path):
     if os.altsep and os.altsep in path:
         return True
     return os.sep in path
 @imports(_import='mozpack.path', _as='mozpath')
@@ -83,17 +87,18 @@ def normsep(path):
 @imports(_from='ctypes', _import='wintypes')
 @imports(_from='mozbuild.configure.constants', _import='WindowsBinaryType')
 def windows_binary_type(path):
     """Obtain the type of a binary on Windows.
     Returns WindowsBinaryType constant.
     GetBinaryTypeW = ctypes.windll.kernel32.GetBinaryTypeW
-    GetBinaryTypeW.argtypes = [wintypes.LPWSTR, wintypes.POINTER(wintypes.DWORD)]
+    GetBinaryTypeW.argtypes = [wintypes.LPWSTR,
+                               wintypes.POINTER(wintypes.DWORD)]
     GetBinaryTypeW.restype = wintypes.BOOL
     bin_type = wintypes.DWORD()
     res = GetBinaryTypeW(path, ctypes.byref(bin_type))
     if not res:
         die('could not obtain binary type of %s' % path)
     if bin_type.value == 0:
@@ -142,16 +147,17 @@ def normalize_path():
                 size = needed
         def normalize_path(path):
             return normsep(path)
     return normalize_path
 normalize_path = normalize_path()
 # Locates the given program using which, or returns the given path if it
 # exists.
 # The `paths` parameter may be passed to search the given paths instead of
 # $PATH.
 @imports(_from='which', _import='which')
@@ -359,16 +365,18 @@ def Version(v):
 # Denotes a deprecated option. Combines option() and @depends:
 # @deprecated_option('--option')
 # def option(value):
 #     ...
 # @deprecated_option() takes the same arguments as option(), except `help`.
 # The function may handle the option like a typical @depends function would,
 # but it is recommended it emits a deprecation error message suggesting an
 # alternative option to use if there is one.
 def deprecated_option(*args, **kwargs):
     assert 'help' not in kwargs
     kwargs['help'] = 'Deprecated'
     opt = option(*args, **kwargs)
     def decorator(func):
@@ -409,16 +417,17 @@ never = dependable(False)
 # arguments.
 def depends_tmpl(eval_args_fn, *args, **kwargs):
     if kwargs:
         assert len(kwargs) == 1
         when = kwargs['when']
         when = None
     def decorator(func):
         @depends(*args, when=when)
         def wrapper(*args):
             if eval_args_fn(args):
                 return func(*args)
         return wrapper
     return decorator
@@ -439,20 +448,22 @@ def depends_all(*args, **kwargs):
 # Hacks related to old-configure
 # ==============================
 def old_configure_assignments():
     return []
 def extra_old_configure_args():
     return []
 def add_old_configure_assignment(var, value):
     var = dependable(var)
     value = dependable(value)
     @depends(old_configure_assignments, var, value)
     @imports(_from='mozbuild.shellutil', _import='quote')
     def add_assignment(assignments, var, value):
@@ -462,14 +473,15 @@ def add_old_configure_assignment(var, va
             assignments.append('%s=1' % var)
         elif value is False:
             assignments.append('%s=' % var)
             if isinstance(value, (list, tuple)):
                 value = quote(*value)
             assignments.append('%s=%s' % (var, quote(str(value))))
 def add_old_configure_arg(arg):
     @depends(extra_old_configure_args, arg)
     def add_arg(args, arg):
         if arg:
--- a/build/moz.configure/windows.configure
+++ b/build/moz.configure/windows.configure
@@ -3,16 +3,17 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # 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/.
 option('--with-windows-version', nargs=1, default='603',
        help='Windows SDK version to target. Win 8.1 (603) is currently'
             'the minimum supported version.')
 @imports(_from='__builtin__', _import='ValueError')
 def valid_windows_version(value):
     if not value:
         die('Cannot build with --without-windows-version')
         version = int(value[0], 16)
         if version in (0x603,):
@@ -21,16 +22,17 @@ def valid_windows_version(value):
     die('Invalid value for --with-windows-version (%s)', value[0])
 option(env='WINDOWSSDKDIR', nargs=1,
        help='Directory containing the Windows SDK')
 @depends('WINDOWSSDKDIR', host)
 def windows_sdk_dir(value, host):
     if value:
         return value
     if host.kernel != 'WINNT':
         return ()
     return set(x[1] for x in get_registry_values(
@@ -39,16 +41,18 @@ def windows_sdk_dir(value, host):
 # The Windows SDK 8.1 and 10 have different layouts. The former has
 # $SDK/include/$subdir, while the latter has $SDK/include/$version/$subdir.
 # The vcvars* scripts don't actually care about the version, they just take
 # the last alphanumerically.
 # The $SDK/lib directories always have version subdirectories, but while the
 # versions match the one in $SDK/include for SDK 10, it's "winv6.3" for SDK
 # 8.1.
 @imports(_from='__builtin__', _import='sorted')
 @imports(_from='__builtin__', _import='WindowsError')
 def get_sdk_dirs(sdk, subdir):
     def get_dirs_containing(sdk, stem, subdir):
         base = os.path.join(sdk, stem)
@@ -84,16 +88,17 @@ def get_sdk_dirs(sdk, subdir):
 @imports(_from='mozbuild.shellutil', _import='quote')
 def valid_windows_sdk_dir_result(value):
     if value:
         return '0x%04x in %s' % (value.version, quote(value.path))
 @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='textwrap', _import='dedent')
 def valid_windows_sdk_dir(compiler, windows_sdk_dir, target_version,
     if windows_sdk_dir_env:
         windows_sdk_dir_env = windows_sdk_dir_env[0]
@@ -160,16 +165,17 @@ add_old_configure_assignment(
         lambda x: '0x%04X0000' % x.version if x else None))
 @imports(_from='mozbuild.shellutil', _import='quote')
 def valid_ucrt_sdk_dir_result(value):
     if value:
         return '%s in %s' % (value.version, quote(value.path))
 @depends(windows_sdk_dir, 'WINDOWSSDKDIR')
 @checking('for Universal CRT SDK', valid_ucrt_sdk_dir_result)
 @imports(_from='__builtin__', _import='sorted')
 @imports(_import='mozpack.path', _as='mozpath')
 def valid_ucrt_sdk_dir(windows_sdk_dir, windows_sdk_dir_env):
     if windows_sdk_dir_env:
         windows_sdk_dir_env = windows_sdk_dir_env[0]
@@ -221,17 +227,17 @@ def valid_ucrt_sdk_dir(windows_sdk_dir, 
         raise FatalCheckError('Cannot find the Universal CRT SDK. '
                               'Please install it.')
     version, sdk = sdks[valid_sdks[0]]
     minimum_ucrt_version = Version('10.0.10586.0')
     if version < minimum_ucrt_version:
         raise FatalCheckError('Latest Universal CRT SDK version found %s'
                               ' and minimum required is %s.'
-                              % (version,  minimum_ucrt_version))
+                              % (version, minimum_ucrt_version))
     return namespace(
@@ -262,17 +268,18 @@ def vc_path(c_compiler):
 @imports(_from='os.path', _import='isdir')
 def dia_sdk_dir(vc_path, c_compiler):
     if vc_path:
         if c_compiler.version < '19.10':
             path = os.path.join(os.path.dirname(vc_path), 'DIA SDK')
             # This would be easier if we had the installationPath that
             # get_vc_paths works with, since 'DIA SDK' is relative to that.
-            path = os.path.normpath(os.path.join(vc_path, r'..\..\..\..\DIA SDK'))
+            path = os.path.normpath(os.path.join(
+                vc_path, r'..\..\..\..\DIA SDK'))
         if isdir(path):
             return path
 @depends(vc_path, valid_windows_sdk_dir, valid_ucrt_sdk_dir, dia_sdk_dir)
 def include_path(vc_path, windows_sdk_dir, ucrt_sdk_dir, dia_sdk_dir):
     if not vc_path:
@@ -301,16 +308,17 @@ def include_path(vc_path, windows_sdk_di
     if dia_sdk_dir:
         includes.append(os.path.join(dia_sdk_dir, 'include'))
     # Set in the environment for old-configure
     includes = os.pathsep.join(includes)
     os.environ['INCLUDE'] = includes
     return includes
 set_config('INCLUDE', include_path)
 @depends(target, c_compiler, vc_path, valid_windows_sdk_dir, valid_ucrt_sdk_dir, dia_sdk_dir)
 def lib_path(target, c_compiler, vc_path, windows_sdk_dir, ucrt_sdk_dir, dia_sdk_dir):
     if not vc_path:
@@ -358,21 +366,23 @@ def lib_path(target, c_compiler, vc_path
         # For some reason the DIA SDK still uses the old-style targets
         # even in a newer MSVC.
         libs.append(os.path.join(dia_sdk_dir, 'lib', *old_target))
     # Set in the environment for old-configure
     libs = os.pathsep.join(libs)
     os.environ['LIB'] = libs
     return libs
 set_config('LIB', lib_path)
 option(env='MT', nargs=1, help='Path to the Microsoft Manifest Tool')
 @depends(valid_windows_sdk_dir, valid_ucrt_sdk_dir)
 @imports(_from='os', _import='environ')
 def sdk_bin_path(valid_windows_sdk_dir, valid_ucrt_sdk_dir):
     if not valid_windows_sdk_dir:
     vc_host = {
@@ -403,17 +413,17 @@ mt = check_prog('MT', ('mt.exe',), input
 @checking('whether MT is really Microsoft Manifest Tool', lambda x: bool(x))
 def valid_mt(path):
         out = subprocess.check_output([path]).splitlines()
         out = '\n'.join(l for l in out
                         if 'Microsoft (R) Manifest Tool' in l)
         if out:
-              return path
+            return path
     except subprocess.CalledProcessError:
     raise FatalCheckError('%s is not Microsoft Manifest Tool')
 set_config('MSMANIFEST_TOOL', depends(valid_mt)(lambda x: bool(x)))
@@ -428,12 +438,12 @@ add_old_configure_assignment('LINK', lin
 # valid_compiler().
 def alter_path(sdk_bin_path):
     path = os.pathsep.join(sdk_bin_path)
     os.environ['PATH'] = path
     return path
 set_config('PATH', alter_path)
 check_prog('MAKECAB', ('makecab.exe',))
--- a/tools/lint/flake8.yml
+++ b/tools/lint/flake8.yml
@@ -1,12 +1,13 @@
     description: Python linter
+        - build/moz.configure/*.configure
         - config/check_macroassembler_style.py
         - config/mozunit.py
         - layout/tools/reftest
         - python/mach
         - python/mach_commands.py
         - python/mozlint
         - python/mozversioncontrol
         - security/manager