perilus

RISC-V processor built with Chisel
git clone https://git.bradleygannon.com/perilus.git
Log | Files | Refs | Submodules | README

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 }