Skip to content

Commit

Permalink
move stylo_test build script guts from Python to Rust
Browse files Browse the repository at this point in the history
stylo_test's build script is split between Python and Rust.  style's
build script already has to perform complicated dances to determine an
appropriate binary to execute, depending on the platform.  To avoid
copying and pasting that code, it seems reasonable to simply port the
Python code into Rust, thus making the relationship between generated
files and the cargo dependency output clearer.  The new Rust is somewhat
more verbose, but not terribly so.
  • Loading branch information
froydnj committed Aug 1, 2017
1 parent b35791f commit 4773023
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 45 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions tests/unit/stylo/Cargo.toml
Expand Up @@ -26,3 +26,6 @@ selectors = {path = "../../../components/selectors", features = ["gecko_like_typ
size_of_test = {path = "../../../components/size_of_test"}
style_traits = {path = "../../../components/style_traits"}
style = {path = "../../../components/style", features = ["gecko"]}

[build-dependencies]
regex = "0.2"
63 changes: 53 additions & 10 deletions tests/unit/stylo/build.rs
Expand Up @@ -2,24 +2,67 @@
* 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 regex;

use regex::Regex;
use std::env;
use std::fs;
use std::io::Write;
use std::path;
use std::process::Command;
use std::fs::File;
use std::io::{BufRead, BufReader, Write};
use std::path::Path;

fn main() {
let root_path = Path::new("../../../");
let bindings_file = root_path.join("components/style/gecko/generated/bindings.rs");
let glue_file = root_path.join("ports/geckolib/glue.rs");

println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-changed=check_bindings.py");
println!("cargo:rerun-if-changed=../../../ports/geckolib/glue.rs");
println!("cargo:rerun-if-changed=../../../components/style/gecko_bindings/bindings.rs");
assert!(Command::new("python").arg("./check_bindings.py")
.spawn().unwrap().wait().unwrap().success());
println!("cargo:rerun-if-changed={}", glue_file.display());
println!("cargo:rerun-if-changed={}", bindings_file.display());

let env_out_dir = env::var("OUT_DIR").unwrap();
let out_dir = Path::new(&env_out_dir);

{
let output = out_dir.join("check_bindings.rs");
let r = BufReader::new(File::open(bindings_file).unwrap());
let mut w = File::create(output).unwrap();

w.write_all(b"fn assert_types() {\n").unwrap();

let matcher = Regex::new(r"fn\s*Servo_([a-zA-Z0-9_]+)\s*\(").unwrap();

for line in r.lines() {
let s = line.unwrap();
for cap in matcher.captures_iter(&s) {
// GetStyleVariables is a Servo_* function, but temporarily defined
// on the Gecko side.
if &cap[1] != "GetStyleVariables" {
w.write_all(format!(" [ Servo_{0}, bindings::Servo_{0} ];\n", &cap[1]).as_bytes()).unwrap();
}
}
}

w.write_all(b"}\n").unwrap();
}

{
let output = out_dir.join("glue.rs");
let r = BufReader::new(File::open(glue_file).unwrap());
let mut w = File::create(output).unwrap();

w.write_all(b"pub use style::gecko::arc_types::*;\n").unwrap();

for line in r.lines() {
let s = line.unwrap().replace("pub extern \"C\" fn", "pub unsafe extern \"C\" fn");
w.write_all(s.as_bytes()).unwrap();
w.write_all(b"\n").unwrap();
}
}

// https://github.com/rust-lang/cargo/issues/3544
let style_out_dir = env::var_os("DEP_FOR SOME REASON THE LINKS KEY IS REQUIRED \
TO PASS DATA AROUND BETWEEN BUILD SCRIPTS_OUT_DIR").unwrap();
fs::File::create(path::PathBuf::from(env::var_os("OUT_DIR").unwrap()).join("bindings.rs"))
File::create(out_dir.join("bindings.rs"))
.unwrap()
.write_all(format!("include!(concat!({:?}, \"/gecko/structs_debug.rs\"));",
style_out_dir).as_bytes())
Expand Down
35 changes: 0 additions & 35 deletions tests/unit/stylo/check_bindings.py

This file was deleted.

0 comments on commit 4773023

Please sign in to comment.