diff options
Diffstat (limited to 'python/servo/command_base.py')
-rw-r--r-- | python/servo/command_base.py | 144 |
1 files changed, 122 insertions, 22 deletions
diff --git a/python/servo/command_base.py b/python/servo/command_base.py index e05d37283cc..838e03f910c 100644 --- a/python/servo/command_base.py +++ b/python/servo/command_base.py @@ -28,6 +28,7 @@ from servo.util import download_file import urllib2 from bootstrap import check_gstreamer_lib +from mach.decorators import CommandArgument from mach.registrar import Registrar import toml @@ -731,31 +732,130 @@ install them, let us know by filing a bug!") return env - def add_manifest_path(self, args, android=False, libsimpleservo=False): + @staticmethod + def build_like_command_arguments(decorated_function): + decorators = [ + CommandArgument( + '--target', '-t', + default=None, + help='Cross compile for given target platform', + ), + CommandArgument( + '--android', + default=None, + action='store_true', + help='Build for Android', + ), + CommandArgument( + '--magicleap', + default=None, + action='store_true', + help='Build for Magic Leap', + ), + CommandArgument( + '--libsimpleservo', + default=None, + action='store_true', + help='Build the libsimpleservo library instead of the servo executable', + ), + CommandArgument( + '--features', + default=None, + help='Space-separated list of features to also build', + nargs='+', + ), + CommandArgument( + '--debug-mozjs', + default=None, + action='store_true', + help='Enable debug assertions in mozjs', + ), + CommandArgument( + '--with-debug-assertions', + default=None, + action='store_true', + help='Enable debug assertions in release', + ), + CommandArgument( + '--with-frame-pointer', + default=None, + action='store_true', + help='Build with frame pointer enabled, used by the background hang monitor.', + ), + CommandArgument('--with-raqote', default=None, action='store_true'), + CommandArgument('--without-wgl', default=None, action='store_true'), + ] + + for decorator in decorators: + decorated_function = decorator(decorated_function) + return decorated_function + + def pick_target_triple(self, target, android, magicleap): + if android is None: + android = self.config["build"]["android"] + if target and android: + assert self.handle_android_target(target) + if android and not target: + target = self.config["android"]["target"] + if magicleap and not target: + target = "aarch64-linux-android" + if target and not android and not magicleap: + android = self.handle_android_target(target) + return target, android + + def run_cargo_build_like_command( + self, command, cargo_args, + env=None, verbose=False, + target=None, android=False, magicleap=False, libsimpleservo=False, + features=None, debug_mozjs=False, with_debug_assertions=False, + with_frame_pointer=False, with_raqote=False, without_wgl=False, + ): + env = env or self.build_env() + target, android = self.pick_target_triple(target, android, magicleap) + + args = [] if "--manifest-path" not in args: if libsimpleservo or android: - manifest = self.ports_libsimpleservo_manifest(android) + if android: + api = "jniapi" + else: + api = "capi" + port = path.join("libsimpleservo", api) else: - manifest = self.ports_glutin_manifest() - args.append("--manifest-path") - args.append(manifest) - - def ports_glutin_manifest(self): - return path.join(self.context.topdir, "ports", "glutin", "Cargo.toml") - - def ports_libsimpleservo_manifest(self, android=False): - if android: - api = "jniapi" - else: - api = "capi" - return path.join(self.context.topdir, "ports", "libsimpleservo", api, "Cargo.toml") - - def servo_features(self): - """Return a list of optional features to enable for the Servo crate""" - features = [] - if self.config["build"]["debug-mozjs"]: - features += ["debugmozjs"] - return features + port = "glutin" + args += [ + "--manifest-path", + path.join(self.context.topdir, "ports", port, "Cargo.toml"), + ] + if target: + args += ["--target", target] + + if features is None: # If we're passed a list, mutate it even if it's empty + features = [] + if self.config["build"]["debug-mozjs"] or debug_mozjs: + features.append("debugmozjs") + if not magicleap: + features.append("native-bluetooth") + if with_raqote and "canvas2d-azure" not in features: + features.append("canvas2d-raqote") + elif "canvas2d-raqote" not in features: + features.append("canvas2d-azure") + if with_frame_pointer: + env['RUSTFLAGS'] = env.get('RUSTFLAGS', "") + " -C force-frame-pointers=yes" + features.append("profilemozjs") + if without_wgl: + features.append("no_wgl") + if self.config["build"]["webgl-backtrace"]: + features.append("webgl-backtrace") + if self.config["build"]["dom-backtrace"]: + features.append("dom-backtrace") + if with_debug_assertions: + env['RUSTFLAGS'] = env.get('RUSTFLAGS', "") + " -C debug_assertions" + + assert "--features" not in cargo_args + args += ["--features", " ".join(features)] + + return self.call_rustup_run(["cargo", command] + args + cargo_args, env=env, verbose=verbose) def android_support_dir(self): return path.join(self.context.topdir, "support", "android") |