aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/build.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/build.rs')
-rw-r--r--components/script/build.rs58
1 files changed, 37 insertions, 21 deletions
diff --git a/components/script/build.rs b/components/script/build.rs
index 1e98ab5382c..2699c533c6a 100644
--- a/components/script/build.rs
+++ b/components/script/build.rs
@@ -9,7 +9,7 @@ use std::fmt;
use std::fs::File;
use std::io::Write;
use std::path::PathBuf;
-use std::str;
+use std::process::Command;
use std::time::Instant;
fn main() {
@@ -17,30 +17,22 @@ fn main() {
let style_out_dir = PathBuf::from(env::var_os("DEP_SERVO_STYLE_CRATE_OUT_DIR").unwrap());
let out_dir = PathBuf::from(env::var_os("OUT_DIR").unwrap());
- let json = "css-properties.json";
- std::fs::copy(style_out_dir.join(json), out_dir.join(json)).unwrap();
+ let target_dir = PathBuf::from(env::var_os("CARGO_TARGET_DIR").unwrap());
- // This must use the Ninja generator -- it's the only one that
- // parallelizes cmake's output properly. (Cmake generates
- // separate makefiles, each of which try to build
- // ParserResults.pkl, and then stomp on eachother.)
- let mut build = cmake::Config::new(".");
-
- let target = env::var("TARGET").unwrap();
- if target.contains("windows-msvc") {
- // We must use Ninja on Windows for this -- msbuild is painfully slow,
- // and ninja is easier to install than make.
- build.generator("Ninja");
+ let status = Command::new(find_python())
+ .arg("dom/bindings/codegen/run.py")
+ .arg(style_out_dir.join("css-properties.json"))
+ .arg(&out_dir)
+ .arg(target_dir.join("doc").join("servo"))
+ .status()
+ .unwrap();
+ if !status.success() {
+ std::process::exit(1)
}
- build.build();
-
- println!(
- "Binding generation completed in {}s",
- start.elapsed().as_secs()
- );
+ println!("Binding generation completed in {:?}", start.elapsed());
- let json = out_dir.join("build").join("InterfaceObjectMapData.json");
+ let json = out_dir.join("InterfaceObjectMapData.json");
let json: Value = serde_json::from_reader(File::open(&json).unwrap()).unwrap();
let mut map = phf_codegen::Map::new();
for (key, value) in json.as_object().unwrap() {
@@ -74,3 +66,27 @@ impl<'a> phf_shared::PhfHash for Bytes<'a> {
self.0.as_bytes().phf_hash(hasher)
}
}
+
+fn find_python() -> String {
+ env::var("PYTHON").ok().unwrap_or_else(|| {
+ let candidates = if cfg!(windows) {
+ ["python2.7.exe", "python27.exe", "python.exe"]
+ } else {
+ ["python2.7", "python2", "python"]
+ };
+ for &name in &candidates {
+ if Command::new(name)
+ .arg("--version")
+ .output()
+ .ok()
+ .map_or(false, |out| out.status.success())
+ {
+ return name.to_owned();
+ }
+ }
+ panic!(
+ "Can't find python (tried {})! Try fixing PATH or setting the PYTHON env var",
+ candidates.join(", ")
+ )
+ })
+}