diff options
Diffstat (limited to 'python/mach_bootstrap.py')
-rw-r--r-- | python/mach_bootstrap.py | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/python/mach_bootstrap.py b/python/mach_bootstrap.py new file mode 100644 index 00000000000..3418b87d057 --- /dev/null +++ b/python/mach_bootstrap.py @@ -0,0 +1,100 @@ +# 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/. + +from __future__ import print_function, unicode_literals + +import os +import platform +import sys + +SEARCH_PATHS = [ + "python/mach", + "python/toml", +] + +# Individual files providing mach commands. +MACH_MODULES = [ + 'python/servo/bootstrap_commands.py', + 'python/servo/build_commands.py', + 'python/servo/testing_commands.py', + 'python/servo/post_build_commands.py', + 'python/servo/devenv_commands.py', +] + + +CATEGORIES = { + 'bootstrap': { + 'short': 'Bootstrap Commands', + 'long': 'Bootstrap the build system', + 'priority': 90, + }, + 'build': { + 'short': 'Build Commands', + 'long': 'Interact with the build system', + 'priority': 80, + }, + 'post-build': { + 'short': 'Post-build Commands', + 'long': 'Common actions performed after completing a build.', + 'priority': 70, + }, + 'testing': { + 'short': 'Testing', + 'long': 'Run tests.', + 'priority': 60, + }, + 'devenv': { + 'short': 'Development Environment', + 'long': 'Set up and configure your development environment.', + 'priority': 50, + }, + 'build-dev': { + 'short': 'Low-level Build System Interaction', + 'long': 'Interact with specific parts of the build system.', + 'priority': 20, + }, + 'misc': { + 'short': 'Potpourri', + 'long': 'Potent potables and assorted snacks.', + 'priority': 10, + }, + 'disabled': { + 'short': 'Disabled', + 'long': 'The disabled commands are hidden by default. Use -v to display them. These commands are unavailable for your current context, run "mach <command>" to see why.', + 'priority': 0, + } +} + + +def bootstrap(topdir): + topdir = os.path.abspath(topdir) + + # Ensure we are running Python 2.7+. We put this check here so we generate a + # user-friendly error message rather than a cryptic stack trace on module + # import. + if sys.version_info[0] != 2 or sys.version_info[1] < 7: + print('Python 2.7 or above (but not Python 3) is required to run mach.') + print('You are running Python', platform.python_version()) + sys.exit(1) + + def populate_context(context, key=None): + if key is None: + return + if key == 'topdir': + return topdir + raise AttributeError(key) + + sys.path[0:0] = [os.path.join(topdir, path) for path in SEARCH_PATHS] + import mach.main + mach = mach.main.Mach(os.getcwd()) + mach.populate_context_handler = populate_context + + for category, meta in CATEGORIES.items(): + mach.define_category(category, meta['short'], meta['long'], + meta['priority']) + + for path in MACH_MODULES: + mach.load_commands_from_file(os.path.join(topdir, path)) + + return mach |