extern crate cmake; use cmake::Config; use std::env; use std::path::PathBuf; fn main() { let mut config = Config::new("src/mlx-c"); config.very_verbose(true); config.define("CMAKE_INSTALL_PREFIX", "."); #[cfg(debug_assertions)] { config.define("CMAKE_BUILD_TYPE", "Debug"); } #[cfg(not(debug_assertions))] { config.define("CMAKE_BUILD_TYPE", "Release"); } config.define("MLX_BUILD_METAL", "OFF"); config.define("MLX_BUILD_ACCELERATE", "OFF"); #[cfg(feature = "metal")] { config.define("MLX_BUILD_METAL", "ON"); } #[cfg(feature = "accelerate")] { config.define("MLX_BUILD_ACCELERATE", "ON"); } // build the mlx-c project let dst = config.build(); println!("cargo:rustc-link-search=native={}/build/lib", dst.display()); println!("cargo:rustc-link-lib=static=mlx"); println!("cargo:rustc-link-lib=static=mlxc"); println!("cargo:rustc-link-lib=c++"); println!("cargo:rustc-link-lib=dylib=objc"); println!("cargo:rustc-link-lib=framework=Foundation"); #[cfg(feature = "metal")] { println!("cargo:rustc-link-lib=framework=Metal"); } #[cfg(feature = "accelerate")] { println!("cargo:rustc-link-lib=framework=Accelerate"); } // generate bindings let bindings = bindgen::Builder::default() .header("src/mlx-c/mlx/c/mlx.h") .header("src/mlx-c/mlx/c/linalg.h") .header("src/mlx-c/mlx/c/error.h") .header("src/mlx-c/mlx/c/transforms_impl.h") .clang_arg("-Isrc/mlx-c") .parse_callbacks(Box::new(bindgen::CargoCallbacks::new())) .generate() .expect("Unable to generate bindings"); // Write the bindings to the $OUT_DIR/bindings.rs file. let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); bindings .write_to_file(out_path.join("bindings.rs")) .expect("Couldn't write bindings!"); }