#![deny(clippy::all, clippy::pedantic)] #![warn(clippy::nursery)] use std::{env, path::Path}; use anyhow::Result; use bindgen::builder; fn main() -> Result<()> { println!("cargo:rerun-if-changed=prebuilt"); let out_dir = env::var("OUT_DIR")?; let out_dir = Path::new(&out_dir); let target = env::var("TARGET")?; match target.as_str() { // android "aarch64-linux-android" => { println!("cargo:rustc-link-search=native=prebuilt/android/arm64-v8a") } "arm-linux-androideabi" | "armv7-linux-androideabi" => { println!("cargo:rustc-link-search=native=prebuilt/android/armeabi-v7a") } "i686-linux-android" => println!("cargo:rustc-link-search=native=prebuilt/android/x86"), "x86_64-linux-android" => { println!("cargo:rustc-link-search=native=prebuilt/android/x86_64") } // macos "aarch64-apple-darwin" => println!("cargo:rustc-link-search=native=prebuilt/macos/arm64"), "arm64e-apple-darwin" => println!("cargo:rustc-link-search=native=prebuilt/macos/arm64e"), "i686-apple-darwin" | "x86_64h-apple-darwin" => { println!("cargo:rustc-link-search=native=prebuilt/macos/universal") } "x86_64-apple-darwin" => println!("cargo:rustc-link-search=native=prebuilt/macos/x86_64"), // ios "aarch64-apple-ios" | "aarch64-apple-ios-sim" | "aarch64-apple-ios-macabi" => { println!("cargo:rustc-link-search=native=prebuilt/ios/arm64") } "arm64e-apple-ios" => println!("cargo:rustc-link-search=native=prebuilt/ios/arm64e"), "armv7s-apple-ios" | "i386-apple-ios" | "x86_64-apple-ios" | "x86_64-apple-ios-macabi" => { println!("cargo:rustc-link-search=native=prebuilt/ios/universal") } // linux "aarch64-unknown-linux-gnu" | "aarch64-unknown-linux-ohos" | "aarch64-unknown-linux-gnu_ilp32" | "aarch64-unknown-linux-musl" | "aarch64_be-unknown-linux-gnu_ilp32" | "aarch64_be-unknown-linux-gnu" => { println!("cargo:rustc-link-search=native=prebuilt/linux/arm64") } "arm-unknown-linux-gnueabi" | "arm-unknown-linux-gnueabihf" | "arm-unknown-linux-musleabi" | "arm-unknown-linux-musleabihf" | "armv4t-unknown-linux-gnueabi" | "armeb-unknown-linux-gnueabi" | "armv5te-unknown-linux-musleabi" | "armv5te-unknown-linux-gnueabi" | "armv5te-unknown-linux-uclibceabi" | "armv7-unknown-linux-gnueabi" | "armv7-unknown-linux-gnueabihf" | "armv7-unknown-linux-musleabihf" | "armv7-unknown-linux-musleabi" | "armv7-unknown-linux-uclibceabi" | "armv7-unknown-linux-ohos" | "armv7-unknown-linux-uclibceabihf" => { println!("cargo:rustc-link-search=native=prebuilt/linux/arm") } "i586-unknown-linux-musl" | "i586-unknown-linux-gnu" | "i686-unknown-linux-musl" | "i686-unknown-linux-gnu" => println!("cargo:rustc-link-search=native=prebuilt/linux/x86"), "x86_64-unikraft-linux-musl" | "x86_64-unknown-linux-gnu" | "x86_64-unknown-linux-gnux32" | "x86_64-unknown-linux-ohos" | "x86_64-unknown-linux-musl" => { println!("cargo:rustc-link-search=native=prebuilt/linux/x86_64") } _ => panic!("Unsupported target: {target}"), } println!("cargo:rustc-link-lib=static=dobby"); println!("cargo:rustc-link-lib=dylib=c++"); let binding_path = out_dir.join("bindings.rs"); let bindings = builder() .header("prebuilt/dobby.h") .allowlist_function("DobbyHook") .allowlist_function("DobbyDestroy") .allowlist_function("DobbyCodePatch") .allowlist_function("DobbyGetVersion") .allowlist_function("DobbySymbolResolver") .allowlist_function("DobbyImportTableReplace") .generate()?; bindings.write_to_file(binding_path)?; Ok(()) }