build(amm): link amm_client_ffi into the AMM UI module

This commit is contained in:
Andrea Franz 2026-07-13 22:20:12 +02:00 committed by r4bbit
parent f3a14f051a
commit cfb62e4d2f
6 changed files with 39473 additions and 9 deletions

View File

@ -26,4 +26,6 @@ logos_module(
LINK_LIBRARIES LINK_LIBRARIES
Qt6::Gui Qt6::Gui
Qt6::Network Qt6::Network
EXTERNAL_LIBS
amm_client_ffi
) )

View File

@ -20,7 +20,7 @@ honors), and its config (`wallet_config.json`) self-initializes.
Account/keystore sharing follows the runtime: Account/keystore sharing follows the runtime:
- **Standalone** (`nix run .`): own core-module instance, but the canonical - **Standalone** (`nix run .#amm-ui`): own core-module instance, but the canonical
`~/.lee/wallet` keystore is shared with the LEZ wallet UI and any other LEZ `~/.lee/wallet` keystore is shared with the LEZ wallet UI and any other LEZ
app on the machine. A previously-created wallet auto-opens on launch. app on the machine. A previously-created wallet auto-opens on launch.
- **Inside Basecamp**: the core wallet module is a single shared instance, so on - **Inside Basecamp**: the core wallet module is a single shared instance, so on
@ -50,14 +50,20 @@ This makes `lgpm` available as a global command.
## Running the UI standalone ## Running the UI standalone
Start the UI with: The app is built from the **repository-root** flake (which also provides the
`amm_client_ffi` library it links). From the repo root, launch it with its named
attribute:
```bash ```bash
nix run . nix run .#amm-ui
``` ```
This builds and runs the application in development mode. The Logos bridge is unavailable in standalone mode, but the UI layout and mock data are fully functional. This builds and runs the application in development mode. The Logos bridge is unavailable in standalone mode, but the UI layout and mock data are fully functional.
Build just the FFI crate with `nix build .#amm_client_ffi`. (Each UI is exposed
under its own name, so future apps are `nix run .#<name>` — there is no bare
`nix run .` default.)
## Running inside Logos Basecamp ## Running inside Logos Basecamp
This app is a UI plugin that depends on the **core wallet module** This app is a UI plugin that depends on the **core wallet module**

View File

@ -11,6 +11,15 @@
logos_execution_zone.url = "github:logos-blockchain/logos-execution-zone-module?rev=d2e9400ac06c3cdbfc2405b4f153fff9841a453c"; logos_execution_zone.url = "github:logos-blockchain/logos-execution-zone-module?rev=d2e9400ac06c3cdbfc2405b4f153fff9841a453c";
}; };
# NOTE: this flake is no longer built standalone. The amm_client_ffi crate
# (the Rust C FFI library the AmmUiBackend C++ code links against) lives in
# the repo-root flake, and referencing it from here would require either a
# hardcoded absolute `git+file://` path or a `path:../..` input — the latter
# fails flake evaluation because the app directory is copied into the Nix
# store as its own flake root, so `../..` can't escape it there. Instead,
# the repo-root flake.nix builds this module directly (src = ./apps/amm)
# and resolves amm_client_ffi via `self`. Build/run the app from the repo
# root, e.g. `nix build .#packages.<system>.default` or `nix run .`.
outputs = inputs@{ logos-module-builder, ... }: outputs = inputs@{ logos-module-builder, ... }:
logos-module-builder.lib.mkLogosQmlModule { logos-module-builder.lib.mkLogosQmlModule {
src = ./.; src = ./.;

View File

@ -14,11 +14,13 @@
"build": [], "build": [],
"runtime": ["qt6.qtdeclarative", "zstd", "krb5", "abseil-cpp"] "runtime": ["qt6.qtdeclarative", "zstd", "krb5", "abseil-cpp"]
}, },
"external_libraries": [], "external_libraries": [
{ "name": "amm_client_ffi" }
],
"cmake": { "cmake": {
"find_packages": [], "find_packages": [],
"extra_sources": [], "extra_sources": [],
"extra_include_dirs": [], "extra_include_dirs": ["lib"],
"extra_link_libraries": [] "extra_link_libraries": []
} }
} }

39390
flake.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -9,11 +9,25 @@
url = "github:oxalica/rust-overlay"; url = "github:oxalica/rust-overlay";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
# The AMM QML UI module (apps/amm) is built from this same flake so it can
# reference the amm_client_ffi crate package via `self` — no filesystem
# path or git-remote reference to this repo is needed (see apps/amm/flake.nix
# history: a `git+file://` URL pointing at a local checkout is
# machine-specific and not portable).
logos-module-builder.url = "github:logos-co/logos-module-builder";
# Core wallet module (the LEZ wallet FFI Qt plugin). The input name must
# match the metadata.json `dependencies` entry so the builder can resolve
# it as a module dependency. This rev pins LEZ (lssa) at fb8cbac4, which
# includes the macOS Metal-build fix, so no `--override-input` is needed.
logos_execution_zone.url = "github:logos-blockchain/logos-execution-zone-module?rev=d2e9400ac06c3cdbfc2405b4f153fff9841a453c";
}; };
outputs = outputs =
{ self, nixpkgs, flake-utils, crane, rust-overlay }: inputs@{ self, nixpkgs, flake-utils, crane, rust-overlay, logos-module-builder, logos_execution_zone, ... }:
flake-utils.lib.eachDefaultSystem ( let
crateOutputs = flake-utils.lib.eachDefaultSystem (
system: system:
let let
pkgs = import nixpkgs { pkgs = import nixpkgs {
@ -69,4 +83,49 @@
packages.amm_client_ffi = ammClientFfi; packages.amm_client_ffi = ammClientFfi;
} }
); );
# The AMM QML UI module (apps/amm). Its external_libraries entry
# (amm_client_ffi) is resolved to `self.packages.${system}.amm_client_ffi`
# above — the module builder's resolveExtInput reads
# `flakeInput.packages.${system}.${pkgName}`, and passing `self` here
# works because `self` is this very flake, which already exposes that
# package per crateOutputs above.
appOutputs = logos-module-builder.lib.mkLogosQmlModule {
src = ./apps/amm;
configFile = ./apps/amm/metadata.json;
flakeInputs = inputs;
externalLibInputs = {
amm_client_ffi = { input = self; packages.default = "amm_client_ffi"; };
};
};
# Expose the AMM QML UI as a NAMED app/package (`amm-ui`) rather than
# `<sys>.default` — the repo is expected to grow more UIs over time,
# each runnable via `nix run .#<name>`. `appOutputs.apps.<sys>.default`
# and `appOutputs.packages.<sys>.default` (the UI launcher and its
# bundle, respectively) are renamed to `amm-ui`; no `default` survives
# for either attribute set.
appApps = appOutputs.apps or { };
appPkgs = appOutputs.packages or { };
renamedApps = builtins.mapAttrs (
system: attrs:
(builtins.removeAttrs attrs [ "default" ]) // (if attrs ? default then { amm-ui = attrs.default; } else { })
) appApps;
mergedPackages = builtins.mapAttrs (
system: cratePkgs:
let
appSysPkgs = appPkgs.${system} or { };
in
(builtins.removeAttrs cratePkgs [ "default" ])
// (builtins.removeAttrs appSysPkgs [ "default" ])
// (if appSysPkgs ? default then { amm-ui = appSysPkgs.default; } else { })
) crateOutputs.packages;
in
(builtins.removeAttrs appOutputs [ "apps" "packages" ])
// {
apps = renamedApps;
packages = mergedPackages;
};
} }