From 97f10117486b34a96ccc8332c12dc662815e598c Mon Sep 17 00:00:00 2001 From: Alekos Filini Date: Tue, 8 Feb 2022 17:01:03 +0100 Subject: [PATCH] Add a binary to generate bindings --- Cargo.toml | 9 ++++++- build.rs | 46 +----------------------------------- src/bin/generate.rs | 57 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 46 deletions(-) create mode 100644 src/bin/generate.rs diff --git a/Cargo.toml b/Cargo.toml index 6724e28..ba09fd3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,13 @@ uniffi = { version = "0.16.0", features = ["builtin-bindgen"] } thiserror = "1.0" anyhow = "=1.0.45" # remove after upgrading to next version of uniffi +uniffi_bindgen = { version = "0.16.0", optional = true } + [build-dependencies] uniffi_build = { version = "0.16.0", features = ["builtin-bindgen"] } -uniffi_bindgen = { version = "0.16.0" } + +[features] +generate-python = ["uniffi_bindgen"] + +[[bin]] +name = "generate" diff --git a/build.rs b/build.rs index d72ea90..153077f 100644 --- a/build.rs +++ b/build.rs @@ -1,47 +1,3 @@ -use std::fs; -use std::env; -use std::io::Write; -use std::path::Path; - -const BDK_UDL: &str = "src/bdk.udl"; - -fn fixup_python_lib_path>(out_dir: O, lib_name: &str) -> Result<(), Box> { - const LOAD_INDIRECT_DEF: &str = "def loadIndirect():"; - - let bindings_file = out_dir.as_ref().join("bdk.py"); - let mut data = fs::read_to_string(&bindings_file)?; - - let pos = data.find(LOAD_INDIRECT_DEF).expect(&format!("loadIndirect not found in `{}`", bindings_file.display())); - let range = pos..pos + LOAD_INDIRECT_DEF.len(); - - let replacement = format!(r#" -def loadIndirect(): - import glob - return getattr(ctypes.cdll, glob.glob(os.path.join(os.path.dirname(os.path.abspath(__file__)), '{}.*'))[0]) - -def _loadIndirectOld():"#, lib_name); - data.replace_range(range, &replacement); - - let mut file = fs::OpenOptions::new().write(true).truncate(true).open(&bindings_file)?; - file.write(data.as_bytes())?; - - Ok(()) -} - fn main() { - uniffi_build::generate_scaffolding(BDK_UDL).unwrap(); - - if let Some(lang) = env::var("GENERATE_BINDINGS_LANG").ok() { - let out_path = env::var("GENERATE_BINDINGS_OUT").expect("GENERATE_BINDINGS_OUT must be set when GENERATE_BINDINGS_LANG is"); - uniffi_bindgen::generate_bindings(BDK_UDL, None, vec![&lang], Some(&out_path), false).unwrap(); - - match (lang.as_ref(), env::var("GENERATE_BINDINGS_FIXUP_LIB_PATH").ok()) { - ("python", Some(name)) => fixup_python_lib_path(&out_path, &name).unwrap(), - _ => {}, - } - } - - println!("cargo:rerun-if-changed=GENERATE_BINDINGS_LANG"); - println!("cargo:rerun-if-changed=GENERATE_BINDINGS_OUT"); - println!("cargo:rerun-if-changed=GENERATE_BINDINGS_FIXUP_LIB_PATH"); + uniffi_build::generate_scaffolding("src/bdk.udl").unwrap(); } diff --git a/src/bin/generate.rs b/src/bin/generate.rs new file mode 100644 index 0000000..d33a4b8 --- /dev/null +++ b/src/bin/generate.rs @@ -0,0 +1,57 @@ +use std::env; +use std::fs; +use std::io::Write; +use std::path::Path; + +const BDK_UDL: &str = "src/bdk.udl"; + +fn fixup_python_lib_path>( + out_dir: O, + lib_name: &str, +) -> Result<(), Box> { + const LOAD_INDIRECT_DEF: &str = "def loadIndirect():"; + + let bindings_file = out_dir.as_ref().join("bdk.py"); + let mut data = fs::read_to_string(&bindings_file)?; + + let pos = data.find(LOAD_INDIRECT_DEF).expect(&format!( + "loadIndirect not found in `{}`", + bindings_file.display() + )); + let range = pos..pos + LOAD_INDIRECT_DEF.len(); + + let replacement = format!( + r#" +def loadIndirect(): + import glob + return getattr(ctypes.cdll, glob.glob(os.path.join(os.path.dirname(os.path.abspath(__file__)), '{}.*'))[0]) + +def _loadIndirectOld():"#, + lib_name + ); + data.replace_range(range, &replacement); + + let mut file = fs::OpenOptions::new() + .write(true) + .truncate(true) + .open(&bindings_file)?; + file.write(data.as_bytes())?; + + Ok(()) +} + +fn generate_python() -> Result<(), Box> { + let out_path = env::var("GENERATE_PYTHON_BINDINGS_OUT") + .map_err(|_| String::from("`GENERATE_PYTHON_BINDINGS_OUT` env variable missing"))?; + uniffi_bindgen::generate_bindings(&format!("{}/{}", env!("CARGO_MANIFEST_DIR"), BDK_UDL), None, vec!["python"], Some(&out_path), false)?; + + if let Some(name) = env::var("GENERATE_PYTHON_BINDINGS_FIXUP_LIB_PATH").ok() { + fixup_python_lib_path(&out_path, &name)?; + } + + Ok(()) +} + +fn main() -> Result<(), Box> { + generate_python() +}