ctranslate2-src-build-support 0.2.1

Build support for ctranslate2-src
Documentation
use std::{env, path::PathBuf};

use cmake::Config;

use crate::download;

pub fn build_dnnl(link: bool) {
    let out_dir = if let Ok(dir) = env::var("CARGO_TARGET_DIR") {
        PathBuf::from(dir)
    } else {
        let manifest_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
        PathBuf::from(manifest_dir).join("target")
    }
    .join("dnnl");
    let dnnl_version = "3.1.1";
    let dnnl_archive = format!("v{}.tar.gz", dnnl_version);
    let dnnl_url = format!(
        "https://github.com/oneapi-src/oneDNN/archive/refs/tags/{}",
        dnnl_archive
    );

    let source_dir = out_dir.join(format!("oneDNN-{}", dnnl_version));

    if !source_dir.exists() {
        if download::download(&dnnl_url, &out_dir) != 200 {
            panic!("Failed to download oneDNN");
        }
    }
    let mut cmake = Config::new(source_dir);

    let dst = cmake
        .define("CMAKE_POLICY_VERSION_MINIMUM", "3.5")
        .define("ONEDNN_LIBRARY_TYPE", "STATIC")
        .define("ONEDNN_BUILD_EXAMPLES", "OFF")
        .define("ONEDNN_BUILD_TESTS", "OFF")
        .define("ONEDNN_ENABLE_WORKLOAD", "INFERENCE")
        .define("ONEDNN_ENABLE_PRIMITIVE", "CONVOLUTION;REORDER")
        .define("ONEDNN_BUILD_GRAPH", "OFF")
        .build();
    println!("cargo:rustc-link-search=native={}/lib", dst.display());
    if link {
        println!("cargo:rustc-link-lib=static=dnnl");
    }
    println!("cargo:include={}/include", dst.display());
}