build.rs (1753B)
1 use std::{env, error::Error, path::PathBuf, process::Command}; 2 3 fn main() -> Result<(), Box<dyn Error>> { 4 let verilator_command_output = Command::new("verilator") 5 .arg("--getenv") 6 .arg("VERILATOR_ROOT") 7 .output()?; 8 if !verilator_command_output.status.success() { 9 return Err("Failed to get VERILATOR_ROOT. Is Verilator installed?".into()); 10 } 11 let verilator_root = match String::from_utf8(verilator_command_output.stdout) { 12 Ok(s) => s.trim().to_string(), 13 Err(e) => { 14 return Err(format!("Failed to parse Verilator command output as UTF-8: {e}").into()); 15 } 16 }; 17 18 let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR")?); 19 let verilated_dir = manifest_dir.join("../../verilated"); 20 21 unsafe { 22 env::set_var("CC", "gcc"); 23 env::set_var("CXX", "g++"); 24 } 25 26 cc::Build::new() 27 .cpp(true) 28 .include(format!("{verilator_root}/include")) 29 .include(format!("{verilator_root}/include/vltstd")) 30 .include(&verilated_dir) 31 .warnings(false) 32 .file("src/wrapper.cpp") 33 .file(format!("{verilator_root}/include/verilated_vcd_c.cpp")) 34 .compile("wrapper"); 35 36 println!("cargo:rustc-link-search=native={}", verilated_dir.display()); 37 println!("cargo:rustc-link-lib=static=VPerilus"); 38 println!("cargo:rustc-link-lib=static=verilated"); 39 println!("cargo:rustc-link-lib=dylib=stdc++"); 40 41 println!("cargo::rerun-if-changed=./src/wrapper.cpp"); 42 println!( 43 "cargo::rerun-if-changed={}", 44 verilated_dir.join("libverilated.a").display() 45 ); 46 println!( 47 "cargo::rerun-if-changed={}", 48 verilated_dir.join("libVPerilus.a").display() 49 ); 50 51 Ok(()) 52 }