osmaczko 274e5c060f
feat: statically link libchat and rln via rust-bundle
Add rust-bundle, a single staticlib crate that depends on both libchat
and rln as rlibs. This ensures rustc links Rust std exactly once,
eliminating duplicate symbol errors on all platforms. Nim targets link
against liblogos_chat_bundle.a; Nix uses a bundleDrv instead of
separate libchat and rln derivations.

Reference: https://doc.rust-lang.org/reference/linkage.html#mixed-rust-and-foreign-codebases
2026-03-01 17:07:04 +01:00

1.2 KiB

rust-bundle

A minimal Rust staticlib crate that bundles libchat and rln into a single archive (liblogoschat_rust_bundle.a), suitable for static linking into the Nim application.

Motivation

libchat and rln are both Rust crates. Linking them as separate static archives (.a files) causes duplicate symbol errors at link time, because each archive would embed its own copy of the Rust standard library.

By declaring both as rlib dependencies of a single staticlib crate, rustc resolves and links everything in one pass. The resulting liblogoschat_rust_bundle.a exposes all #[no_mangle] pub extern "C" symbols from both crates without any stdlib duplication.

This approach follows the guidance in the official Rust Reference: https://doc.rust-lang.org/reference/linkage.html#mixed-rust-and-foreign-codebases.

Build

cargo build --release --manifest-path rust-bundle/Cargo.toml

Output: rust-bundle/target/release/liblogoschat_rust_bundle.a

From the project root, use the build-bundle Makefile target, which handles this after building librln from the nwaku vendor tree.

Dependencies

Crate Path
libchat vendor/libchat/conversations
rln vendor/nwaku/vendor/zerokit/rln