Files
marathon/crates/libmarathon/build.rs
2026-02-07 18:18:57 +00:00

86 lines
2.8 KiB
Rust

use std::env;
use std::path::PathBuf;
use std::process::Command;
fn main() {
// Only compile Swift code when building for iOS
let target_os = env::var("CARGO_CFG_TARGET_OS").unwrap_or_default();
if target_os != "ios" {
println!("cargo:warning=Not building for iOS, skipping Swift compilation");
return;
}
println!("cargo:warning=Building Swift bridge for iOS");
let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());
let swift_src = manifest_dir.join("src/platform/ios/PencilCapture.swift");
let header = manifest_dir.join("src/platform/ios/PencilBridge.h");
let object_file = out_dir.join("PencilCapture.o");
// Get the iOS SDK path
let sdk_output = Command::new("xcrun")
.args(&["--sdk", "iphoneos", "--show-sdk-path"])
.output()
.expect("Failed to get iOS SDK path");
let sdk_path = String::from_utf8_lossy(&sdk_output.stdout).trim().to_string();
println!("cargo:warning=Using iOS SDK: {}", sdk_path);
// Compile Swift to object file
let status = Command::new("swiftc")
.args(&[
"-sdk", &sdk_path,
"-target", "arm64-apple-ios14.0", // Minimum iOS 14
"-import-objc-header", header.to_str().unwrap(),
"-parse-as-library",
"-c", swift_src.to_str().unwrap(),
"-o", object_file.to_str().unwrap(),
])
.status()
.expect("Failed to compile Swift");
if !status.success() {
panic!("Swift compilation failed");
}
println!("cargo:warning=Swift compilation succeeded");
// Create static library from object file
let lib_file = out_dir.join("libPencilCapture.a");
let ar_status = Command::new("ar")
.args(&[
"rcs",
lib_file.to_str().unwrap(),
object_file.to_str().unwrap(),
])
.status()
.expect("Failed to create static library");
if !ar_status.success() {
panic!("Failed to create static library");
}
println!("cargo:warning=Created static library: {}", lib_file.display());
// Tell Cargo to link the static library
println!("cargo:rustc-link-search=native={}", out_dir.display());
println!("cargo:rustc-link-lib=static=PencilCapture");
// Link Swift standard library
println!("cargo:rustc-link-lib=dylib=swiftCore");
println!("cargo:rustc-link-lib=dylib=swiftFoundation");
println!("cargo:rustc-link-lib=dylib=swiftUIKit");
// Link iOS frameworks
println!("cargo:rustc-link-lib=framework=UIKit");
println!("cargo:rustc-link-lib=framework=Foundation");
// Rerun if Swift files change
println!("cargo:rerun-if-changed={}", swift_src.display());
println!("cargo:rerun-if-changed={}", header.display());
}