doe 1.1.86

doe is a powerful Rust crate designed to enhance development workflow by providing an extensive collection of useful macros and utility functions. It not only simplifies common tasks but also offers convenient features for clipboard management,robust cryptographic functions,keyboard input, and mouse interaction.
Documentation
use std::fs;
use std::path::Path;

fn main() {
    let is_linux = std::env::var("CARGO_CFG_TARGET_OS").unwrap_or_default() == "linux";
    let keyboard_enabled = std::env::var("CARGO_FEATURE_KEYBOARD").is_ok();

    if is_linux && keyboard_enabled {
        // On Linux, the keyboard module links against X11 and Xtst.
        // The dev symlinks (libXtst.so) may not exist even though
        // the runtime libraries (libXtst.so.6) are present.
        // We create a temporary directory with symlinks as a linker search path.

        let out_dir = std::env::var("OUT_DIR").unwrap_or_else(|_| "/tmp".to_string());
        let lib_dir = format!("{}/doe-x11-libs", out_dir);

        if !Path::new(&lib_dir).exists() {
            let _ = fs::create_dir_all(&lib_dir);
        }

        // Create symlinks for Xtst if the dev symlink doesn't exist
        link_runtime_lib(&lib_dir, "libXtst.so.6", "libXtst.so");

        println!("cargo:rustc-link-search=native={}", lib_dir);
        println!("cargo:rustc-link-search=/usr/lib/x86_64-linux-gnu");
        println!("cargo:rustc-link-search=/usr/lib/aarch64-linux-gnu");
        println!("cargo:rustc-link-search=/usr/lib/i386-linux-gnu");
        println!("cargo:rustc-link-search=/usr/lib64");
        println!("cargo:rustc-link-search=/usr/lib");
        println!("cargo:rustc-link-search=/lib/x86_64-linux-gnu");
        println!("cargo:rustc-link-search=/lib64");

        println!("cargo:rerun-if-changed=build.rs");
    }
}

fn link_runtime_lib(lib_dir: &str, runtime_name: &str, link_name: &str) {
    let link_path = format!("{}/{}", lib_dir, link_name);

    if Path::new(&link_path).exists() {
        return;
    }

    // Try to find the runtime library in standard paths
    let search_paths = [
        "/lib/x86_64-linux-gnu",
        "/usr/lib/x86_64-linux-gnu",
        "/lib64",
        "/usr/lib64",
        "/usr/lib",
        "/lib",
    ];

    for dir in &search_paths {
        let runtime_path = format!("{}/{}", dir, runtime_name);
        if Path::new(&runtime_path).exists() {
            let _ = std::os::unix::fs::symlink(&runtime_path, &link_path);
            return;
        }
    }
}