@@ -3,6 +3,7 @@ use std::fs::File;
33use std:: io:: BufRead ;
44use std:: io:: BufReader ;
55use std:: path:: PathBuf ;
6+ use std:: process:: Command ;
67
78#[ cfg( target_os = "macos" ) ]
89static LASTRUN_PATH : ( & str , & str ) = ( "HOME" , "Library/Application Support/Binary Ninja/lastrun" ) ;
@@ -41,16 +42,59 @@ fn link_path() -> PathBuf {
4142 } )
4243}
4344
45+ fn generate_stubs ( ) -> PathBuf {
46+ // Generate and compile stub shared library and return the path
47+
48+ let out_dir = PathBuf :: from ( env:: var ( "OUT_DIR" ) . unwrap ( ) ) ;
49+
50+ let manifest_dir = std:: env:: var ( "CARGO_MANIFEST_DIR" ) . expect ( "CARGO_MANIFEST_DIR not set" ) ;
51+
52+ // To construct paths relative to the manifest directory:
53+ let api_base_path = std:: path:: PathBuf :: from ( manifest_dir)
54+ . join ( "../../" )
55+ . canonicalize ( )
56+ . unwrap ( ) ;
57+
58+ let generate_stubs_path = api_base_path. join ( "cmake" ) . join ( "generate_stubs.py" ) ;
59+ let binaryninja_core_header_path = api_base_path. join ( "binaryninjacore.h" ) ;
60+ let stubs_path = out_dir. join ( "stubs" ) ;
61+
62+ let generate_status = Command :: new ( "python" )
63+ . args ( & [
64+ generate_stubs_path. to_str ( ) . unwrap ( ) ,
65+ binaryninja_core_header_path. to_str ( ) . unwrap ( ) ,
66+ stubs_path. to_str ( ) . unwrap ( ) ,
67+ ] )
68+ . status ( )
69+ . expect ( "Failed to generate stubs" ) ;
70+
71+ if !generate_status. success ( ) {
72+ panic ! ( "Failed to generate stubs" ) ;
73+ }
74+
75+ cc:: Build :: new ( )
76+ . file ( stubs_path. join ( "stubs.cpp" ) ) // This is named .cpp but is actually c
77+ . shared_flag ( true )
78+ . include ( api_base_path)
79+ . warnings ( false )
80+ . compile ( "binaryninjacore" ) ;
81+
82+ out_dir
83+ }
84+
4485fn main ( ) {
4586 println ! ( "cargo:rerun-if-env-changed=BINARYNINJADIR" ) ;
4687 println ! ( "cargo:rerun-if-changed=../../binaryninjacore.h" ) ;
4788
4889 //Cargo's output directory
4990 let out_dir = env:: var ( "OUT_DIR" ) . unwrap ( ) ;
5091
51- let link_path = env:: var ( "BINARYNINJADIR" )
52- . map ( PathBuf :: from)
53- . unwrap_or_else ( |_| link_path ( ) ) ;
92+ let link_path = match env:: var ( "CARGO_FEATURE_CORE" ) {
93+ Ok ( _) => env:: var ( "BINARYNINJADIR" )
94+ . map ( PathBuf :: from)
95+ . unwrap_or_else ( |_| link_path ( ) ) ,
96+ Err ( _) => generate_stubs ( ) ,
97+ } ;
5498
5599 // Linux builds of binaryninja ship with libbinaryninjacore.so.1 in the
56100 // application folder and no symlink. The linker will attempt to link with
0 commit comments