| // 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() |
| } |
| } |