perilus

git clone https://git.bradleygannon.com/perilus.git
Log | Files | Refs | Submodules | README

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 }