aboutsummaryrefslogtreecommitdiffstats
path: root/python/mach_bootstrap.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/mach_bootstrap.py')
-rw-r--r--python/mach_bootstrap.py100
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