diff options
Diffstat (limited to 'python/servo/command_base.py')
-rw-r--r-- | python/servo/command_base.py | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/python/servo/command_base.py b/python/servo/command_base.py new file mode 100644 index 00000000000..5d15494a4e7 --- /dev/null +++ b/python/servo/command_base.py @@ -0,0 +1,94 @@ +import os +from os import path +import subprocess +import sys +import toml + +from mach.registrar import Registrar + +class cd: + """Context manager for changing the current working directory""" + def __init__(self, newPath): + self.newPath = newPath + + def __enter__(self): + self.savedPath = os.getcwd() + os.chdir(self.newPath) + + def __exit__(self, etype, value, traceback): + os.chdir(self.savedPath) + +class CommandBase(object): + """Base class for mach command providers. + + This mostly handles configuration management, such as .servobuild.""" + + def __init__(self, context): + self.context = context + + if not hasattr(self.context, "bootstrapped"): + self.context.bootstrapped = False + + config_path = path.join(context.topdir, ".servobuild") + if path.exists(config_path): + self.config = toml.loads(open(config_path).read()) + else: + self.config = {} + + # Handle missing/default items + self.config.setdefault("tools", {}) + self.config["tools"].setdefault("system-rust", False) + self.config["tools"].setdefault("system-cargo", False) + self.config["tools"].setdefault("rust-root", "") + self.config["tools"].setdefault("cargo-root", "") + if not self.config["tools"]["system-rust"]: + self.config["tools"]["rust-root"] = path.join(context.topdir, "rust") + if not self.config["tools"]["system-cargo"]: + self.config["tools"]["cargo-root"] = path.join(context.topdir, "cargo") + + def build_env(self): + """Return an extended environment dictionary.""" + env = os.environ.copy() + extra_path = [] + extra_lib = [] + if not self.config["tools"]["system-rust"] or self.config["tools"]["rust-root"]: + extra_path += [path.join(self.config["tools"]["rust-root"], "bin")] + extra_lib += [path.join(self.config["tools"]["rust-root"], "lib")] + if not self.config["tools"]["system-cargo"] or self.config["tools"]["cargo-root"]: + extra_path += [path.join(self.config["tools"]["cargo-root"], "bin")] + + if extra_path: + env["PATH"] = "%s%s%s" % (os.pathsep.join(extra_path), os.pathsep, env["PATH"]) + if extra_lib: + if sys.platform == "darwin": + env["DYLD_LIBRARY_PATH"] = "%s%s%s" % \ + (os.pathsep.join(extra_lib), + os.pathsep, + env.get("DYLD_LIBRARY_PATH", "")) + else: + env["LD_LIBRARY_PATH"] = "%s%s%s" % \ + (os.pathsep.join(extra_lib), + os.pathsep, + env.get("LD_LIBRARY_PATH", "")) + + return env + + def ensure_bootstrapped(self): + if self.context.bootstrapped: return + + submodules = subprocess.check_output(["git", "submodule", "status"]) + for line in submodules.split('\n'): + components = line.strip().split(' ') + if len(components) > 1 and components[0].startswith('-'): + module_path = components[1] + subprocess.check_call(["git", "submodule", "update", + "--init", "--recursive", "--", module_path]) + + if not self.config["tools"]["system-rust"] and \ + not path.exists(path.join(self.context.topdir, "rust", "bin", "rustc")): + Registrar.dispatch("bootstrap-rust", context=self.context) + if not self.config["tools"]["system-cargo"] and \ + not path.exists(path.join(self.context.topdir, "cargo", "bin", "cargo")): + Registrar.dispatch("bootstrap-cargo", context=self.context) + + self.context.bootstrapped = True |