python313-sys 3.13.15

Raw Rust bindings for CPython 3.13.15 C API
use std::{env, path::PathBuf};

use pyconfig::search_pythons;

static PYTHON_VERSION: &str = "3.13.15";

fn main() {
    let pythons = search_pythons()
        .expect("Not found any pythons! Please install python 3.13.15!");
    let python = pythons
        .iter()
        .find(|python| python.version == PYTHON_VERSION)
        .expect("Not found python with version 3.13.15!");

    let bindings = bindgen::Builder::default()
        .header("cpp/bindings.h")
        .clang_arg(format!("-I{}", python.include_path.display()))
                
        .allowlist_function("^Py.*")
        .allowlist_type("^Py.*")
        .allowlist_var("^Py.*")

        .clang_arg("-std=c11")

        .parse_callbacks(Box::new(
            bindgen::CargoCallbacks::new()
        ))

        .generate()
        .expect("Error while generate bindings.");

    let out = PathBuf::from(
        env::var("OUT_DIR").unwrap()
    );

    bindings
        .write_to_file(out.join("bindings.rs"))
        .unwrap();

    println!("cargo:rustc-link-search=native={}", python.libs_path.display());
    println!("cargo:rustc-link-lib=python313");

    println!("cargo:rerun-if-changed=cpp/bindings.h");
    println!("cargo:rerun-if-changed=src/lib.rs");
    println!("cargo:rerun-if-changed=build.rs");
}