mirror of
https://github.com/logos-messaging/nim-chat-poc.git
synced 2026-02-27 09:23:08 +00:00
feat: add nix flake
This commit is contained in:
parent
ee5075cc6e
commit
b2bcc81bdb
18
.github/workflows/ci.yml
vendored
18
.github/workflows/ci.yml
vendored
@ -50,3 +50,21 @@ jobs:
|
||||
key: ${{ runner.os }}-nbs-${{ steps.nbs.outputs.hash }}
|
||||
- run: make update
|
||||
- run: make tests
|
||||
|
||||
nix-build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- uses: cachix/install-nix-action@v27
|
||||
with:
|
||||
nix_path: nixpkgs=channel:nixos-unstable
|
||||
extra_nix_config: |
|
||||
experimental-features = nix-command flakes
|
||||
- run: nix build ".?submodules=1#" --print-build-logs
|
||||
- name: Verify outputs
|
||||
run: |
|
||||
test -f result/lib/liblogoschat.so
|
||||
test -f result/include/liblogoschat.h
|
||||
|
||||
|
||||
13
Makefile
13
Makefile
@ -55,6 +55,13 @@ clean:
|
||||
# must be included after the default target
|
||||
-include $(BUILD_SYSTEM_DIR)/makefiles/targets.mk
|
||||
|
||||
### Create nimble links (used when building with Nix)
|
||||
.PHONY: nimbus-build-system-nimble-dir
|
||||
nimbus-build-system-nimble-dir:
|
||||
NIMBLE_DIR="$(CURDIR)/$(NIMBLE_DIR)" \
|
||||
PWD_CMD="$(PWD)" \
|
||||
$(CURDIR)/vendor/nwaku/scripts/generate_nimble_links.sh
|
||||
|
||||
## Possible values: prod; debug
|
||||
TARGET ?= prod
|
||||
|
||||
@ -131,6 +138,12 @@ liblogoschat: | build-waku-librln build-waku-nat build-libchat logos_chat.nims
|
||||
echo -e "\n\x1B[92mLibrary built successfully:\x1B[39m" && \
|
||||
echo " $(shell pwd)/$(LIBLOGOSCHAT)"
|
||||
|
||||
### Nix-only: dependencies are pre-built Nix derivations, not built here
|
||||
.PHONY: liblogoschat-nix
|
||||
liblogoschat-nix: | logos_chat.nims
|
||||
echo -e $(BUILD_MSG) "$(LIBLOGOSCHAT)" && \
|
||||
$(ENV_SCRIPT) nim liblogoschat $(NIM_PARAMS) --path:src logos_chat.nims
|
||||
|
||||
endif
|
||||
|
||||
|
||||
|
||||
82
flake.lock
generated
Normal file
82
flake.lock
generated
Normal file
@ -0,0 +1,82 @@
|
||||
{
|
||||
"nodes": {
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1731533236,
|
||||
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1771369470,
|
||||
"narHash": "sha256-0NBlEBKkN3lufyvFegY4TYv5mCNHbi5OmBDrzihbBMQ=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "0182a361324364ae3f436a63005877674cf45efb",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"rust-overlay": "rust-overlay"
|
||||
}
|
||||
},
|
||||
"rust-overlay": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1771642886,
|
||||
"narHash": "sha256-4zOvSi0WkS2WAaoJtM28wECtS9S+L38CPYbhF+wINDA=",
|
||||
"owner": "oxalica",
|
||||
"repo": "rust-overlay",
|
||||
"rev": "85078369717bdbe1f266c9eaad5e66956fb6feea",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "oxalica",
|
||||
"repo": "rust-overlay",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
39
flake.nix
Normal file
39
flake.nix
Normal file
@ -0,0 +1,39 @@
|
||||
{
|
||||
description = "logos-chat shared library";
|
||||
|
||||
nixConfig = {
|
||||
extra-substituters = [ "https://nix-cache.status.im/" ];
|
||||
extra-trusted-public-keys = [ "nix-cache.status.im-1:x/93lOfLU+duPplwMSBR+OlY4+mo+dCN7n0mr4oPwgY=" ];
|
||||
};
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
rust-overlay = {
|
||||
url = "github:oxalica/rust-overlay";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
};
|
||||
|
||||
outputs = { self, nixpkgs, rust-overlay, flake-utils }:
|
||||
flake-utils.lib.eachSystem [
|
||||
"x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin"
|
||||
] (system:
|
||||
let
|
||||
pkgs = import nixpkgs {
|
||||
inherit system;
|
||||
overlays = [ rust-overlay.overlays.default ];
|
||||
};
|
||||
libchatDrv = pkgs.callPackage ./nix/libchat.nix {};
|
||||
librln = pkgs.callPackage ./nix/librln.nix {};
|
||||
in {
|
||||
packages.default = pkgs.callPackage ./nix/default.nix {
|
||||
src = self;
|
||||
inherit libchatDrv librln;
|
||||
};
|
||||
devShells.default = pkgs.callPackage ./nix/shell.nix {
|
||||
inherit libchatDrv;
|
||||
};
|
||||
}
|
||||
);
|
||||
}
|
||||
93
nix/default.nix
Normal file
93
nix/default.nix
Normal file
@ -0,0 +1,93 @@
|
||||
{ lib, stdenv, nim, which, pkg-config, writeScriptBin,
|
||||
openssl, miniupnpc, libnatpmp, darwin ? null,
|
||||
src, # logos-chat source (self from flake, with submodules=1)
|
||||
libchatDrv, # result of libchat.nix
|
||||
librln }: # result of librln.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");
|
||||
libExt = if stdenv.isDarwin then "dylib" else "so";
|
||||
libchatPath = "${libchatDrv}/lib/liblogos_chat.${libExt}";
|
||||
in stdenv.mkDerivation {
|
||||
pname = "liblogoschat";
|
||||
version = "0.1.0";
|
||||
inherit src;
|
||||
|
||||
NIMFLAGS = lib.concatStringsSep " " [
|
||||
"--passL:vendor/nwaku/librln_v0.7.0.a"
|
||||
"--passL:-lm"
|
||||
"-d:miniupnpcUseSystemLibs"
|
||||
"-d:libnatpmpUseSystemLibs"
|
||||
"--passL:-lminiupnpc"
|
||||
"--passL:-lnatpmp"
|
||||
"-d:CONVERSATIONS_LIB:${libchatPath}"
|
||||
"-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 ]
|
||||
++ lib.optionals stdenv.isDarwin (with darwin.apple_sdk.frameworks; [
|
||||
Security
|
||||
CoreFoundation
|
||||
SystemConfiguration
|
||||
]);
|
||||
|
||||
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 = ''
|
||||
# Place pre-built librln where the Nim linker expects it
|
||||
cp ${librln}/lib/librln_v0.7.0.a vendor/nwaku/librln_v0.7.0.a
|
||||
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" ];
|
||||
};
|
||||
}
|
||||
41
nix/libchat.nix
Normal file
41
nix/libchat.nix
Normal file
@ -0,0 +1,41 @@
|
||||
{ lib, stdenv, rust-bin, makeRustPlatform, perl, pkg-config, cmake,
|
||||
darwin ? null }:
|
||||
|
||||
let
|
||||
rustToolchain = rust-bin.fromRustupToolchainFile ../vendor/libchat/rust_toolchain.toml;
|
||||
rPlatform = makeRustPlatform {
|
||||
cargo = rustToolchain;
|
||||
rustc = rustToolchain;
|
||||
};
|
||||
in rPlatform.buildRustPackage {
|
||||
pname = "liblogos-chat";
|
||||
version = "0.1.0";
|
||||
src = ../vendor/libchat;
|
||||
|
||||
cargoLock = {
|
||||
lockFile = ../vendor/libchat/Cargo.lock;
|
||||
outputHashes = {
|
||||
"chat-proto-0.1.0" = "sha256-aCl80VOIkd/GK3gnmRuFoSAvPBfeE/FKCaNlLt5AbUU=";
|
||||
};
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ perl pkg-config cmake ];
|
||||
buildInputs = lib.optionals stdenv.isDarwin (with darwin.apple_sdk.frameworks; [
|
||||
Security
|
||||
SystemConfiguration
|
||||
]);
|
||||
doCheck = false;
|
||||
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
mkdir -p $out/lib
|
||||
cp target/*/release/liblogos_chat.so $out/lib/ 2>/dev/null || true
|
||||
cp target/*/release/liblogos_chat.dylib $out/lib/ 2>/dev/null || true
|
||||
cp target/*/release/liblogos_chat.a $out/lib/ 2>/dev/null || true
|
||||
# fallback: non-cross build path
|
||||
cp target/release/liblogos_chat.so $out/lib/ 2>/dev/null || true
|
||||
cp target/release/liblogos_chat.dylib $out/lib/ 2>/dev/null || true
|
||||
cp target/release/liblogos_chat.a $out/lib/ 2>/dev/null || true
|
||||
runHook postInstall
|
||||
'';
|
||||
}
|
||||
31
nix/librln.nix
Normal file
31
nix/librln.nix
Normal file
@ -0,0 +1,31 @@
|
||||
{ lib, stdenv, fetchurl }:
|
||||
|
||||
let
|
||||
version = "v0.7.0";
|
||||
triplets = {
|
||||
"x86_64-linux" = "x86_64-unknown-linux-gnu";
|
||||
"aarch64-linux" = "aarch64-unknown-linux-gnu";
|
||||
"x86_64-darwin" = "x86_64-apple-darwin";
|
||||
"aarch64-darwin" = "aarch64-apple-darwin";
|
||||
};
|
||||
hashes = {
|
||||
"x86_64-linux" = "sha256-FVXW7HHbmxxp6vy7Ji5iy0Y483P9JJXUnkyE84j3gZk=";
|
||||
"aarch64-linux" = "sha256-E5dir4E/UT0XiaKJxnEXRz9pIGRwWHr5fHkRPYN6T80=";
|
||||
"x86_64-darwin" = "sha256-FyuXn7hlecZMDhghE6CknVWNN9JMOADzVUVIUxknO78=";
|
||||
"aarch64-darwin" = "sha256-8buoDdGtPDtrVQh7oIpmd9OYqTkS5byGgjo7zhNLn84=";
|
||||
};
|
||||
triplet = triplets.${stdenv.hostPlatform.system};
|
||||
tarball = fetchurl {
|
||||
url = "https://github.com/vacp2p/zerokit/releases/download/${version}/${triplet}-arkzkey-rln.tar.gz";
|
||||
hash = hashes.${stdenv.hostPlatform.system};
|
||||
};
|
||||
in stdenv.mkDerivation {
|
||||
pname = "librln";
|
||||
inherit version;
|
||||
src = tarball;
|
||||
unpackPhase = "tar -xzf $src";
|
||||
installPhase = ''
|
||||
mkdir -p $out/lib
|
||||
cp release/librln.a $out/lib/librln_${version}.a
|
||||
'';
|
||||
}
|
||||
21
nix/shell.nix
Normal file
21
nix/shell.nix
Normal file
@ -0,0 +1,21 @@
|
||||
{ pkgs, lib, stdenv, libchatDrv }:
|
||||
|
||||
let
|
||||
libExt = if stdenv.isDarwin then "dylib" else "so";
|
||||
darwinDeps = lib.optionals stdenv.isDarwin (with pkgs.darwin.apple_sdk.frameworks; [
|
||||
Security CoreFoundation SystemConfiguration
|
||||
]);
|
||||
in pkgs.mkShell {
|
||||
buildInputs = with pkgs; [
|
||||
nim cargo rustc clippy rustfmt
|
||||
git cmake gnumake which pkg-config
|
||||
openssl miniupnpc libnatpmp
|
||||
] ++ darwinDeps;
|
||||
|
||||
shellHook = ''
|
||||
export CONVERSATIONS_LIB="${libchatDrv}/lib/liblogos_chat.${libExt}"
|
||||
echo "logos-chat dev shell. CONVERSATIONS_LIB=$CONVERSATIONS_LIB"
|
||||
echo "Build: make liblogoschat"
|
||||
echo "Nix build: nix build '.?submodules=1#'"
|
||||
'';
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user