wslcsdk-sys 3.0.1

Raw FFI bindings for Microsoft.WSL.Containers (WSLC) SDK 3.0.1
Documentation
use std::env;
use std::path::PathBuf;

fn main() {
    let target_os = env::var("CARGO_CFG_TARGET_OS").unwrap_or_default();
    if target_os != "windows" {
        return;
    }

    let target_arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap_or_default();
    let arch_dir = match target_arch.as_str() {
        "x86_64" => "x64",
        "aarch64" => "arm64",
        other => panic!("WSLC SDK 不支持的目标架构: {other},仅支持 x86_64 与 aarch64"),
    };

    let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
    let lib_dir = manifest_dir.join("native").join("lib").join(arch_dir);

    println!("cargo:rustc-link-search=native={}", lib_dir.display());
    println!("cargo:rustc-link-lib=dylib=wslcsdk");

    let target_env = env::var("CARGO_CFG_TARGET_ENV").unwrap_or_default();
    if target_env == "msvc" {
        println!("cargo:rustc-link-arg=/DELAYLOAD:wslcsdk.dll");
        println!("cargo:rustc-link-lib=delayimp");
    }

    let dll_source = lib_dir.join("wslcsdk.dll");
    if dll_source.exists() {
        let Ok(out_dir) = env::var("OUT_DIR") else {
            return;
        };
        let out_path = PathBuf::from(out_dir);
        let copy_dll = |dest: PathBuf| {
            if let Err(e) = std::fs::copy(&dll_source, &dest) {
                println!(
                    "cargo:warning=复制 DLL 失败 (来源: {}, 目标: {}): {e}",
                    dll_source.display(),
                    dest.display()
                );
            }
        };

        copy_dll(out_path.join("wslcsdk.dll"));

        if let Some(target_profile_dir) = out_path
            .parent()
            .and_then(|p| p.parent())
            .and_then(|p| p.parent())
        {
            copy_dll(target_profile_dir.join("wslcsdk.dll"));
            let deps_dir = target_profile_dir.join("deps");
            if deps_dir.exists() {
                copy_dll(deps_dir.join("wslcsdk.dll"));
            }
        }
    }

    println!("cargo:rerun-if-changed=native/lib/{arch_dir}/wslcsdk.lib");
    println!("cargo:rerun-if-changed=native/lib/{arch_dir}/wslcsdk.dll");
    println!("cargo:rerun-if-changed=native/include/wslcsdk.h");
}