sdsl/backend/
mod.rs

1use anyhow::{format_err, Result};
2
3mod analyse;
4mod common;
5pub mod sdsl_c;
6
7/// Build the SDSL interface backend.
8///
9/// This function should be executed in the project's [build script](https://doc.rust-lang.org/cargo/reference/build-scripts.html).
10/// It analyses the project's code base and builds a suitable SDSL interface backend.
11///
12/// # Example
13/// ```ignore
14/// // build.rs
15/// fn main() {
16///     match sdsl::build() {
17///         Ok(_) => {}
18///         Err(e) => panic!("Error: {}", e),
19///     };
20/// }
21/// ```
22/// A working example can be found [here](https://github.com/sdsl-rs/sdsl-rs/blob/master/examples/build.rs).
23pub 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}