author Mozilla Releng Treescript <>
Mon, 14 Nov 2022 14:23:49 +0000
changeset 641462 41c78f88417ab2629a8f39dd4f4cbb56e59bbf85
parent 639863 a72a1a9be98327348501ee01feb091634c962688
child 647377 f75b763d17e0eb993ee6df7d772eb9956c05fff9
permissions -rwxr-xr-x
No bug - tagging 20e2590324e26b5ebc2f86ade34286967e0a58a8 with FIREFOX_BETA_108_BASE a=release DONTBUILD CLOSED TREE

#!/usr/bin/env python3
# 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

from __future__ import absolute_import, print_function, unicode_literals

import os
import platform
import sys
from textwrap import dedent

def load_mach(dir_path, mach_path):
    # Defer import of "importlib.util" until after Python version check has happened
    # so that Python 2 usages fail gracefully.
    import importlib.util
    spec = importlib.util.spec_from_file_location('mach_initialize', mach_path)
    mach_initialize = importlib.util.module_from_spec(spec)
    return mach_initialize.initialize(dir_path)

def check_and_get_mach(dir_path):
    initialize_paths = (
        # Run Thunderbird's if it exists
        # test package initialize
    for initialize_path in initialize_paths:
        mach_path = os.path.join(dir_path, initialize_path)
        if os.path.isfile(mach_path):
            return load_mach(dir_path, mach_path)
    return None

def main(args):
    # Ensure we are running Python 3.6+. We run this check as soon as
    # possible to avoid a cryptic import/usage error.
    if sys.version_info < (3, 6):
        print("Python 3.6+ is required to run mach.")
        print("You are running Python", platform.python_version())
        if sys.platform.startswith("linux"):
            for guidance on how to install Python on your system.
        elif sys.platform.startswith("darwin"):
            for guidance on how to prepare your system to build Firefox. Perhaps
            you need to update Xcode, or install Python using brew?
        elif "MOZILLABUILD" in os.environ and os.environ.get("TERM"):
            Python is provided by MozillaBuild; ensure your MozillaBuild installation is
            up to date. See
            for details.
        elif sys.platform.startswith("win"):
            You probably want to be interacting with Mach from within MozillaBuild, see
   for details.
            If you are deliberately using Mach from outside MozillaBuild, then see
            for guidance on installing native Python on your system.
            We do not have specific instructions for your platform on how to
            install Python. You may find Pyenv (
            helpful, if your system package manager does not provide a way to
            install a recent enough Python 3.

    # XCode python sets __PYVENV_LAUNCHER__, which overrides the executable
    # used when a python subprocess is created. This is an issue when we want
    # to run using our virtualenv python executables.
    # In future Python relases, __PYVENV_LAUNCHER__ will be cleared before
    # application code (mach) is started.
    os.environ.pop("__PYVENV_LAUNCHER__", None)

    mach = check_and_get_mach(os.path.dirname(os.path.realpath(__file__)))
    if not mach:
        print('Could not run mach: No mach source directory found.')

if __name__ == '__main__':