86 lines
2.8 KiB
Rust
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());
|
|
}
|