-
Notifications
You must be signed in to change notification settings - Fork 762
Description
Some crates have the ability to decide whether the shared object file will be dlopen
ed or linked into the executable. For example, ash-rs
exposes Entry::linked()
and Entry::load()
depending whether features linked
or loaded
were enabled. Achieving this with bindgen is currently possible but the exported symbols have different API which requires using conditional compilation whenever a function from the library is called, e.g.,
impl Foo {
#[cfg(feature = "linked")]
pub fn linked() -> Self {
Self {}
}
#[cfg(feature = "loaded")]
pub fn loaded() -> Self {
Self {
lib: FooLib::new("libfoo.so").unwrap(),
}
}
pub fn mk_bar_wrapped(&self) {
#[cfg(feature = "linked")]
mk_bar();
#[cfg(feature = "loaded")]
self.lib.mk_bar();
}
}
It would be if it were possible to emit a dummy FooLib
struct with impl
that ignores self and calls the exported function from the linked binary, something like:
impl FooLib {
pub fn dummy() -> Self {
Self { _unused: [] }
}
pub fn mk_bar(&self) {
mk_bar()
}
}
This way the mk_bar_wrapped
implementation could be simplified to always call the mk_bar
fn through the self.lib
object regardless of whether libfoo is loaded or linked.