use std::path::PathBuf;
fn main() {
let manifest_dir = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap());
let vendor_dir = manifest_dir.join("vendor/swisseph");
if !vendor_dir.exists() {
panic!(
"Swiss Ephemeris vendor sources not found at {:?}.\n\
The submodule should be located at crates/swiss-eph/vendor/swisseph",
vendor_dir
);
}
println!("cargo:warning=Using vendor sources from: {:?}", vendor_dir);
let mut build = cc::Build::new();
build
.file(vendor_dir.join("swedate.c"))
.file(vendor_dir.join("swehouse.c"))
.file(vendor_dir.join("swejpl.c"))
.file(vendor_dir.join("swemmoon.c"))
.file(vendor_dir.join("swemplan.c"))
.file(vendor_dir.join("sweph.c"))
.file(vendor_dir.join("swephlib.c"))
.file(vendor_dir.join("swecl.c"))
.file(vendor_dir.join("swehel.c"))
.include(&vendor_dir)
.define("NO_SWE_GLP", None)
.opt_level(3)
.warnings(false);
let target = std::env::var("TARGET").unwrap_or_default();
if target.contains("wasm32") {
let manifest_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap();
let sdk_path = std::env::var("WASI_SDK_PATH").ok()
.or_else(|| {
let candidates = [
"/opt/wasi-sdk",
"/usr/local/opt/wasi-sdk",
"/opt/homebrew/opt/wasi-sdk",
];
candidates.iter()
.find(|p| std::path::Path::new(*p).join("bin/clang").exists())
.map(|s| s.to_string())
})
.unwrap_or_else(|| {
format!("{}/../../toolchain/wasi-sdk-24.0", manifest_dir)
});
let sysroot = format!("{}/share/wasi-sysroot", sdk_path);
let clang = format!("{}/bin/clang", sdk_path);
println!("cargo:warning=Using WASI SDK: {}", sdk_path);
println!("cargo:warning=Using WASI clang: {}", clang);
build.compiler(&clang);
build.target("wasm32-wasi");
build.flag(&format!("--sysroot={}", sysroot));
}
if target.contains("wasm32-unknown-unknown") {
println!("cargo:warning=Targeting wasm32-unknown-unknown: Including stubs.c");
build.file("src/stubs.c");
build.flag("-fno-builtin");
}
build.compile("swisseph");
println!("cargo:rerun-if-changed={}", vendor_dir.display());
}