From 358a279f5cbcd9b980b10bc7370f71cb142be890 Mon Sep 17 00:00:00 2001 From: Florian Briand Date: Sat, 27 Jul 2024 16:04:05 +0200 Subject: [PATCH] fix: make sesam-vitale build works even when having a lib.rs file --- Cargo.lock | 38 +++++++++++++------------- crates/sesam-vitale/build.rs | 3 +- crates/sesam-vitale/src/libssv.rs | 17 ++++++++++++ crates/sesam-vitale/src/main.rs | 1 + crates/sesam-vitale/src/ssvlib_demo.rs | 22 +++++++++++---- 5 files changed, 55 insertions(+), 26 deletions(-) create mode 100644 crates/sesam-vitale/src/libssv.rs diff --git a/Cargo.lock b/Cargo.lock index 6b98be6..6c85149 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -410,7 +410,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a969e13a7589e9e3e4207e153bae624ade2b5622fb4684a4923b23ec3d57719" dependencies = [ "serde", - "toml 0.8.15", + "toml 0.8.16", ] [[package]] @@ -820,7 +820,7 @@ dependencies = [ "cc", "memchr", "rustc_version", - "toml 0.8.15", + "toml 0.8.16", "vswhom", "winreg", ] @@ -2846,9 +2846,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.6" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" +checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" dependencies = [ "serde", ] @@ -3142,7 +3142,7 @@ dependencies = [ "cfg-expr", "heck 0.5.0", "pkg-config", - "toml 0.8.15", + "toml 0.8.16", "version-compare", ] @@ -3269,7 +3269,7 @@ dependencies = [ "serde_json", "tauri-utils", "tauri-winres", - "toml 0.8.15", + "toml 0.8.16", "walkdir", ] @@ -3386,7 +3386,7 @@ dependencies = [ "serde_with", "swift-rs", "thiserror", - "toml 0.8.15", + "toml 0.8.16", "url", "urlpattern", "walkdir", @@ -3549,21 +3549,21 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.15" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac2caab0bf757388c6c0ae23b3293fdb463fee59434529014f85e3263b995c28" +checksum = "81967dd0dd2c1ab0bc3468bd7caecc32b8a4aa47d0c8c695d8c2b2108168d62c" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.16", + "toml_edit 0.22.17", ] [[package]] name = "toml_datetime" -version = "0.6.6" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +checksum = "f8fb9f64314842840f1d940ac544da178732128f1c78c21772e876579e0da1db" dependencies = [ "serde", ] @@ -3594,15 +3594,15 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.16" +version = "0.22.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "278f3d518e152219c994ce877758516bca5e118eaed6996192a774fb9fbf0788" +checksum = "8d9f8729f5aea9562aac1cc0441f5d6de3cff1ee0c5d67293eeca5eb36ee7c16" dependencies = [ "indexmap 2.2.6", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.15", + "winnow 0.6.16", ] [[package]] @@ -3889,9 +3889,9 @@ checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vswhom" @@ -4453,9 +4453,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.15" +version = "0.6.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "557404e450152cd6795bb558bca69e43c585055f4606e3bcae5894fc6dac9ba0" +checksum = "b480ae9340fc261e6be3e95a1ba86d54ae3f9171132a73ce8d4bbaf68339507c" dependencies = [ "memchr", ] diff --git a/crates/sesam-vitale/build.rs b/crates/sesam-vitale/build.rs index 0c0a47b..60d9a3c 100644 --- a/crates/sesam-vitale/build.rs +++ b/crates/sesam-vitale/build.rs @@ -8,7 +8,7 @@ fn main() { let manifest_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); let manifest_path = PathBuf::from(manifest_dir); dotenv::from_path(manifest_path.join(".env.build")).ok(); - + println!("cargo::rerun-if-env-changed=SESAM_FSV_LIB_PATH"); println!("cargo::rerun-if-env-changed=SESAM_FSV_SSVLIB"); println!("cargo::rerun-if-changed=.env.build"); @@ -32,4 +32,5 @@ fn main() { // Link the SESAM_FSV_SSVLIB dynamic library println!("cargo::rustc-link-lib=dylib={}", env::var("SESAM_FSV_SSVLIB").unwrap()); + // TODO : try `raw-dylib` instead of `dylib` on Windows to avoid the need of the `lib` headers compiled from the `def` } diff --git a/crates/sesam-vitale/src/libssv.rs b/crates/sesam-vitale/src/libssv.rs new file mode 100644 index 0000000..7c3adf0 --- /dev/null +++ b/crates/sesam-vitale/src/libssv.rs @@ -0,0 +1,17 @@ +/** + * libssv.rs + * + * Low level bindings to the SSVLIB dynamic library. + * TODO : look for creating a dedicated *-sys crate : https://kornel.ski/rust-sys-crate + */ + +use libc::{ c_char, c_void, c_ushort, size_t }; + +#[cfg_attr(target_os = "linux", link(name = "ssvlux64"))] +#[cfg_attr(target_os = "windows", link(name = "ssvw64"))] +extern "C" { + pub fn SSV_InitLIB2(pcRepSesamIni: *const c_char) -> c_ushort; + pub fn SSV_LireCartePS(NomRessourcePS: *const c_char, NomRessourceLecteur: *const c_char, CodePorteurPS: *const c_char, ZDonneesSortie: *mut *mut c_void, TTailleDonneesSortie: *mut size_t) -> c_ushort; + pub fn SSV_LireConfig(ZDonneesSortie: *mut *mut c_void, TTailleDonneesSortie: *mut size_t) -> c_ushort; +} +/* TODO : replace void* by Rust struct : https://doc.rust-lang.org/nomicon/ffi.html#representing-opaque-structs */ diff --git a/crates/sesam-vitale/src/main.rs b/crates/sesam-vitale/src/main.rs index 9a9a1e9..b863fbb 100644 --- a/crates/sesam-vitale/src/main.rs +++ b/crates/sesam-vitale/src/main.rs @@ -1,4 +1,5 @@ mod ssvlib_demo; +mod libssv; fn main() { ssvlib_demo::demo(); diff --git a/crates/sesam-vitale/src/ssvlib_demo.rs b/crates/sesam-vitale/src/ssvlib_demo.rs index 5905b6e..a8f4731 100644 --- a/crates/sesam-vitale/src/ssvlib_demo.rs +++ b/crates/sesam-vitale/src/ssvlib_demo.rs @@ -1,18 +1,24 @@ +/** + * High level API for the SSV library, + * based on the low level bindings in libssv.rs. + * + */ + extern crate libc; extern crate dotenv; -use libc::{ c_char, c_void, c_ushort, size_t }; +use libc::{ c_void, size_t }; use std::ffi::CString; use std::path::PathBuf; use std::ptr; use std::env; -extern "C" { - fn SSV_InitLIB2(pcRepSesamIni: *const c_char) -> c_ushort; - fn SSV_LireCartePS(NomRessourcePS: *const c_char, NomRessourceLecteur: *const c_char, CodePorteurPS: *const c_char, ZDonneesSortie: *mut *mut c_void, TTailleDonneesSortie: *mut size_t) -> c_ushort; - fn SSV_LireConfig(ZDonneesSortie: *mut *mut c_void, TTailleDonneesSortie: *mut size_t) -> c_ushort; -} +use crate::libssv:: { + SSV_InitLIB2, + SSV_LireCartePS, + SSV_LireConfig +}; fn ssv_init_lib_2() { let ini_str = env::var("SESAM_INI_PATH").expect("SESAM_INI_PATH must be set"); @@ -72,6 +78,10 @@ fn ssv_lire_config() { } pub fn demo() { + /* + * TODO : this is probably not working on release, because I'm not sure it exists a CARGO_MANIFEST_DIR and so it can find the `.env` + * Maybe we could use a system standard config path to store a config file + */ let manifest_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); let manifest_path = PathBuf::from(manifest_dir); dotenv::from_path(manifest_path.join(".env")).ok();