use std::env;
use std::process::Command;
use std::path::Path;
fn main() {
if cfg!(target_os = "macos") && env::var("TARGET").map(|t| t == "wasm32-unknown-unknown").unwrap_or(false) {
check_llvm_setup().unwrap_or_else(|e| {
eprintln!("Error: {}", e);
std::process::exit(1);
});
}
}
fn check_llvm_setup() -> Result<(), String> {
if !cfg!(target_os = "macos") {
return Ok(());
}
if !Command::new("brew").arg("--version").output().is_ok() {
return Err("Homebrew is not installed. Please install it first:\n\
/bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"".to_string());
}
let llvm_path = Path::new("/opt/homebrew/opt/llvm");
if !llvm_path.exists() {
return Err("LLVM is not installed. Please run: brew install llvm".to_string());
}
let clang_path = llvm_path.join("bin/clang");
let llvm_ar_path = llvm_path.join("bin/llvm-ar");
if !clang_path.exists() {
return Err(format!("clang not found in {}", clang_path.display()));
}
if !llvm_ar_path.exists() {
return Err(format!("llvm-ar not found in {}", llvm_ar_path.display()));
}
let path = env::var("PATH").unwrap_or_default();
let cc = env::var("CC").unwrap_or_default();
let ar = env::var("AR").unwrap_or_default();
let llvm_bin_path = llvm_path.join("bin").to_string_lossy().to_string();
if !path.contains(&llvm_bin_path) ||
!cc.contains("clang") ||
!ar.contains("llvm-ar") {
return Err(format!(
"Environment variables not set correctly. Please run:\n\
export PATH=\"{}/bin:$PATH\"\n\
export CC={}/bin/clang\n\
export AR={}/bin/llvm-ar",
llvm_path.display(), llvm_path.display(), llvm_path.display()
));
}
Ok(())
}