dexcontrol 0.8.0

Safe Rust API for the precompiled DexControl robot runtime
// Copyright (C) 2026 Dexmate Inc.
//
// This software is dual-licensed:
//
// 1. GNU Affero General Public License v3.0 (AGPL-3.0)
//    See LICENSE-AGPL for details
//
// 2. Commercial License
//    For commercial licensing terms, contact: contact@dexmate.ai

use std::{env, path::PathBuf};
fn main() {
    println!("cargo:rerun-if-env-changed=DEXCONTROL_SDK_DIR");
    let target = env::var("TARGET").unwrap();
    if ![
        "x86_64-unknown-linux-gnu",
        "aarch64-unknown-linux-gnu",
        "x86_64-apple-darwin",
        "aarch64-apple-darwin",
    ]
    .contains(&target.as_str())
    {
        panic!("No DexControl native SDK is available for target {target}");
    }
    if let Some(root) = env::var_os("DEXCONTROL_SDK_DIR") {
        let lib = PathBuf::from(root).join("lib");
        let pc = lib.join("pkgconfig/dexcontrol.pc");
        println!("cargo:rerun-if-changed={}", pc.display());
        let metadata = std::fs::read_to_string(&pc)
            .expect("SDK metadata lib/pkgconfig/dexcontrol.pc is missing");
        let version = metadata
            .lines()
            .find_map(|line| line.strip_prefix("Version:"))
            .unwrap_or("")
            .trim();
        if version != env!("CARGO_PKG_VERSION") {
            panic!(
                "SDK version {version} does not match Rust bindings {}; install the matching SDK",
                env!("CARGO_PKG_VERSION")
            );
        }
        if !lib.join("libdexcontrol_capi.so").is_file()
            && !lib.join("libdexcontrol_capi.dylib").is_file()
        {
            panic!("DEXCONTROL_SDK_DIR must point to an installed SDK containing lib/libdexcontrol_capi.so or .dylib");
        }
        println!("cargo:rustc-link-search=native={}", lib.display());
        println!("cargo:rustc-link-lib=dylib=dexcontrol_capi");
    } else {
        pkg_config::Config::new()
            .exactly_version(env!("CARGO_PKG_VERSION"))
            .statik(false)
            .probe("dexcontrol")
            .expect(
                "Install the DexControl native SDK and set DEXCONTROL_SDK_DIR to its directory",
            );
    }
}