use std::env;
fn main() {
let llvm_path =
env::var("MU_LLVM_PATH").unwrap_or("/usr/local/mu_library/mu_llvm/llvm-18.1".to_string());
let mu_lib_path = env::var("MU_LIB_PATH").unwrap_or("/usr/local/mu_library/mu/".to_string());
eprintln!("[mu_lib build.rs] Build script executing...");
eprintln!("[mu_lib build.rs] LLVM path: {}", llvm_path);
eprintln!("[mu_lib build.rs] MU library path: {}", mu_lib_path);
println!("cargo:rerun-if-changed=src");
let linker_path = format!("{}/bin/ld.lld", llvm_path);
println!("cargo:rustc-linker={}", linker_path);
eprintln!("[mu_lib build.rs] Linker path: {}", linker_path);
let builtins_rv_path = format!("{}/builtins-rv", llvm_path);
println!("cargo:rustc-link-search={}", builtins_rv_path);
println!("cargo:rustc-link-lib=clang_rt.builtins-riscv64");
let linker_script_path = format!("{}/script/mu_linker.ld", mu_lib_path);
println!("cargo:rustc-link-args=-T{}", linker_script_path);
eprintln!(
"[mu_lib build.rs] Linker script path: {}",
linker_script_path
);
let picolibc_newlib_path = format!("{}/picolibc-rv/newlib", llvm_path);
println!("cargo:rustc-link-search={}", picolibc_newlib_path);
eprintln!("[mu_lib build.rs] Picolibc path: {}", picolibc_newlib_path);
let mu_lib_search_path = format!("{}/lib", mu_lib_path);
println!("cargo:rustc-link-search={}", mu_lib_search_path);
eprintln!(
"[mu_lib build.rs] MU library search path: {}",
mu_lib_search_path
);
println!("cargo:rustc-link-lib=mu_std");
eprintln!("[mu_lib build.rs] Library to link: mu_std");
if env::var("DOCS_RS").is_ok() {
eprintln!("[mu_lib build.rs] Skipping cc compilation for docs.rs build");
return;
}
let target = env::var("TARGET").unwrap_or_default();
if !target.contains("riscv64") {
eprintln!(
"[mu_lib build.rs] Skipping cc compilation for non-RISC-V target: {}",
target
);
return;
}
let startup_path = format!("{}/script/mu_startup.s", mu_lib_path);
let clang_path = format!("{}/bin/clang", llvm_path);
println!("cargo:rerun-if-changed={}", startup_path);
cc::Build::new()
.file(startup_path)
.compiler(clang_path)
.target("riscv64-unknown-none-elf")
.flag("-c")
.flag("-march=rv64imfdxmetis")
.flag("-fno-pie")
.flag("-Wno-unused-command-line-argument")
.compile("startup");
}