use std::env;
fn main() {
let target = env::var("TARGET").unwrap_or_default();
let target_env = env::var("CARGO_CFG_TARGET_ENV").unwrap_or_default();
if target.contains("linux") && target_env == "ohos" {
napi_build_ohos::setup();
}
if target.contains("apple") && env::var("LINGXIA_GENERATE_BRIDGE").is_ok() {
generate_swift_bridge();
}
}
#[cfg(any(target_os = "ios", target_os = "macos"))]
fn generate_swift_bridge() {
use std::fs;
use std::path::PathBuf;
println!("cargo:rerun-if-changed=src/apple.rs");
let package_name = "LingXiaRustAPI";
let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
let generated_dir = manifest_dir
.parent()
.unwrap()
.join("lingxia-sdk/apple/Sources/generated");
let lib_dir = generated_dir.join("LingXiaRustAPI");
fs::create_dir_all(&lib_dir).expect("Failed to create directory");
swift_bridge_build::parse_bridges(vec!["src/apple.rs"])
.write_all_concatenated(&lib_dir, package_name);
for file in ["SwiftBridgeCore.swift", "SwiftBridgeCore.h"] {
let src = lib_dir.join(file);
if src.exists() {
fs::rename(&src, generated_dir.join(file)).ok();
}
}
for path in [
lib_dir
.join(package_name)
.join(format!("{}.swift", package_name)),
generated_dir.join("SwiftBridgeCore.swift"),
] {
if let Ok(content) = fs::read_to_string(&path) {
if !content.contains("import CLingXiaRustAPI") {
let new_content =
format!("import Foundation\nimport CLingXiaRustAPI\n\n{}", content);
fs::write(&path, new_content).ok();
}
}
}
fs::write(lib_dir.join("module.modulemap"), format!(
"module CLingXiaRustAPI {{\n header \"../SwiftBridgeCore.h\"\n header \"{0}/{0}.h\"\n export *\n}}",
package_name
)).ok();
println!(
"cargo:warning=Generated Swift bridge to {}",
lib_dir.display()
);
}