use std::env;
use std::path::PathBuf;
fn main() {
let target_os = env::var("CARGO_CFG_TARGET_OS").unwrap();
let target_arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap();
let include_path = PathBuf::from("libs/ctp/include");
let (lib_path, lib_suffix) = match (target_os.as_str(), target_arch.as_str()) {
("macos", "x86_64") => (PathBuf::from("libs/ctp/lib/mac64"), "dylib"),
("macos", "aarch64") => {
let arm_path = PathBuf::from("libs/ctp/lib/mac_arm64");
if arm_path.exists() {
(arm_path, "dylib")
} else {
println!("cargo:warning=未找到ARM64版本的CTP库,使用x86_64版本(可能需要Rosetta)");
(PathBuf::from("libs/ctp/lib/mac64"), "dylib")
}
}
("linux", "x86_64") => (PathBuf::from("libs/ctp/lib/linux64"), "so"),
("linux", "aarch64") => {
let arm_path = PathBuf::from("libs/ctp/lib/linux_arm64");
if arm_path.exists() {
(arm_path, "so")
} else {
panic!("不支持ARM64 Linux平台,CTP库仅支持x86_64架构");
}
}
_ => panic!("不支持的平台: {} {}", target_os, target_arch),
};
if !lib_path.exists() {
panic!("CTP库目录不存在: {}", lib_path.display());
}
if !include_path.exists() {
panic!("CTP头文件目录不存在: {}", include_path.display());
}
let md_lib = lib_path.join(format!("thostmduserapi_se.{}", lib_suffix));
let trader_lib = lib_path.join(format!("thosttraderapi_se.{}", lib_suffix));
let has_md_lib = md_lib.exists();
let has_trader_lib = trader_lib.exists();
if !has_md_lib && !has_trader_lib {
println!("cargo:warning=CTP库文件不存在,将跳过动态链接。如需完整功能,请将CTP库文件放置在正确位置。");
println!("cargo:warning=行情API库: {}", md_lib.display());
println!("cargo:warning=交易API库: {}", trader_lib.display());
println!("cargo:rustc-cfg=feature=\"test_mode\"");
println!("cargo:warning=构建目标: {} {}", target_os, target_arch);
println!("cargo:warning=测试模式:将跳过CTP库链接");
return;
}
println!("cargo:rustc-link-search=native={}", lib_path.display());
if has_md_lib {
println!("cargo:rustc-cfg=feature=\"md_api\"");
println!("cargo:rustc-link-lib=dylib=thostmduserapi_se");
println!("cargo:warning=找到行情API库: {}", md_lib.display());
} else {
println!("cargo:warning=行情API库不存在: {}", md_lib.display());
}
if has_trader_lib {
println!("cargo:rustc-cfg=feature=\"trader_api\"");
println!("cargo:rustc-link-lib=dylib=thosttraderapi_se");
println!("cargo:warning=找到交易API库: {}", trader_lib.display());
} else {
println!("cargo:warning=交易API库不存在: {}", trader_lib.display());
}
if !has_md_lib && !has_trader_lib {
println!("cargo:rustc-cfg=feature=\"test_mode\"");
}
if target_os == "macos" {
println!("cargo:rustc-link-lib=dylib=c++");
println!("cargo:rustc-link-lib=framework=Security");
println!("cargo:rustc-link-lib=framework=SystemConfiguration");
}
if target_os == "linux" {
println!("cargo:rustc-link-lib=dylib=stdc++");
println!("cargo:rustc-link-lib=dylib=pthread");
println!("cargo:rustc-link-lib=dylib=dl");
}
if target_os == "macos" {
println!("cargo:rustc-link-arg=-Wl,-rpath,@loader_path");
println!("cargo:rustc-link-arg=-Wl,-rpath,{}", lib_path.display());
} else if target_os == "linux" {
println!("cargo:rustc-link-arg=-Wl,-rpath,$ORIGIN");
println!("cargo:rustc-link-arg=-Wl,-rpath,{}", lib_path.display());
}
println!("cargo:rerun-if-changed={}", include_path.display());
println!("cargo:rerun-if-changed={}", lib_path.display());
println!("cargo:rerun-if-env-changed=CARGO_CFG_TARGET_OS");
println!("cargo:rerun-if-env-changed=CARGO_CFG_TARGET_ARCH");
println!("cargo:warning=构建目标: {} {}", target_os, target_arch);
println!("cargo:warning=使用库目录: {}", lib_path.display());
}