Auto merge of #24668 - tuncer:configure-media-stack-v2, r=asajeffrey

Allow build to explicitly set the media stack

<!-- Please describe your changes on the following line: -->
_[This is based on @asajeffrey's work in #23423, and is a rebase and continuation of that branch]_

This allows `./mach build` to override the media stack, which is currently hard-wired based on the target. To skip gstreamer, run `./mach build -d --media-stack=dummy`.

---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: -->
- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors
- [x] These changes fix #23050 (GitHub issue number if applicable)
<!-- Either: -->
- [x] These changes do not require tests because it's build infra

<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->

<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
This commit is contained in:
bors-servo 2019-11-22 13:26:07 -05:00 committed by GitHub
commit 10a63cc9d4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 60 additions and 18 deletions

View file

@ -36,6 +36,8 @@ webgl_backtrace = [
"canvas_traits/webgl_backtrace",
]
vslatestinstalled = ["script/vslatestinstalled"]
media-dummy = ["servo-media-dummy"]
media-gstreamer = ["servo-media-gstreamer", "gstreamer"]
[dependencies]
background_hang_monitor = {path = "../background_hang_monitor"}
@ -71,6 +73,8 @@ script_traits = {path = "../script_traits"}
servo_config = {path = "../config"}
servo_geometry = {path = "../geometry"}
servo-media = {git = "https://github.com/servo/media"}
servo-media-dummy = {git = "https://github.com/servo/media", optional = true}
servo-media-gstreamer = {git = "https://github.com/servo/media", optional = true}
servo_url = {path = "../url"}
sparkle = "0.1"
style = {path = "../style", features = ["servo"]}
@ -84,16 +88,10 @@ webvr_traits = {path = "../webvr_traits"}
webxr-api = {git = "https://github.com/servo/webxr"}
webxr = {git = "https://github.com/servo/webxr"}
surfman = { version = "0.1", features = ["sm-osmesa"] }
gstreamer = { version = "0.14.5", optional = true }
[target.'cfg(all(not(target_os = "windows"), not(target_os = "ios"), not(target_os="android"), not(target_arch="arm"), not(target_arch="aarch64")))'.dependencies]
gaol = "0.2.1"
[target.'cfg(any(target_os = "android", target_arch = "x86_64", target_os = "windows"))'.dependencies]
gstreamer = "0.14.5"
servo-media-gstreamer= {git = "https://github.com/servo/media"}
[target.'cfg(not(any(target_os = "android", target_arch = "x86_64", target_os = "windows")))'.dependencies.servo-media-dummy]
git = "https://github.com/servo/media"
[target.'cfg(target_os = "windows")'.dependencies]
mozangle = {version = "0.2"}

View file

@ -135,7 +135,7 @@ pub use msg::constellation_msg::TopLevelBrowsingContextId as BrowserId;
pub use servo_config as config;
pub use servo_url as url;
#[cfg(any(target_os = "android", target_arch = "x86_64", target_os = "windows",))]
#[cfg(feature = "media-gstreamer")]
mod media_platform {
use super::ServoMedia;
use servo_media_gstreamer::GStreamerBackend;
@ -245,7 +245,7 @@ mod media_platform {
}
}
#[cfg(not(any(target_os = "android", target_arch = "x86_64", target_os = "windows",)))]
#[cfg(feature = "media-dummy")]
mod media_platform {
use super::ServoMedia;
pub fn init() {

View file

@ -33,6 +33,8 @@ default = ["webdriver", "max_log_level"]
egl = ["libservo/egl"]
energy-profiling = ["libservo/energy-profiling"]
debugmozjs = ["libservo/debugmozjs"]
media-dummy = ["libservo/media-dummy"]
media-gstreamer = ["libservo/media-gstreamer"]
js_backtrace = ["libservo/js_backtrace"]
layout-2013 = ["libservo/layout-2013"]
layout-2020 = ["libservo/layout-2020"]

View file

@ -35,6 +35,8 @@ canvas2d-azure = ["libservo/canvas2d-azure"]
canvas2d-raqote = ["libservo/canvas2d-raqote"]
default = ["webdriver", "max_log_level"]
debugmozjs = ["libservo/debugmozjs"]
media-dummy = ["libservo/media-dummy"]
media-gstreamer = ["libservo/media-gstreamer"]
egl = ["libservo/egl"]
energy-profiling = ["libservo/energy-profiling"]
googlevr = ["libservo/googlevr"]

View file

@ -31,6 +31,8 @@ canvas2d-azure = ["simpleservo/canvas2d-azure"]
canvas2d-raqote = ["simpleservo/canvas2d-raqote"]
debugmozjs = ["simpleservo/debugmozjs"]
default = ["webdriver", "max_log_level"]
media-dummy = ["simpleservo/media-dummy"]
media-gstreamer = ["simpleservo/media-gstreamer"]
egl = ["simpleservo/egl"]
energy-profiling = ["simpleservo/energy-profiling"]
googlevr = ["simpleservo/googlevr"]

View file

@ -31,6 +31,8 @@ canvas2d-azure = ["simpleservo/canvas2d-azure"]
canvas2d-raqote = ["simpleservo/canvas2d-raqote"]
debugmozjs = ["simpleservo/debugmozjs"]
default = ["webdriver", "max_log_level"]
media-dummy = ["simpleservo/media-dummy"]
media-gstreamer = ["simpleservo/media-gstreamer"]
egl = ["simpleservo/egl"]
energy-profiling = ["simpleservo/energy-profiling"]
googlevr = ["simpleservo/googlevr"]

View file

@ -171,7 +171,7 @@ class MachCommands(CommandBase):
@CommandArgument('params', nargs='...',
help="Command-line arguments to be passed through to Cargo")
@CommandBase.build_like_command_arguments
def build(self, release=False, dev=False, jobs=None, params=None,
def build(self, release=False, dev=False, jobs=None, params=None, media_stack=None,
no_package=False, verbose=False, very_verbose=False,
target=None, android=False, magicleap=False, libsimpleservo=False,
features=None, uwp=False, win_arm64=False, **kwargs):
@ -191,6 +191,8 @@ class MachCommands(CommandBase):
if not uwp:
uwp = target and 'uwp' in target
features += self.pick_media_stack(media_stack, target)
target_path = base_path = self.get_target_dir()
if android:
target_path = path.join(target_path, "android")
@ -243,7 +245,7 @@ class MachCommands(CommandBase):
check_call(["rustup" + BIN_SUFFIX, "target", "add",
"--toolchain", self.toolchain(), target])
env = self.build_env(target=target, is_build=True, uwp=uwp)
env = self.build_env(target=target, is_build=True, uwp=uwp, features=features)
self.ensure_bootstrapped(target=target)
self.ensure_clobbered()

View file

@ -562,9 +562,11 @@ class CommandBase(object):
return self.get_executable(destination_folder)
def needs_gstreamer_env(self, target, env, uwp=False):
def needs_gstreamer_env(self, target, env, uwp=False, features=[]):
if uwp:
return False
if "media-dummy" in features:
return False
try:
if check_gstreamer_lib():
return False
@ -620,7 +622,7 @@ install them, let us know by filing a bug!")
'vcdir': vcinstalldir,
}
def build_env(self, hosts_file_path=None, target=None, is_build=False, test_unit=False, uwp=False):
def build_env(self, hosts_file_path=None, target=None, is_build=False, test_unit=False, uwp=False, features=None):
"""Return an extended environment dictionary."""
env = os.environ.copy()
if sys.platform == "win32" and type(env['PATH']) == unicode:
@ -670,7 +672,7 @@ install them, let us know by filing a bug!")
# Always build harfbuzz from source
env["HARFBUZZ_SYS_NO_PKG_CONFIG"] = "true"
if is_build and self.needs_gstreamer_env(target or host_triple(), env, uwp):
if is_build and self.needs_gstreamer_env(target or host_triple(), env, uwp, features):
gstpath = gstreamer_root(target or host_triple(), env, self.get_top_dir())
extra_path += [path.join(gstpath, "bin")]
libpath = path.join(gstpath, "lib")
@ -790,6 +792,12 @@ install them, let us know by filing a bug!")
default=None,
help='Cross compile for given target platform',
),
CommandArgument(
'--media-stack',
default=None,
choices=["gstreamer", "dummy"],
help='Which media stack to use',
),
CommandArgument(
'--android',
default=None,
@ -854,13 +862,26 @@ install them, let us know by filing a bug!")
android = self.handle_android_target(target)
return target, android
# A guess about which platforms should use the gstreamer media stack
def pick_media_stack(self, media_stack, target):
if not(media_stack):
if (
not(target) or
("armv7" in target and "android" in target) or
("x86_64" in target)
):
media_stack = "gstreamer"
else:
media_stack = "dummy"
return ["media-" + media_stack]
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, with_layout_2020=False, without_wgl=False,
uwp=False,
uwp=False, media_stack=None,
):
env = env or self.build_env()
target, android = self.pick_target_triple(target, android, magicleap)

View file

@ -38,16 +38,23 @@ class MachCommands(CommandBase):
'params', default=None, nargs='...',
help="Command-line arguments to be passed through to cargo check")
@CommandBase.build_like_command_arguments
def check(self, params, **kwargs):
def check(self, params, features=[], media_stack=None, target=None,
android=False, magicleap=False, **kwargs):
if not params:
params = []
features = features or []
target, android = self.pick_target_triple(target, android, magicleap)
features += self.pick_media_stack(media_stack, target)
self.ensure_bootstrapped()
self.ensure_clobbered()
env = self.build_env()
build_start = time()
status = self.run_cargo_build_like_command("check", params, env=env, **kwargs)
status = self.run_cargo_build_like_command("check", params, env=env, features=features, **kwargs)
elapsed = time() - build_start
notify_build_done(self.config, elapsed, status == 0)

View file

@ -239,7 +239,8 @@ class PostBuildCommands(CommandBase):
'params', nargs='...',
help="Command-line arguments to be passed through to cargo doc")
@CommandBase.build_like_command_arguments
def doc(self, params, features, **kwargs):
def doc(self, params, features, target=None, android=False, magicleap=False,
media_stack=None, **kwargs):
env = os.environ.copy()
env["RUSTUP_TOOLCHAIN"] = self.toolchain()
rustc_path = check_output(["rustup" + BIN_SUFFIX, "which", "rustc"], env=env)
@ -268,6 +269,11 @@ class PostBuildCommands(CommandBase):
copy2(full_name, destination)
features = features or []
target, android = self.pick_target_triple(target, android, magicleap)
features += self.pick_media_stack(media_stack, target)
returncode = self.run_cargo_build_like_command("doc", params, features=features, **kwargs)
if returncode:
return returncode