Skip to content

Commit b88847d

Browse files
committed
Add staticlib feature to compile without nif_init and add {pkg}_nif_init
1 parent 2a67590 commit b88847d

File tree

2 files changed

+38
-6
lines changed

2 files changed

+38
-6
lines changed

rustler/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ rust-version = "1.70"
1313
big_integer = ["dep:num-bigint"]
1414
default = ["nif_version_2_15"]
1515
derive = []
16-
alternative_nif_init_name = []
1716
allocator = []
1817
nif_version_2_14 = []
1918
nif_version_2_15 = ["nif_version_2_14"]

rustler_codegen/src/init.rs

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -136,25 +136,58 @@ impl From<InitMacroInput> for proc_macro2::TokenStream {
136136
}
137137
};
138138

139+
let nif_init_name = {
140+
let lib_name = std::env::var("CARGO_CRATE_NAME").unwrap();
141+
format!("{lib_name}_nif_init")
142+
};
143+
144+
let nif_init_name = Ident::new(&nif_init_name, Span::call_site());
145+
146+
let should_generate_primary_nif = std::env::var("RUSTLER_PRIMARY_NIF_INIT").is_ok()
147+
|| std::env::var("CARGO_PRIMARY_PACKAGE").is_ok();
148+
149+
let maybe_primary_nif_init = if should_generate_primary_nif {
150+
quote! {
151+
#[cfg(not(windows))]
152+
#[no_mangle]
153+
fn nif_init() -> *const ::rustler::codegen_runtime::DEF_NIF_ENTRY {
154+
#nif_init_name()
155+
}
156+
157+
#[cfg(windows)]
158+
#[no_mangle]
159+
fn nif_init(callbacks: *mut ::rustler::codegen_runtime::DynNifCallbacks) -> *const ::rustler::codegen_runtime::DEF_NIF_ENTRY {
160+
#nif_init_name(callbacks)
161+
}
162+
}
163+
} else {
164+
quote!()
165+
};
166+
139167
quote! {
140168
#maybe_warning
141169

142-
#[cfg(unix)]
170+
#[cfg(not(windows))]
143171
#[no_mangle]
144-
extern "C" fn nif_init() -> *const rustler::codegen_runtime::DEF_NIF_ENTRY {
145-
unsafe { rustler::codegen_runtime::internal_write_symbols() };
172+
extern "C" fn #nif_init_name() -> *const ::rustler::codegen_runtime::DEF_NIF_ENTRY {
173+
unsafe {
174+
::rustler::codegen_runtime::internal_write_symbols()
175+
}
176+
146177
#inner
147178
}
148179

149180
#[cfg(windows)]
150181
#[no_mangle]
151-
extern "C" fn nif_init(callbacks: *mut rustler::codegen_runtime::DynNifCallbacks) -> *const rustler::codegen_runtime::DEF_NIF_ENTRY {
182+
extern "C" fn #nif_init_name(callbacks: *mut ::rustler::codegen_runtime::DynNifCallbacks) -> *const ::rustler::codegen_runtime::DEF_NIF_ENTRY {
152183
unsafe {
153-
rustler::codegen_runtime::internal_set_symbols(*callbacks);
184+
::rustler::codegen_runtime::internal_set_symbols(*callbacks);
154185
}
155186

156187
#inner
157188
}
189+
190+
#maybe_primary_nif_init
158191
}
159192
}
160193
}

0 commit comments

Comments
 (0)