diff options
Diffstat (limited to 'components/script/build.rs')
-rw-r--r-- | components/script/build.rs | 58 |
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(", ") + ) + }) +} |