mirror of
https://github.com/logos-messaging/logos-chat.git
synced 2026-02-28 21:03:06 +00:00
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
83 lines
2.7 KiB
Nix
83 lines
2.7 KiB
Nix
{ lib, stdenv, nim, which, pkg-config, writeScriptBin,
|
|
openssl, miniupnpc, libnatpmp,
|
|
src, # logos-chat source (self from flake, with submodules=1)
|
|
rustBundleDrv }: # result of bundle.nix
|
|
|
|
# NOTE: this build requires git submodules to be present in src.
|
|
# When fetching from GitHub use '?submodules=1#', e.g.:
|
|
# nix build "github:logos-messaging/logos-chat?submodules=1#"
|
|
# For local builds use: nix build ".?submodules=1#"
|
|
|
|
assert lib.assertMsg ((src.submodules or false) == true)
|
|
"Unable to build without submodules. Append '?submodules=1#' to the URI.";
|
|
|
|
let
|
|
revision = lib.substring 0 8 (src.rev or "dirty");
|
|
in stdenv.mkDerivation {
|
|
pname = "liblogoschat";
|
|
version = "0.1.0";
|
|
inherit src;
|
|
|
|
NIMFLAGS = lib.concatStringsSep " " [
|
|
"--passL:${rustBundleDrv}/lib/librust_bundle.a"
|
|
"--passL:-lm"
|
|
"-d:miniupnpcUseSystemLibs"
|
|
"-d:libnatpmpUseSystemLibs"
|
|
"--passL:-lminiupnpc"
|
|
"--passL:-lnatpmp"
|
|
"-d:git_version=${revision}"
|
|
];
|
|
|
|
nativeBuildInputs = let
|
|
fakeGit = writeScriptBin "git" ''
|
|
#!${stdenv.shell}
|
|
echo "${revision}"
|
|
'';
|
|
in [ nim which pkg-config fakeGit ];
|
|
|
|
# Nim defaults to $HOME/.cache/nim; the sandbox maps $HOME to /homeless-shelter
|
|
# which doesn't exist. Point XDG_CACHE_HOME at /tmp so Nim writes its cache there.
|
|
XDG_CACHE_HOME = "/tmp";
|
|
|
|
buildInputs = [ openssl miniupnpc libnatpmp ];
|
|
|
|
configurePhase = ''
|
|
runHook preConfigure
|
|
patchShebangs . vendor/nimbus-build-system > /dev/null 2>&1 || true
|
|
# Create logos_chat.nims symlink (if not already a real file)
|
|
if [ ! -e logos_chat.nims ]; then
|
|
ln -sf logos_chat.nimble logos_chat.nims
|
|
fi
|
|
# Regenerate nimble-link files with sandbox-correct absolute paths.
|
|
# vendor/.nimble/pkgs contains paths baked in at `nimble develop` time on a
|
|
# developer's machine; they won't resolve inside the Nix sandbox. Running
|
|
# the same generate_nimble_links.sh that logos-delivery uses re-creates them
|
|
# from the current $PWD without requiring git.
|
|
make nimbus-build-system-nimble-dir
|
|
runHook postConfigure
|
|
'';
|
|
|
|
preBuild = ''
|
|
mkdir -p build
|
|
'';
|
|
|
|
makeFlags = [ "liblogoschat-nix" ];
|
|
|
|
installPhase = ''
|
|
runHook preInstall
|
|
mkdir -p $out/lib $out/include
|
|
cp build/liblogoschat.so $out/lib/ 2>/dev/null || true
|
|
cp build/liblogoschat.dylib $out/lib/ 2>/dev/null || true
|
|
ls $out/lib/liblogoschat.* > /dev/null
|
|
cp library/liblogoschat.h $out/include/
|
|
runHook postInstall
|
|
'';
|
|
|
|
meta = with lib; {
|
|
description = "Logos-Chat shared library (C FFI)";
|
|
homepage = "https://github.com/logos-messaging/logos-chat";
|
|
license = licenses.mit;
|
|
platforms = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
|
|
};
|
|
}
|