use std::{env::var, path::PathBuf};
const EUROSCOPE_PLUGIN_HEADER_NAME: &str = "EuroScopePlugIn.h";
const EUROSCOPE_PLUGIN_LIB_NAME: &str = "EuroScopePlugInDll.lib";
fn locate_sdk() -> PathBuf {
println!("cargo:rerun-if-env-changed=EUROSCOPE_PLUGIN_SDK_DIR");
let dir = var("EUROSCOPE_PLUGIN_SDK_DIR")
.map(PathBuf::from)
.unwrap_or_else(|_| {
let appdata =
var("APPDATA").expect("APPDATA is not set; cannot locate EuroScope plugin SDK lib");
PathBuf::from(appdata).join("EuroScope").join("PlugIn")
});
if !dir.join(EUROSCOPE_PLUGIN_HEADER_NAME).is_file() {
panic!(
"The directory `{}` did not contain a header file named `{}`",
dir.display(),
EUROSCOPE_PLUGIN_HEADER_NAME,
);
}
if !dir.join(EUROSCOPE_PLUGIN_LIB_NAME).is_file() {
panic!(
"The directory `{}` did not contain a header file named `{}`",
dir.display(),
EUROSCOPE_PLUGIN_LIB_NAME,
);
}
dir
}
fn main() {
let target = var("TARGET").unwrap_or_default();
if !target.contains("windows-msvc") {
panic!(
"euroscope-sys only supports *-windows-msvc targets (got `{target}`). EuroScope \
plugins must be built with the MSVC toolchain."
);
}
if !target.starts_with("i686") {
println!(
"cargo:warning=Target is `{target}`, but EuroScope is 32-bit. Build with --target \
i686-pc-windows-msvc."
);
}
println!("cargo:rerun-if-changed=src/shim");
let manifest_dir = PathBuf::from(var("CARGO_MANIFEST_DIR").unwrap());
let sdk_dir = locate_sdk();
let shim_dir = manifest_dir.join("src").join("shim");
let mut sources: Vec<PathBuf> = std::fs::read_dir(&shim_dir)
.expect("src/shim directory")
.filter_map(|e| e.ok().map(|e| e.path()))
.filter(|p| p.extension().is_some_and(|e| e == "cpp"))
.collect();
sources.sort();
cc::Build::new()
.cpp(true)
.std("c++17")
.files(&sources)
.include(&sdk_dir)
.include(&shim_dir)
.define("_MBCS", None)
.cargo_metadata(false)
.warnings(false)
.flag("/MD")
.compile("euroscope_shim");
let out_dir = var("OUT_DIR").unwrap();
println!("cargo:rustc-link-search=native={out_dir}");
println!("cargo:rustc-link-lib=static:+whole-archive=euroscope_shim");
println!("cargo:rustc-link-search=native={}", sdk_dir.display());
println!("cargo:rustc-link-lib=EuroScopePlugInDll");
}