diff options
| author | Josh Ferrell <josh@vector35.com> | 2025-09-01 17:47:08 -0400 |
|---|---|---|
| committer | Josh Ferrell <josh@vector35.com> | 2025-09-01 17:47:08 -0400 |
| commit | eef93b932844110cf19a4b2741b528623b77998e (patch) | |
| tree | b8c89a56e603dc837d3fe48a33aa619baf2e7d4a /rust/binaryninjacore-sys | |
| parent | 42fd7435e2713181facfc6d4f54b42bdaa1d2825 (diff) | |
Add option to build rust api without linking to core
Diffstat (limited to 'rust/binaryninjacore-sys')
| -rw-r--r-- | rust/binaryninjacore-sys/Cargo.toml | 9 | ||||
| -rw-r--r-- | rust/binaryninjacore-sys/build.rs | 25 |
2 files changed, 30 insertions, 4 deletions
diff --git a/rust/binaryninjacore-sys/Cargo.toml b/rust/binaryninjacore-sys/Cargo.toml index bfd49a41..d4faaec8 100644 --- a/rust/binaryninjacore-sys/Cargo.toml +++ b/rust/binaryninjacore-sys/Cargo.toml @@ -7,8 +7,15 @@ edition = "2021" links = "binaryninjacore" license = "Apache-2.0" +[features] +default = ["core"] +# If disabled, a stub binaryninjacore library will be generated and linked. +# This feature should only be disabled for shared libraries that will later be loaded in the same process as the real binaryninjacore. +core = [] + [build-dependencies] bindgen = "0.71.1" # TODO: Remove this once bindgen correctly pins the version. # proc-macro2 v1.0.79 does not have https://docs.rs/proc-macro2/1.0.80/proc_macro2/struct.Literal.html#method.c_string -proc-macro2 = ">=1.0.80"
\ No newline at end of file +proc-macro2 = ">=1.0.80" +cmake = "0.1" diff --git a/rust/binaryninjacore-sys/build.rs b/rust/binaryninjacore-sys/build.rs index 579276a6..672615da 100644 --- a/rust/binaryninjacore-sys/build.rs +++ b/rust/binaryninjacore-sys/build.rs @@ -41,6 +41,22 @@ fn link_path() -> PathBuf { }) } +// Generate and compile stub shared library and return the path to the folder containing the built stub library +fn generate_stubs() -> PathBuf { + let manifest_dir = std::env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set"); + + let api_base_path = std::path::PathBuf::from(manifest_dir) + .join("../../") + .canonicalize() + .unwrap(); + + let stubs_path = api_base_path.join("stubs"); + cmake::Config::new(stubs_path) + .generator("Ninja") + .build() + .join("build") +} + fn main() { println!("cargo:rerun-if-env-changed=BINARYNINJADIR"); println!("cargo:rerun-if-changed=../../binaryninjacore.h"); @@ -48,9 +64,12 @@ fn main() { //Cargo's output directory let out_dir = env::var("OUT_DIR").unwrap(); - let link_path = env::var("BINARYNINJADIR") - .map(PathBuf::from) - .unwrap_or_else(|_| link_path()); + let link_path = match env::var("CARGO_FEATURE_CORE") { + Ok(_) => env::var("BINARYNINJADIR") + .map(PathBuf::from) + .unwrap_or_else(|_| link_path()), + Err(_) => generate_stubs(), + }; // Linux builds of binaryninja ship with libbinaryninjacore.so.1 in the // application folder and no symlink. The linker will attempt to link with |
