diff options
Diffstat (limited to 'third_party/rust/cranelift-codegen/build.rs')
-rw-r--r-- | third_party/rust/cranelift-codegen/build.rs | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/third_party/rust/cranelift-codegen/build.rs b/third_party/rust/cranelift-codegen/build.rs new file mode 100644 index 0000000000..c456908845 --- /dev/null +++ b/third_party/rust/cranelift-codegen/build.rs @@ -0,0 +1,100 @@ +// Build script. +// +// This program is run by Cargo when building cranelift-codegen. It is used to generate Rust code from +// the language definitions in the cranelift-codegen/meta directory. +// +// Environment: +// +// OUT_DIR +// Directory where generated files should be placed. +// +// TARGET +// Target triple provided by Cargo. +// +// The build script expects to be run from the directory where this build.rs file lives. The +// current directory is used to find the sources. + +use cranelift_codegen_meta as meta; + +use std::env; +use std::process; +use std::time::Instant; + +fn main() { + let start_time = Instant::now(); + + let out_dir = env::var("OUT_DIR").expect("The OUT_DIR environment variable must be set"); + let target_triple = env::var("TARGET").expect("The TARGET environment variable must be set"); + + let new_backend_isas = if env::var("CARGO_FEATURE_X64").is_ok() { + // The x64 (new backend for x86_64) is a bit particular: it only requires generating + // the shared meta code; the only ISA-specific code is for settings. + vec![meta::isa::Isa::X86] + } else { + Vec::new() + }; + + // Configure isa targets using the old backend. + let isa_targets = meta::isa::Isa::all() + .iter() + .cloned() + .filter(|isa| { + let env_key = format!("CARGO_FEATURE_{}", isa.to_string().to_uppercase()); + env::var(env_key).is_ok() + }) + .collect::<Vec<_>>(); + + let old_backend_isas = if new_backend_isas.is_empty() && isa_targets.is_empty() { + // Try to match native target. + let target_name = target_triple.split('-').next().unwrap(); + let isa = meta::isa_from_arch(&target_name).expect("error when identifying target"); + println!("cargo:rustc-cfg=feature=\"{}\"", isa); + vec![isa] + } else { + isa_targets + }; + + let cur_dir = env::current_dir().expect("Can't access current working directory"); + let crate_dir = cur_dir.as_path(); + + // Make sure we rebuild if this build script changes (will not happen with + // if the path to this file contains non-UTF-8 bytes). + println!( + "cargo:rerun-if-changed={}", + crate_dir.join("build.rs").to_str().unwrap() + ); + + if let Err(err) = meta::generate(&old_backend_isas, &new_backend_isas, &out_dir) { + eprintln!("Error: {}", err); + process::exit(1); + } + + if env::var("CRANELIFT_VERBOSE").is_ok() { + for isa in &old_backend_isas { + println!( + "cargo:warning=Includes old-backend support for {} ISA", + isa.to_string() + ); + } + for isa in &new_backend_isas { + println!( + "cargo:warning=Includes new-backend support for {} ISA", + isa.to_string() + ); + } + println!( + "cargo:warning=Build step took {:?}.", + Instant::now() - start_time + ); + println!("cargo:warning=Generated files are in {}", out_dir); + } + + #[cfg(feature = "rebuild-peephole-optimizers")] + { + std::fs::write( + std::path::Path::new(&out_dir).join("CRANELIFT_CODEGEN_PATH"), + cur_dir.to_str().unwrap(), + ) + .unwrap() + } +} |