summaryrefslogtreecommitdiffstats
path: root/python/mozbuild/mozbuild/bootstrap.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/mozbuild/mozbuild/bootstrap.py')
-rw-r--r--python/mozbuild/mozbuild/bootstrap.py61
1 files changed, 61 insertions, 0 deletions
diff --git a/python/mozbuild/mozbuild/bootstrap.py b/python/mozbuild/mozbuild/bootstrap.py
new file mode 100644
index 0000000000..60a307145c
--- /dev/null
+++ b/python/mozbuild/mozbuild/bootstrap.py
@@ -0,0 +1,61 @@
+# 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/.
+
+import functools
+import io
+import logging
+import os
+from pathlib import Path
+
+from mozbuild.configure import ConfigureSandbox
+
+
+def _raw_sandbox(extra_args=[]):
+ # Here, we don't want an existing mozconfig to interfere with what we
+ # do, neither do we want the default for --enable-bootstrap (which is not
+ # always on) to prevent this from doing something.
+ out = io.StringIO()
+ logger = logging.getLogger("moz.configure")
+ handler = logging.StreamHandler(out)
+ logger.addHandler(handler)
+ logger.propagate = False
+ sandbox = ConfigureSandbox(
+ {},
+ argv=["configure"]
+ + ["--enable-bootstrap", f"MOZCONFIG={os.devnull}"]
+ + extra_args,
+ logger=logger,
+ )
+ return sandbox
+
+
+@functools.lru_cache(maxsize=None)
+def _bootstrap_sandbox():
+ sandbox = _raw_sandbox()
+ moz_configure = (
+ Path(__file__).parent.parent.parent.parent / "build" / "moz.configure"
+ )
+ sandbox.include_file(str(moz_configure / "init.configure"))
+ # bootstrap_search_path_order has a dependency on developer_options, which
+ # is not defined in init.configure. Its value doesn't matter for us, though.
+ sandbox["developer_options"] = sandbox["always"]
+ sandbox.include_file(str(moz_configure / "bootstrap.configure"))
+ return sandbox
+
+
+def bootstrap_toolchain(toolchain_job):
+ # Expand the `bootstrap_path` template for the given toolchain_job, and execute the
+ # expanded function via `_value_for`, which will trigger autobootstrap.
+ # Returns the path to the toolchain.
+ sandbox = _bootstrap_sandbox()
+ return sandbox._value_for(sandbox["bootstrap_path"](toolchain_job))
+
+
+def bootstrap_all_toolchains_for(configure_args=[]):
+ sandbox = _raw_sandbox(configure_args)
+ moz_configure = Path(__file__).parent.parent.parent.parent / "moz.configure"
+ sandbox.include_file(str(moz_configure))
+ for depend in sandbox._depends.values():
+ if depend.name == "bootstrap_path":
+ depend.result()