1use anyhow::{format_err, Result};
2
3mod analyse;
4mod common;
5pub mod sdsl_c;
6
7pub fn build() -> Result<()> {
24 simple_logger::SimpleLogger::new().init()?;
25
26 if common::skip_build() {
27 return Ok(());
28 }
29
30 let out_directory = std::env::var("OUT_DIR").map_err(|e| format_err!("{}", e))?;
31 let out_directory = std::path::PathBuf::from(&out_directory);
32
33 let crate_directory = get_crate_directory()?;
34 let code_meta = analyse::setup(&crate_directory, &out_directory)?;
35
36 let specifications = if let Some(code_meta) = code_meta {
37 analyse::analyse(&code_meta)?
38 } else {
39 log::debug!("Failed to generate code metadata for analysis. Exiting SDSL build.");
40 return Ok(());
41 };
42
43 let template_directory = sdsl_c::template::setup(&out_directory)?;
44 let interface_directory =
45 sdsl_c::specification::setup(&specifications, &template_directory, &out_directory)?;
46 let lib_path = sdsl_c::specification::compile(&interface_directory)?;
47 log::info!("Compilation complete. Library path: {}", lib_path.display());
48
49 println!("cargo:rerun-if-changed=./src");
50 Ok(())
51}
52
53fn get_crate_directory() -> Result<std::path::PathBuf> {
54 let cargo_manifest_dir = std::env::var_os("CARGO_MANIFEST_DIR").ok_or(format_err!(
55 "Failed to read env variable: CARGO_MANIFEST_DIR"
56 ))?;
57 Ok(std::path::PathBuf::from(&cargo_manifest_dir))
58}