// Ref: Sha Miao, rv32m1_ri5cy-example/build.rs use std::env; use std::fs; use std::path::PathBuf; const MISSING_CARGO_ENV: &str = "Missing environment variables provided by Cargo."; /// Include `.a` files generated by assembly codes fn include_a_files(out_dir: &str) { let target = env::var("TARGET").expect(MISSING_CARGO_ENV); let out_dir = PathBuf::from(out_dir); let name = env::var("CARGO_PKG_NAME").expect(MISSING_CARGO_ENV); if &target == "riscv32imac-unknown-none-elf" { fs::copy( format!("bin/{}.a", target), out_dir.join(format!("lib{}.a", name)), ) .unwrap(); println!("cargo:rustc-link-lib=static={}", name); println!("cargo:rustc-link-search={}", out_dir.display()); println!("cargo:rerun-if-changed=bin/{}.a", target); } } fn linker_script() { println!("cargo:rustc-link-arg-bins=-Tmemory.x"); println!("cargo:rustc-link-arg-bins=-Tlink.x"); } /// Build script for the crate. fn main() { let out_dir = env::var("OUT_DIR").expect(MISSING_CARGO_ENV); include_a_files(&out_dir); linker_script(); println!("cargo:rerun-if-changed=build.rs"); }