mlx-sys 0.7.0

Low-level interface and binding generation for the mlx library
use std::{path::Path, process::Command};

pub const LIBRARIES: &str = include_str!("../native-libraries.txt");

pub fn libraries(build: &Path) -> impl Iterator<Item = &'static str> + '_ {
    LIBRARIES
        .lines()
        .filter(|&name| name != "jaccl" || build.join("jaccl/libjaccl.a").is_file())
}

pub fn find_clang_rt_path() -> Option<String> {
    let output = Command::new("xcrun")
        .args(["--show-sdk-platform-path"])
        .output()
        .ok()?;

    if !output.status.success() {
        return None;
    }

    let output = Command::new("xcode-select")
        .args(["--print-path"])
        .output()
        .ok()?;

    if !output.status.success() {
        return None;
    }

    let developer_dir = String::from_utf8_lossy(&output.stdout).trim().to_string();
    let toolchain_base = format!(
        "{}/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang",
        developer_dir
    );

    let clang_dir = std::fs::read_dir(&toolchain_base).ok()?;
    for entry in clang_dir.flatten() {
        let darwin_path = entry.path().join("lib/darwin");
        let clang_rt_lib = darwin_path.join("libclang_rt.osx.a");
        if clang_rt_lib.exists() {
            return Some(darwin_path.to_string_lossy().to_string());
        }
    }

    None
}