use std::env;
use std::process::Command;
fn main() {
println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-env-changed=DOCS_RS");
println!("cargo:rerun-if-env-changed=DEVELOPER_DIR");
println!("cargo:rerun-if-env-changed=SDKROOT");
if env::var("DOCS_RS").is_ok() {
return;
}
println!("cargo:rustc-link-lib=framework=Vision");
println!("cargo:rustc-link-lib=framework=CoreGraphics");
println!("cargo:rustc-link-lib=framework=CoreImage");
println!("cargo:rustc-link-lib=framework=Foundation");
let swift_dir = "swift-bridge";
let out_dir = env::var("OUT_DIR").unwrap();
let swift_build_dir = format!("{out_dir}/swift-build");
println!("cargo:rerun-if-changed={swift_dir}");
let target_arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap_or_default();
let swift_triple = match target_arch.as_str() {
"x86_64" => "x86_64-apple-macosx",
"aarch64" => "arm64-apple-macosx",
other => panic!("vision: unsupported target arch '{other}'. Expected x86_64 or aarch64."),
};
let swift_args = vec![
"build",
"-c",
"release",
"--triple",
swift_triple,
"--package-path",
swift_dir,
"--scratch-path",
&swift_build_dir,
];
let output = Command::new("swift")
.args(&swift_args)
.output()
.expect("Failed to build Swift bridge");
if !output.status.success() {
eprintln!(
"Swift build STDOUT:\n{}",
String::from_utf8_lossy(&output.stdout)
);
eprintln!(
"Swift build STDERR:\n{}",
String::from_utf8_lossy(&output.stderr)
);
panic!(
"Swift build failed with exit code: {:?}",
output.status.code()
);
}
println!("cargo:rustc-link-search=native={swift_build_dir}/release");
println!("cargo:rustc-link-lib=static=VisionBridge");
println!("cargo:rustc-link-arg=-Wl,-rpath,/usr/lib/swift");
if let Ok(output) = Command::new("xcode-select").arg("-p").output() {
if output.status.success() {
let xcode_path = String::from_utf8_lossy(&output.stdout).trim().to_string();
let swift_lib_path =
format!("{xcode_path}/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx");
println!("cargo:rustc-link-arg=-Wl,-rpath,{swift_lib_path}");
}
}
}