Expose a single function for bindings mod in build_gecko.

This commit is contained in:
Xidorn Quan 2017-04-14 17:38:34 +08:00
parent c171ded902
commit 1d6ede3245

View file

@ -276,7 +276,7 @@ mod bindings {
} }
} }
pub fn generate_structs(build_type: BuildType) { fn generate_structs(build_type: BuildType) {
let mut builder = Builder::get_initial_builder(build_type) let mut builder = Builder::get_initial_builder(build_type)
.enable_cxx_namespaces() .enable_cxx_namespaces()
.with_codegen_config(CodegenConfig { .with_codegen_config(CodegenConfig {
@ -565,7 +565,7 @@ mod bindings {
write_binding_file(builder, structs_file(build_type), &fixups); write_binding_file(builder, structs_file(build_type), &fixups);
} }
pub fn setup_logging() { fn setup_logging() -> bool {
use log; use log;
struct BuildLogger { struct BuildLogger {
@ -594,20 +594,23 @@ mod bindings {
} }
} }
log::set_logger(|log_level| { if let Ok(path) = env::var("STYLO_BUILD_LOG") {
log_level.set(log::LogLevelFilter::Debug); log::set_logger(|log_level| {
Box::new(BuildLogger { log_level.set(log::LogLevelFilter::Debug);
file: env::var("STYLO_BUILD_LOG").ok().and_then(|path| { Box::new(BuildLogger {
fs::File::create(path).ok().map(Mutex::new) file: fs::File::create(path).ok().map(Mutex::new),
}), filter: env::var("STYLO_BUILD_FILTER").ok()
filter: env::var("STYLO_BUILD_FILTER").ok() .unwrap_or_else(|| "bindgen".to_owned()),
.unwrap_or_else(|| "bindgen".to_owned()), })
}) })
}) .expect("Failed to set logger.");
.expect("Failed to set logger."); true
} else {
false
}
} }
pub fn generate_bindings() { fn generate_bindings() {
let mut builder = Builder::get_initial_builder(BuildType::Release) let mut builder = Builder::get_initial_builder(BuildType::Release)
.disable_name_namespacing() .disable_name_namespacing()
.with_codegen_config(CodegenConfig { .with_codegen_config(CodegenConfig {
@ -810,6 +813,27 @@ mod bindings {
} }
write_binding_file(builder, BINDINGS_FILE, &Vec::new()); write_binding_file(builder, BINDINGS_FILE, &Vec::new());
} }
pub fn generate() {
use std::thread;
macro_rules! run_tasks {
($($task:expr,)+) => {
if setup_logging() {
$($task;)+
} else {
let threads = vec![$( thread::spawn(|| $task) ),+];
for thread in threads.into_iter() {
thread.join().unwrap();
}
}
}
}
run_tasks! {
generate_structs(BuildType::Debug),
generate_structs(BuildType::Release),
generate_bindings(),
}
}
} }
#[cfg(not(feature = "bindgen"))] #[cfg(not(feature = "bindgen"))]
@ -822,40 +846,30 @@ mod bindings {
static ref BINDINGS_PATH: PathBuf = Path::new(file!()).parent().unwrap().join("gecko_bindings"); static ref BINDINGS_PATH: PathBuf = Path::new(file!()).parent().unwrap().join("gecko_bindings");
} }
pub fn setup_logging() {} fn generate_structs(build_type: BuildType) {
pub fn generate_structs(build_type: BuildType) {
let file = structs_file(build_type); let file = structs_file(build_type);
let source = BINDINGS_PATH.join(file); let source = BINDINGS_PATH.join(file);
println!("cargo:rerun-if-changed={}", source.display()); println!("cargo:rerun-if-changed={}", source.display());
fs::copy(source, OUTDIR_PATH.join(file)).unwrap(); fs::copy(source, OUTDIR_PATH.join(file)).unwrap();
} }
pub fn generate_bindings() { fn generate_bindings() {
let source = BINDINGS_PATH.join(BINDINGS_FILE); let source = BINDINGS_PATH.join(BINDINGS_FILE);
println!("cargo:rerun-if-changed={}", source.display()); println!("cargo:rerun-if-changed={}", source.display());
fs::copy(source, OUTDIR_PATH.join(BINDINGS_FILE)).unwrap(); fs::copy(source, OUTDIR_PATH.join(BINDINGS_FILE)).unwrap();
} }
pub fn generate() {
generate_structs(BuildType::Debug);
generate_structs(BuildType::Release);
generate_bindings();
}
} }
pub fn generate() { pub fn generate() {
use self::common::*; use self::common::*;
use std::{env, fs, thread}; use std::fs;
println!("cargo:rerun-if-changed=build_gecko.rs"); println!("cargo:rerun-if-changed=build_gecko.rs");
fs::create_dir_all(&*OUTDIR_PATH).unwrap(); fs::create_dir_all(&*OUTDIR_PATH).unwrap();
bindings::setup_logging(); bindings::generate();
if env::var("STYLO_BUILD_LOG").is_ok() {
bindings::generate_structs(BuildType::Debug);
bindings::generate_structs(BuildType::Release);
bindings::generate_bindings();
} else {
let threads = vec![
thread::spawn(|| bindings::generate_structs(BuildType::Debug)),
thread::spawn(|| bindings::generate_structs(BuildType::Release)),
thread::spawn(|| bindings::generate_bindings()),
];
for t in threads.into_iter() {
t.join().unwrap();
}
}
} }