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