From 6b16e712e79b3d97863745c291c3d4e1873db4af Mon Sep 17 00:00:00 2001 From: OJ Kwon Date: Fri, 16 Mar 2018 14:14:03 -0700 Subject: [PATCH 1/5] build(mach): generate webrender revision via cargo lockfile --- .gitignore | 1 + python/servo/command_base.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/.gitignore b/.gitignore index 35b7815ab7e..d5416de8067 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ Servo.app .config.mk.last /glfw capture_webrender/ +/components/compositing/webrender_revision.rs # Editors diff --git a/python/servo/command_base.py b/python/servo/command_base.py index a200fa05f24..b36aa5bbe2b 100644 --- a/python/servo/command_base.py +++ b/python/servo/command_base.py @@ -213,6 +213,36 @@ def set_osmesa_env(bin_path, env): return env +def generate_webrender_revision(): + """Read current package id of web render to generate revision""" + + lockfile_path = path.join(os.getcwd(), "Cargo.lock") + if not os.path.isfile(lockfile_path): + return + + with open(lockfile_path) as f: + lockfile = toml.loads(f.read()) + + webrender_revision = "" + for package in lockfile.get("package", []): + pkgName = package.get("name") + if ("webrender" == pkgName): + webrender_revision = package.get("source") + + revision = '''/* 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/. */ + +/// auto-generated by mach. do not manually modify. +pub const REVISION: &'static str = \"%s\";''' % webrender_revision + + compositor_path = os.path.join(os.getcwd(), "components", "compositing", "webrender_revision.rs") + + revision_file = open(compositor_path, "w") + revision_file.write(revision) + revision_file.close() + + class BuildNotFound(Exception): def __init__(self, message): self.message = message @@ -660,6 +690,8 @@ class CommandBase(object): if "msvc" in target_platform: Registrar.dispatch("bootstrap", context=self.context) + generate_webrender_revision() + self.context.bootstrapped = True def ensure_clobbered(self, target_dir=None): From 0671fcb5c7d2a8a0a3178937a55f5b31d452db9c Mon Sep 17 00:00:00 2001 From: OJ Kwon Date: Fri, 16 Mar 2018 14:14:31 -0700 Subject: [PATCH 2/5] feat(capture_webrender): write webrender revision into text --- components/compositing/compositor.rs | 22 ++++++++++++++++++++-- components/compositing/lib.rs | 1 + 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/components/compositing/compositor.rs b/components/compositing/compositor.rs index 2b409b7ae3d..4f1575e3b49 100644 --- a/components/compositing/compositor.rs +++ b/components/compositing/compositor.rs @@ -24,7 +24,8 @@ use servo_config::opts; use servo_geometry::{DeviceIndependentPixel, DeviceUintLength}; use std::collections::HashMap; use std::env; -use std::fs::File; +use std::fs::{File, create_dir_all}; +use std::io::Write; use std::rc::Rc; use std::sync::mpsc::Sender; use std::time::{Duration, Instant}; @@ -36,6 +37,7 @@ use touch::{TouchHandler, TouchAction}; use webrender; use webrender_api::{self, DeviceIntPoint, DevicePoint, DeviceUintRect, DeviceUintSize, HitTestFlags, HitTestResult}; use webrender_api::{LayoutVector2D, ScrollEventPhase, ScrollLocation}; +use webrender_revision::REVISION; use windowing::{self, MouseWindowEvent, WebRenderDebugOption, WindowMethods}; #[derive(Debug, PartialEq)] @@ -1540,9 +1542,25 @@ impl IOCompositor { Ok(current_dir) => { let capture_id = now().to_timespec().sec.to_string(); let capture_path = current_dir.join("capture_webrender").join(capture_id); + let revision_file_path = capture_path.join("wr.txt"); + + if let Err(err) = create_dir_all(&capture_path) { + println!("Unable to create path '{:?}' for capture: {:?}", capture_path, err); + return + } + self.webrender_api.save_capture(capture_path, webrender_api::CaptureBits::all()); + + match File::create(revision_file_path) { + Ok(mut file) => { + if let Err(err) = write!(&mut file, "{}", REVISION) { + println!("Unable to write webrender revision: {:?}", err) + } + } + Err(err) => println!("Capture triggered, creating webrender revision info skipped: {:?}", err) + } }, - Err(err) => println!("could not locate path to save captures: {:?}", err) + Err(err) => println!("Unable to locate path to save captures: {:?}", err) } } } diff --git a/components/compositing/lib.rs b/components/compositing/lib.rs index e1a870f9695..98f1a99a406 100644 --- a/components/compositing/lib.rs +++ b/components/compositing/lib.rs @@ -39,6 +39,7 @@ use style_traits::CSSPixel; mod compositor; pub mod compositor_thread; mod touch; +mod webrender_revision; pub mod windowing; pub struct SendableFrameTree { From f9230975f54c3777219ba09d784557b3841f7acc Mon Sep 17 00:00:00 2001 From: OJ Kwon Date: Mon, 19 Mar 2018 13:44:51 -0700 Subject: [PATCH 3/5] refactor(build): generate revision via build.rs --- Cargo.lock | 1 + components/compositing/Cargo.toml | 4 ++ components/compositing/build.rs | 65 +++++++++++++++++++++++++++++++ python/servo/command_base.py | 32 --------------- 4 files changed, 70 insertions(+), 32 deletions(-) create mode 100644 components/compositing/build.rs diff --git a/Cargo.lock b/Cargo.lock index 933bfb90757..a852132f868 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -431,6 +431,7 @@ dependencies = [ "servo_url 0.0.1", "style_traits 0.0.1", "time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "webrender 0.57.0 (git+https://github.com/servo/webrender)", "webrender_api 0.57.0 (git+https://github.com/servo/webrender)", ] diff --git a/components/compositing/Cargo.toml b/components/compositing/Cargo.toml index 736fef8a57d..03255d90ffa 100644 --- a/components/compositing/Cargo.toml +++ b/components/compositing/Cargo.toml @@ -4,6 +4,7 @@ version = "0.0.1" authors = ["The Servo Project Developers"] license = "MPL-2.0" publish = false +build = "build.rs" [lib] name = "compositing" @@ -29,3 +30,6 @@ style_traits = {path = "../style_traits"} time = "0.1.17" webrender = {git = "https://github.com/servo/webrender", features = ["capture"]} webrender_api = {git = "https://github.com/servo/webrender", features = ["ipc"]} + +[build-dependencies] +toml = "0.4.5" diff --git a/components/compositing/build.rs b/components/compositing/build.rs new file mode 100644 index 00000000000..d5c18728dc9 --- /dev/null +++ b/components/compositing/build.rs @@ -0,0 +1,65 @@ +/* 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/. */ + +extern crate toml; + +use std::env; +use std::fs::File; +use std::io::{Read, Write}; + +const WEBRENDER_REVISION_TEMPLATE: &'static str = +"/* 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/. */ + +/// auto-generated by cargo. do not manually modify. +pub const REVISION: &'static str = "; + +fn main() { + let current_path = env::current_dir().expect("Failed to access path to lockfile"); + let lockfile_path = current_path.join("..").join("..").join("Cargo.lock"); + let revision_file_path = current_path.join("webrender_revision.rs"); + + let mut existing_revision_exported = String::new(); + match File::open(&revision_file_path) { + Ok(mut f) => { + f.read_to_string(&mut existing_revision_exported).unwrap_or_default(); + }, + Err(_) => () + } + + let mut lockfile = String::new(); + File::open(lockfile_path).expect("Cannot open lockfile") + .read_to_string(&mut lockfile) + .expect("Failed to read lockfile"); + + match toml::from_str::(&lockfile) { + Ok(result) => { + let packages = result.get("package").expect("Cargo lockfile should contain package list"); + + match *packages { + toml::Value::Array(ref arr) => { + let source = arr + .iter() + .find(|pkg| pkg.get("name").and_then(|name| name.as_str()).unwrap_or("") == "webrender") + .and_then(|pkg| pkg.get("source").and_then(|source| source.as_str())) + .unwrap_or("unknown"); + + let parsed: Vec<&str> = source.split("#").collect(); + let revision = if parsed.len() > 1 { parsed[1] } else { source }; + + if let Some(_) = existing_revision_exported.find(revision) { + return + } + + let revision_contents = format!("{}\"{}\";", WEBRENDER_REVISION_TEMPLATE, revision); + let mut revision_module_file = File::create(&revision_file_path).unwrap(); + write!(&mut revision_module_file, "{}", revision_contents).unwrap(); + }, + _ => panic!("Cannot find package definitions in lockfile") + } + }, + Err(e) => panic!(e) + } +} diff --git a/python/servo/command_base.py b/python/servo/command_base.py index b36aa5bbe2b..a200fa05f24 100644 --- a/python/servo/command_base.py +++ b/python/servo/command_base.py @@ -213,36 +213,6 @@ def set_osmesa_env(bin_path, env): return env -def generate_webrender_revision(): - """Read current package id of web render to generate revision""" - - lockfile_path = path.join(os.getcwd(), "Cargo.lock") - if not os.path.isfile(lockfile_path): - return - - with open(lockfile_path) as f: - lockfile = toml.loads(f.read()) - - webrender_revision = "" - for package in lockfile.get("package", []): - pkgName = package.get("name") - if ("webrender" == pkgName): - webrender_revision = package.get("source") - - revision = '''/* 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/. */ - -/// auto-generated by mach. do not manually modify. -pub const REVISION: &'static str = \"%s\";''' % webrender_revision - - compositor_path = os.path.join(os.getcwd(), "components", "compositing", "webrender_revision.rs") - - revision_file = open(compositor_path, "w") - revision_file.write(revision) - revision_file.close() - - class BuildNotFound(Exception): def __init__(self, message): self.message = message @@ -690,8 +660,6 @@ class CommandBase(object): if "msvc" in target_platform: Registrar.dispatch("bootstrap", context=self.context) - generate_webrender_revision() - self.context.bootstrapped = True def ensure_clobbered(self, target_dir=None): From b957f6aad77645b2b355bed568ae63db27c88504 Mon Sep 17 00:00:00 2001 From: OJ Kwon Date: Mon, 19 Mar 2018 14:47:30 -0700 Subject: [PATCH 4/5] refactor(build): generate revision into out_dir --- .gitignore | 1 - components/compositing/build.rs | 29 ++++------------------------ components/compositing/compositor.rs | 4 ++-- components/compositing/lib.rs | 1 - 4 files changed, 6 insertions(+), 29 deletions(-) diff --git a/.gitignore b/.gitignore index d5416de8067..35b7815ab7e 100644 --- a/.gitignore +++ b/.gitignore @@ -23,7 +23,6 @@ Servo.app .config.mk.last /glfw capture_webrender/ -/components/compositing/webrender_revision.rs # Editors diff --git a/components/compositing/build.rs b/components/compositing/build.rs index d5c18728dc9..db081f795ad 100644 --- a/components/compositing/build.rs +++ b/components/compositing/build.rs @@ -7,27 +7,11 @@ extern crate toml; use std::env; use std::fs::File; use std::io::{Read, Write}; - -const WEBRENDER_REVISION_TEMPLATE: &'static str = -"/* 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/. */ - -/// auto-generated by cargo. do not manually modify. -pub const REVISION: &'static str = "; +use std::path::Path; fn main() { - let current_path = env::current_dir().expect("Failed to access path to lockfile"); - let lockfile_path = current_path.join("..").join("..").join("Cargo.lock"); - let revision_file_path = current_path.join("webrender_revision.rs"); - - let mut existing_revision_exported = String::new(); - match File::open(&revision_file_path) { - Ok(mut f) => { - f.read_to_string(&mut existing_revision_exported).unwrap_or_default(); - }, - Err(_) => () - } + let lockfile_path = Path::new(&env::var("CARGO_MANIFEST_DIR").unwrap()).join("..").join("..").join("Cargo.lock"); + let revision_file_path = Path::new(&env::var_os("OUT_DIR").unwrap()).join("webrender_revision.rs"); let mut lockfile = String::new(); File::open(lockfile_path).expect("Cannot open lockfile") @@ -49,13 +33,8 @@ fn main() { let parsed: Vec<&str> = source.split("#").collect(); let revision = if parsed.len() > 1 { parsed[1] } else { source }; - if let Some(_) = existing_revision_exported.find(revision) { - return - } - - let revision_contents = format!("{}\"{}\";", WEBRENDER_REVISION_TEMPLATE, revision); let mut revision_module_file = File::create(&revision_file_path).unwrap(); - write!(&mut revision_module_file, "{}", revision_contents).unwrap(); + write!(&mut revision_module_file, "{}", format!("\"{}\"", revision)).unwrap(); }, _ => panic!("Cannot find package definitions in lockfile") } diff --git a/components/compositing/compositor.rs b/components/compositing/compositor.rs index 4f1575e3b49..8a4b1904a21 100644 --- a/components/compositing/compositor.rs +++ b/components/compositing/compositor.rs @@ -37,7 +37,6 @@ use touch::{TouchHandler, TouchAction}; use webrender; use webrender_api::{self, DeviceIntPoint, DevicePoint, DeviceUintRect, DeviceUintSize, HitTestFlags, HitTestResult}; use webrender_api::{LayoutVector2D, ScrollEventPhase, ScrollLocation}; -use webrender_revision::REVISION; use windowing::{self, MouseWindowEvent, WebRenderDebugOption, WindowMethods}; #[derive(Debug, PartialEq)] @@ -1553,7 +1552,8 @@ impl IOCompositor { match File::create(revision_file_path) { Ok(mut file) => { - if let Err(err) = write!(&mut file, "{}", REVISION) { + let revision = include!(concat!(env!("OUT_DIR"), "/webrender_revision.rs")); + if let Err(err) = write!(&mut file, "{}", revision) { println!("Unable to write webrender revision: {:?}", err) } } diff --git a/components/compositing/lib.rs b/components/compositing/lib.rs index 98f1a99a406..e1a870f9695 100644 --- a/components/compositing/lib.rs +++ b/components/compositing/lib.rs @@ -39,7 +39,6 @@ use style_traits::CSSPixel; mod compositor; pub mod compositor_thread; mod touch; -mod webrender_revision; pub mod windowing; pub struct SendableFrameTree { From 5f6977306c05ae92c588d50710b7c5751c8cab61 Mon Sep 17 00:00:00 2001 From: OJ Kwon Date: Mon, 19 Mar 2018 15:55:06 -0700 Subject: [PATCH 5/5] style(capture_webrender): use eprintln for error output --- components/compositing/compositor.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/components/compositing/compositor.rs b/components/compositing/compositor.rs index 8a4b1904a21..2f1b3ceed89 100644 --- a/components/compositing/compositor.rs +++ b/components/compositing/compositor.rs @@ -1544,7 +1544,7 @@ impl IOCompositor { let revision_file_path = capture_path.join("wr.txt"); if let Err(err) = create_dir_all(&capture_path) { - println!("Unable to create path '{:?}' for capture: {:?}", capture_path, err); + eprintln!("Unable to create path '{:?}' for capture: {:?}", capture_path, err); return } @@ -1554,13 +1554,13 @@ impl IOCompositor { Ok(mut file) => { let revision = include!(concat!(env!("OUT_DIR"), "/webrender_revision.rs")); if let Err(err) = write!(&mut file, "{}", revision) { - println!("Unable to write webrender revision: {:?}", err) + eprintln!("Unable to write webrender revision: {:?}", err) } } - Err(err) => println!("Capture triggered, creating webrender revision info skipped: {:?}", err) + Err(err) => eprintln!("Capture triggered, creating webrender revision info skipped: {:?}", err) } }, - Err(err) => println!("Unable to locate path to save captures: {:?}", err) + Err(err) => eprintln!("Unable to locate path to save captures: {:?}", err) } } }