build.rs (1428B)
1 use std::{env, error::Error, 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 unsafe { 19 env::set_var("CC", "gcc"); 20 env::set_var("CXX", "g++"); 21 } 22 23 cc::Build::new() 24 .cpp(true) 25 .include(format!("{verilator_root}/include")) 26 .include(format!("{verilator_root}/include/vltstd")) 27 .include("../verilated") 28 .warnings(false) 29 .file("src/wrapper.cpp") 30 .compile("wrapper"); 31 32 println!("cargo:rustc-link-search=native=../verilated"); 33 println!("cargo:rustc-link-lib=static=VPerilus"); 34 println!("cargo:rustc-link-lib=static=verilated"); 35 println!("cargo:rustc-link-lib=dylib=stdc++"); 36 37 println!("cargo::rerun-if-changed=./src/wrapper.cpp"); 38 println!("cargo::rerun-if-changed=../verilated/libverilated.a"); 39 println!("cargo::rerun-if-changed=../verilated/libVPerilus.a"); 40 41 Ok(()) 42 }