nandi/frqpublic Fork 0
9f081a1726a0fcfee9a804cffaa3e1bf5d52e290
Commits
Clone
git clone https://git.rickub.com/nandi/frq.git
git clone ssh://git@rickub.com/nandi/frq.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

flake.nix · 483 lines · 22.9 KBNix Blame HistoryRaw
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago1{
2 # frq is Jolt source, so "building" it is three things, not one:
3 #
4 # jolt the runtime that reads it (github:jolt-lang/jolt)
5 # jolt-native libvidya and libjoltmoq, in Rust (gitlab:nandithebull/jolt-native)
6 # frq this tree, with its deps resolved to store paths
7 #
8 # Jolt resolves deps.edn by running git at startup, which a build sandbox has
9 # no network for — so every dep is fetched by Nix instead and handed back as
10 # a :local/root through -Sdeps.
11 #
12 # nix build .#frq && ./result/bin/frq
13 #
14 # On a machine that is not NixOS the GL driver is the host's and the loader
15 # will not find it, so the window never opens ("GL display: argument does not
Find the host's GL driver when the store's is not the system's 633faad nandi 19d ago16 # name a valid config"). The launcher handles that itself: off NixOS it hands
17 # the process to nixGL, which puts the host's driver ahead of the store's.
18 # Nothing extra to type, and a distrobox/container Arch is the same case as
19 # a bare one.
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago20 description = "frq a freeq client in jolt";
21
22 inputs = {
23 nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
Take jolt and jolt-native as flakes, off my own fork aaa560d nandi 13d ago24 # `git+https` with `?submodules=1` rather than the github scheme: Jolt's
25 # own flake declares `self.submodules`, which this Nix rejects when the
26 # flake is fetched as `github:`. Its outputs are not what we take — the
27 # runtime is built here, by joltFrom — but it is a flake all the same, so
28 # its own inputs are locked with ours rather than left to float, and
29 # `vendor/` comes along as the submodule the build needs.
30 #
31 # The fork rather than jolt-lang/jolt: it is what jolt-android-src already
32 # pins for the boot image, and a desktop runtime built from a different
33 # tree than the APK's is the same drift the jolt-native comment warns
34 # about. Unpinned here — the desktop follows the fork's main, while the
35 # APK stays on the rev below.
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago36 jolt-src = {
Take jolt and jolt-native as flakes, off my own fork aaa560d nandi 13d ago37 url = "git+https://gitlab.com/nandithebull/jolt?submodules=1";
38 inputs.nixpkgs.follows = "nixpkgs";
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago39 };
40
Take the Android objects from jolt-native's CI, always the latest 472e179 nandi 11d ago41 # The source half of jolt-native: the Jolt code under glimmer-backends/ that
42 # binds the native objects, and the flake that builds the desktop ones. The
43 # Android objects no longer come from here — jolt-native-android below
44 # fetches those prebuilt — so this input is what `just run` builds against
45 # and what an APK's Clojure side is read from, both at this rev.
Take the jolt-native ahead of the release, since a run can build it 36f6c77 nandi 17d ago46 #
47 # Pinned all the same, and pinned to a rev: this input carries both halves of
Pin the native half to the release the rest of the tree names cb7f9f1 nandi 17d ago48 # glimmer-vidya — libvidya, and the Jolt side that binds it — so an
49 # unpinned `main` is a build whose native half is free to sit at a
50 # different commit from the tree that talks to it. It did, and what the
51 # drift cost was silence: the Jolt half sent a reaction pill's hover card
52 # to a libvidya with no handler for one, and the pill said nothing.
Merge origin/main, and let one jolt-native answer for both backends 1e8b590 nandi 16d ago53 # It also carries the terminal backend — crates/jolt-tui, the same tree ABI
54 # over a grid of cells, and jolt/glimmer-tui beside glimmer-vidya. That was
55 # a second input at a second rev while it lived on a branch, which is the
56 # drift this comment warns about wearing a different hat: one input, and
57 # the window and the terminal are the same library either way.
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago58 jolt-native = {
Take the Android objects from jolt-native's CI, always the latest 472e179 nandi 11d ago59 url = "git+https://gitlab.com/nandithebull/jolt-native?rev=d970307ccf1fe67e2e971f2837d2282d8ba79a62";
Take jolt and jolt-native as flakes, off my own fork aaa560d nandi 13d ago60 inputs.nixpkgs.follows = "nixpkgs";
Paint the same screens into a terminal ab83b42 nandi 17d ago61 };
62
Take the Android objects from jolt-native's CI, always the latest 472e179 nandi 11d ago63 # The Android objects, prebuilt by jolt-native's CI rather than compiled
64 # here: an APK needs libvidya and libjoltmoq for arm64, and building them
65 # locally means an NDK, a Rust cross toolchain and the whole crane graph
66 # for two files that upstream already built and published.
67 #
68 # "latest" is the version its CI overwrites on every default-branch build,
69 # so this input finds a new one on `nix flake update` -- but flake.lock
70 # still records exactly which bytes an APK was built from, which is the
71 # pin that matters. `just bump` decides when to move; this only decides
72 # where to look. The archive is rooted at include/ and lib/arm64-v8a/, so
73 # nothing here has to unpack it.
74 jolt-native-android = {
75 url = "https://gitlab.com/api/v4/projects/nandithebull%2Fjolt-native/packages/generic/jolt-native/latest/android-arm64-v8a.tar.gz";
76 flake = false;
77 };
78
Build the APK from the flake, and from nothing 6aa2a6b nandi 18d ago79 # Chez itself, because the APK needs a cross target nixpkgs does not
80 # build: frq's Scheme is compiled to an arm64 boot image, and that wants
81 # Chez's own `tarm64le` workarea — boot files, xpatch and libkernel.a.
82 # The version is the one the hand-built tree under ~/.cache used, and the
83 # submodules are not optional (zuo builds it, lz4 and zlib link into it).
Take jolt and jolt-native as flakes, off my own fork aaa560d nandi 13d ago84 # The same fork jolt-src takes, built here rather than fetched as a
85 # release binary: upstream reads the socket address out of `struct
Build the APK from the flake, and from nothing 6aa2a6b nandi 18d ago86 # addrinfo` at glibc's offset, which on Bionic is `ai_canonname`, so an APK
Take jolt and jolt-native as flakes, off my own fork aaa560d nandi 13d ago87 # built with upstream cannot open a TLS connection at all. Pinned to a rev
88 # where jolt-src is not: the APK is a release artefact, so its runtime
89 # moves when `just bump` says so rather than when the fork does.
Build the APK from the flake, and from nothing 6aa2a6b nandi 18d ago90 jolt-android-src = {
91 url = "git+https://gitlab.com/nandithebull/jolt?rev=2b80d68d1f7a31ba92b208b3957e5fb555617ada&submodules=1";
Take jolt and jolt-native as flakes, off my own fork aaa560d nandi 13d ago92 inputs.nixpkgs.follows = "nixpkgs";
Build the APK from the flake, and from nothing 6aa2a6b nandi 18d ago93 };
94
95 chez-src = {
96 url = "git+https://github.com/cisco/ChezScheme?ref=refs/tags/v10.4.1&submodules=1";
97 flake = false;
98 };
99
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago100 # The sha deps.edn pins, on the fork with the reconciler fixes.
101 glimmer = {
102 url = "git+https://gitlab.com/nandithebull/glimmer?rev=399df371c790d690fb6e4560c3d4d7f838502857";
103 flake = false;
104 };
Find the host's GL driver when the store's is not the system's 633faad nandi 19d ago105
106 # Only ever used off NixOS, to put the host GL driver on the loader path.
107 nixgl = {
108 url = "github:nix-community/nixGL";
109 inputs.nixpkgs.follows = "nixpkgs";
110 };
Bundle the closure into one file the AppImage runtime mounts f82b93f nandi 18d ago111
112 # Wraps a closure into a single self-extracting file. Only the `appimage`
113 # output evaluates it.
114 nix-appimage = {
115 url = "github:ralismark/nix-appimage";
116 inputs.nixpkgs.follows = "nixpkgs";
117 };
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago118 };
119
Take the Android objects from jolt-native's CI, always the latest 472e179 nandi 11d ago120 outputs = { self, nixpkgs, jolt-src, jolt-native, jolt-native-android, glimmer, chez-src, jolt-android-src, nixgl, nix-appimage }:
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago121 let
122 systems = [ "x86_64-linux" "aarch64-linux" ];
123 forEachSystem = f:
124 nixpkgs.lib.genAttrs systems (system: f nixpkgs.legacyPackages.${system});
Run this tree on a native half the builders made a32699e nandi 17d ago125
126 # Mesa, despite the name: it covers Intel and AMD alike. The NVIDIA
127 # wrappers are the ones that need --impure (they read the host kernel
128 # module's version), which is why this only ever reaches for Intel.
Stop carrying the 32-bit GL stack and half of git 040f2c1 nandi 16d ago129 #
130 # Built from nixGL's default.nix rather than taken from its flake
131 # outputs, for the one argument the flake hardcodes on: `enable32bits`,
132 # which on x86_64 puts a second, i686 copy of mesa, its LLVM, and
133 # intel-media-driver into the wrapper. frq is 64-bit on both halves —
134 # the Rust cdylibs and the Chez runtime — so nothing here ever opens the
135 # 32-bit driver, and carrying it is most of the dev shell's closure.
136 nixGLFor = pkgs: (import nixgl {
137 inherit pkgs;
138 enable32bits = false;
139 }).nixGLIntel;
Run this tree on a native half the builders made a32699e nandi 17d ago140
141 # egui reaches for these with dlopen rather than linking them, so being
142 # in the cdylib's buildInputs is not enough — whatever starts frq has to
Follow the xorg renames, and stop wrapping nix in distrobox a400a00 nandi 16d ago143 # put them on the loader path itself. Without libx11 here, vidya reports
Run this tree on a native half the builders made a32699e nandi 17d ago144 # "X11 unavailable", falls back to Wayland, and winit refuses to build a
145 # second event loop after the failed first one.
146 #
147 # Out here rather than beside the package that first needed them: the
148 # dev shell starts frq too, on this tree's source rather than the store's
149 # copy of it, and a second copy of this list is a second chance for the
150 # two ways of running to disagree about what the window needs.
151 runtimeLibsFor = pkgs: with pkgs; [
152 libGL
153 libxkbcommon
154 wayland
Follow the xorg renames, and stop wrapping nix in distrobox a400a00 nandi 16d ago155 libx11
156 libxcursor
157 libxi
158 libxrandr
Run this tree on a native half the builders made a32699e nandi 17d ago159 vulkan-loader
160 ];
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago161 in
162 {
163 packages = forEachSystem (pkgs:
164 let
165 inherit (pkgs) lib;
166
Run this tree on a native half the builders made a32699e nandi 17d ago167 nixGL = nixGLFor pkgs;
Find the host's GL driver when the store's is not the system's 633faad nandi 19d ago168
Take the native objects from their own flake rather than rebuilding them 0ee8bba nandi 13d ago169 # libvidya (the retained-tree ABI glimmer-vidya binds, on egui),
170 # libjolttui (the same tree over a grid of cells) and libjoltmoq (the
171 # AV media plane) — one workspace, three cdylibs, taken from
172 # jolt-native's own flake rather than rebuilt here.
173 #
174 # This used to be a rustPlatform.buildRustPackage over the same
175 # source, which meant restating upstream's build: the seven git deps
176 # hashed by hand in `cargoLock.outputHashes` and re-hashed whenever
177 # its Cargo.lock moved, the linuxHeaders path v4l2r's bindgen wants,
178 # and a postPatch dropping the .cargo/config.toml that pointed the
179 # build at DotSlash. Upstream's flake says all of that itself now,
180 # and says it once. It also builds cpal with the `pipewire` feature,
181 # which the restatement did not — so device names in a call are
182 # PipeWire's rather than raw ALSA PCMs.
183 native = jolt-native.packages.${pkgs.stdenv.hostPlatform.system}.default;
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago184
Bind libmoq_ffi from the object's own metadata, not from its header 9f081a1 nandi 9d ago185 # libmoq_ffi — MoQ over QUIC behind UniFFI's C ABI, FETCHED rather
186 # than built. This is the object `frq.moq.raw` is generated from.
187 #
188 # Fetched because building it is the thing this whole exercise is
189 # about: moq-ffi pulls moq-native, iroh, quinn, rustls and aws-lc-sys
190 # behind it, which is 440 crates that nothing else in this tree
191 # needs. Upstream already publishes the object for both Linux
192 # architectures, so we take those bytes.
193 #
194 # Pinned to a release and to a hash, and the hashes below are
195 # upstream's own published .sha256 files rather than ones observed
196 # here — a `nix-prefetch` of whatever the URL serves today would
197 # record that it downloaded something, not that it downloaded the
198 # right thing.
199 #
200 # WHAT THIS BUILD IS NOT: moq-ffi's `audio` and `video` features are
201 # on by default upstream and are OFF in these artifacts, so there is
202 # no publish_audio/publish_video and no moqaudio*/moqvideo* here —
203 # 206 functions where the Apple artifact has 230. That is why the
204 # bindings are generated from the object (`just gen-moq`) and not
205 # from the C header the release ships, which describes the Apple one.
206 moqFfi =
207 let
208 version = "0.3.17";
209 target = {
210 "x86_64-linux" = "x86_64-unknown-linux-gnu";
211 "aarch64-linux" = "aarch64-unknown-linux-gnu";
212 }.${pkgs.stdenv.hostPlatform.system};
213 hash = {
214 "x86_64-linux" = "sha256-dzQXpV4JgdtD+g33WX51FFAQdfCUXkNsx1xPbobPfUI=";
215 "aarch64-linux" = "sha256-PdzRwbJFqOZWRgI0HHX2XUH+Ljh4V3jvQ9asfvCuIPA=";
216 }.${pkgs.stdenv.hostPlatform.system};
217 in
218 pkgs.stdenv.mkDerivation {
219 pname = "libmoq-ffi";
220 inherit version;
221 src = pkgs.fetchurl {
222 url = "https://github.com/kixelated/moq/releases/download/moq-ffi-v${version}/moq-ffi-${version}-${target}-libmoq_ffi.so";
223 inherit hash;
224 };
225 dontUnpack = true;
226 # It carries no RUNPATH and needs libgcc_s, libm and libc — the
227 # host's on an ordinary distro, and nothing at all on NixOS
228 # unless they are bound here.
229 nativeBuildInputs = [ pkgs.autoPatchelfHook ];
230 buildInputs = [ pkgs.stdenv.cc.cc.lib ];
231 installPhase = ''
232 mkdir -p $out/lib
233 cp $src $out/lib/libmoq_ffi.so
234 chmod +w $out/lib/libmoq_ffi.so
235 '';
236 };
237
238 # One directory for the loader to look in. jolt resolves every
239 # :jolt/native name against JOLT_NATIVE_LIB, and the objects now come
240 # from two places — jolt-native's flake, and the moq-ffi release — so
241 # they are joined rather than the path being made a list, which the
242 # loader does not take.
243 nativeAll = pkgs.symlinkJoin {
244 name = "frq-native";
245 paths = [ native moqFfi ];
246 };
247
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago248 # Jolt itself: Clojure on Chez, built the way its own flake builds it.
Build the APK from the flake, and from nothing 6aa2a6b nandi 18d ago249 # A function, because there are two of them — upstream for the
250 # desktop, and the Bionic-addrinfo fork for the boot image the APK
251 # carries. Nothing else about the build differs.
252 joltFrom = src: pkgs.stdenv.mkDerivation {
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago253 pname = "jolt";
254 version = "dev";
Build the APK from the flake, and from nothing 6aa2a6b nandi 18d ago255 inherit src;
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago256
257 strictDeps = true;
258 nativeBuildInputs = with pkgs; [ chez makeWrapper pkg-config xxd ];
259 buildInputs = with pkgs; [ lz4 zlib ncurses openssl libuuid ];
260
261 JOLT_VERSION = "dev";
262 dontConfigure = true;
263
264 buildPhase = ''
265 runHook preBuild
266 scheme --script host/chez/build-jolt.ss release target/release/jolt
267 runHook postBuild
268 '';
269
270 installPhase = ''
271 runHook preInstall
272 mkdir -p "$out/bin"
273 install -m755 target/release/jolt "$out/bin/jolt"
274 runHook postInstall
275 '';
276
277 # jolt.deps shells out to git and unzip, and jolt.mvn-http dlopens
Stop carrying the 32-bit GL stack and half of git 040f2c1 nandi 16d ago278 # OpenSSL through the JOLT_OPENSSL_LIBDIR seam. gitMinimal rather
279 # than git: all jolt.deps asks for is clone/fetch/rev-parse, and
280 # the full package carries Perl and Python for the subcommands
281 # written in them — a quarter of a gigabyte for git-send-email.
Read the clock in the reader's zone when /etc/localtime is a file bffe879 nandi 18d ago282 #
283 # TZDIR so a zone *name* resolves wherever this runs: frq.clock
284 # hands one to tzset, and glibc then looks for the tzfile under
285 # /usr/share/zoneinfo unless told otherwise — which a NixOS host
286 # does not have. The store's own tzdata is there on both kinds of
287 # machine. --set-default, so a TZDIR the user set still wins.
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago288 postFixup = ''
289 wrapProgram "$out/bin/jolt" \
Stop carrying the 32-bit GL stack and half of git 040f2c1 nandi 16d ago290 --prefix PATH : "${pkgs.lib.makeBinPath [ pkgs.gitMinimal pkgs.unzip ]}" \
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago291 --set-default JOLT_OPENSSL_LIBDIR "${pkgs.lib.makeLibraryPath [ pkgs.openssl ]}" \
Read the clock in the reader's zone when /etc/localtime is a file bffe879 nandi 18d ago292 --set-default TZDIR "${pkgs.tzdata}/share/zoneinfo" \
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago293 --set-default SSL_CERT_FILE "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt"
294 '';
295 };
296
Build the APK from the flake, and from nothing 6aa2a6b nandi 18d ago297 joltRuntime = joltFrom jolt-src;
298 joltAndroid = joltFrom jolt-android-src;
299
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago300 # glimmer-vidya lives inside the jolt-native checkout, and its own
301 # deps.edn asks for glimmer by git — the top-level override below
302 # answers for both.
Take the Android objects from jolt-native's CI, always the latest 472e179 nandi 11d ago303 glimmerVidya = "${jolt-native}/glimmer-backends/glimmer-vidya";
304 glimmerTui = "${jolt-native}/glimmer-backends/glimmer-tui";
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago305
Run this tree on a native half the builders made a32699e nandi 17d ago306 runtimeLibs = runtimeLibsFor pkgs;
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago307
308 # The project as jolt sees it: source, deps.edn, nothing else.
309 frqSource = pkgs.runCommand "frq-source" { } ''
310 mkdir -p "$out"
311 cp -r ${self}/src ${self}/deps.edn "$out/"
312 '';
313
314 # Jolt resolves deps.edn from the working directory, so the launcher
315 # runs from the store copy. Its .jolt/cpcache write lands on a
316 # read-only directory and jolt treats that as a quiet cache miss, so
317 # the only cost is re-resolving the (already local) graph per start.
318 frqScript = pkgs.writeShellScript "frq" ''
Bind libmoq_ffi from the object's own metadata, not from its header 9f081a1 nandi 9d ago319 export LD_LIBRARY_PATH="${nativeAll}/lib:${lib.makeLibraryPath runtimeLibs}''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago320 cd ${frqSource}
Find the host's GL driver when the store's is not the system's 633faad nandi 19d ago321
322 # On NixOS the store's Mesa is the system's and the window opens.
323 # Anywhere else the real driver is the host's, so defer to nixGL
324 # it prepends the host driver, which has to win over ours.
325 runner=""
326 [ -e /run/current-system ] || runner="${nixGL}/bin/nixGLIntel"
327
328 exec ''${runner} ${joltRuntime}/bin/jolt \
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago329 -Sdeps '{:deps {jolt-lang/glimmer {:local/root "${glimmer}"} nandi/glimmer-vidya {:local/root "${glimmerVidya}"}}}' \
330 -M:frq "$@"
331 '';
332
Paint the same screens into a terminal ab83b42 nandi 17d ago333 # The same source, the other backend. No GL, no nixGL and no X11 —
334 # a terminal is the one surface that needs nothing from the host but
335 # a terminal, which is the reason this output exists.
336 tuiScript = pkgs.writeShellScript "frq-tui" ''
Bind libmoq_ffi from the object's own metadata, not from its header 9f081a1 nandi 9d ago337 export LD_LIBRARY_PATH="${nativeAll}/lib''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
Paint the same screens into a terminal ab83b42 nandi 17d ago338 cd ${frqSource}
339
340 exec ${joltRuntime}/bin/jolt \
341 -Sdeps '{:deps {jolt-lang/glimmer {:local/root "${glimmer}"} nandi/glimmer-vidya {:local/root "${glimmerVidya}"} nandi/glimmer-tui {:local/root "${glimmerTui}"}}}' \
342 -m frq.tui "$@"
343 '';
344
345 tui = pkgs.runCommand "frq-tui-0.1.0"
346 {
347 meta = {
348 description = "frq's screens in a terminal";
349 mainProgram = "frq-tui";
350 platforms = systems;
351 };
352 }
353 ''
354 mkdir -p "$out/bin"
355 ln -s ${tuiScript} "$out/bin/frq-tui"
356 '';
357
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago358 frq = pkgs.runCommand "frq-0.1.0"
359 {
360 meta = {
361 description = "A freeq client in jolt";
362 mainProgram = "frq";
363 platforms = systems;
364 };
365 }
366 ''
367 mkdir -p "$out/bin"
368 ln -s ${frqScript} "$out/bin/frq"
369 '';
Build the APK from the flake, and from nothing 6aa2a6b nandi 18d ago370 # --- Android ------------------------------------------------------
371 # The SDK and the NDK are Google's, which means unfree and a licence
372 # to accept — so this is its own import of nixpkgs rather than the
373 # `legacyPackages` everything above uses. Confined to the Android
374 # outputs: `nix build` of frq itself never evaluates it.
375 #
Build the APK as derivations only, and retire the buck2 graph 3bc3aaa nandi 16d ago376 # The NDK here is r29, which is the one the pinned libvidya was
377 # built with.
Build the APK from the flake, and from nothing 6aa2a6b nandi 18d ago378 androidPkgs = import nixpkgs {
379 inherit (pkgs.stdenv.hostPlatform) system;
380 config = {
381 allowUnfree = true;
382 android_sdk.accept_license = true;
383 };
384 };
385
386 androidComposition = androidPkgs.androidenv.composeAndroidPackages {
387 buildToolsVersions = [ "36.0.0" ];
388 platformVersions = [ "36" ];
389 includeNDK = true;
390 };
391
392 android = import ./nix/android.nix {
Take the Android objects from jolt-native's CI, always the latest 472e179 nandi 11d ago393 inherit pkgs self chez-src jolt-native jolt-native-android glimmer joltAndroid;
Build the APK from the flake, and from nothing 6aa2a6b nandi 18d ago394 inherit (pkgs) lib;
395 androidSdk = androidComposition.androidsdk;
396 ndk = androidComposition.ndk-bundle;
397 };
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago398 in
399 {
Bind libmoq_ffi from the object's own metadata, not from its header 9f081a1 nandi 9d ago400 inherit native moqFfi nativeAll frq;
Merge origin/main, and let one jolt-native answer for both backends 1e8b590 nandi 16d ago401 inherit tui;
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago402 jolt = joltRuntime;
403 default = frq;
Bundle the closure into one file the AppImage runtime mounts f82b93f nandi 18d ago404
405 # frq and everything it loads, squashed into one runnable file for
406 # hosts without Nix. The whole closure rides along — Mesa included,
407 # which is not waste: off NixOS the launcher goes through nixGL, and
408 # nixGL needs a store Mesa to put the host's driver in front of.
409 appimage =
410 nix-appimage.bundlers.${pkgs.stdenv.hostPlatform.system}.default frq;
Build the APK from the flake, and from nothing 6aa2a6b nandi 18d ago411 }
412 # An APK is built by a linux-x86_64 NDK and a linux-x86_64 jolt, and
413 # Google ships no other; on aarch64 the Android outputs are simply
414 # absent rather than present and broken.
415 // lib.optionalAttrs (pkgs.stdenv.hostPlatform.system == "x86_64-linux") {
416 inherit (android) apk chezAndroid joltBoot libjoltapp;
417 apk-unsigned = android.apk-unsigned;
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago418 });
419
Run this tree on a native half the builders made a32699e nandi 17d ago420 # Where `just run` runs, and — because entering it realises what it
421 # names — what builds the half of frq that is not this working tree.
422 #
423 # The two halves, and the split is the whole point of the shell. The frq
424 # source is the files on disk, uncommitted edits and all. Everything
425 # under it — jolt, glimmer, glimmer-vidya, both native objects — is the
426 # flake's, at the revs flake.lock names, so a run says what it ran
427 # against and both halves of glimmer-vidya move together. That is the
428 # drift the `jolt-native` input's comment is about, and a pin frq can
429 # answer for is worth more here than the convenience of a checkout.
430 #
Take the native objects from their own flake rather than rebuilding them 0ee8bba nandi 13d ago431 # `native` is jolt-native's own flake output. It was a buck2 graph when
432 # this comment was first written and a cargo build restated here when it
433 # was second: buck2 fetches its rustc, zig and every third-party crate as
434 # it goes and writes buck-out into the tree it builds, so a sandbox with
435 # no network and a read-only store was the one place it could not run.
436 # Upstream builds with nix now, so the thing its CI runs and the thing
437 # this shell hands a builder are the same derivation.
Run this tree on a native half the builders made a32699e nandi 17d ago438 #
439 # Nothing here says "nixbuild", though: it is a plain derivation, and
Inline the babashka scripts into the justfile 76dcc6c nandi 11d ago440 # where it gets built is the machine's business. The `run` recipe asks for
Run this tree on a native half the builders made a32699e nandi 17d ago441 # the shell with --max-jobs 0, which is what sends it to the `builders`
442 # entry rather than compiling egui on a laptop.
443 devShells = forEachSystem (pkgs:
444 let
445 inherit (pkgs) lib;
Bind libmoq_ffi from the object's own metadata, not from its header 9f081a1 nandi 9d ago446 inherit (self.packages.${pkgs.stdenv.hostPlatform.system}) jolt native nativeAll;
Run this tree on a native half the builders made a32699e nandi 17d ago447 in
448 {
449 default = pkgs.mkShellNoCC {
450 name = "frq";
451
452 # jolt, because the runtime frq is run by should be the flake's
453 # too. nixGL for the same reason the launcher reaches for it — see
Inline the babashka scripts into the justfile 76dcc6c nandi 11d ago454 # frqScript. just so the recipe runner comes from here too rather
455 # than the host — `nix develop` and then `just run` is the whole of
456 # what a machine with nix needs.
457 packages = [ jolt pkgs.just (nixGLFor pkgs) ];
458
459 # Read by the recipes rather than baked into a wrapper: the frq
Run this tree on a native half the builders made a32699e nandi 17d ago460 # source `just run` runs is the working tree, so the launcher has
Inline the babashka scripts into the justfile 76dcc6c nandi 11d ago461 # to live in that tree and the shell has to hand it its answers.
462 # Naming these is also what makes the shell build them.
Bind libmoq_ffi from the object's own metadata, not from its header 9f081a1 nandi 9d ago463 JOLT_NATIVE_LIB = "${nativeAll}/lib";
Run this tree on a native half the builders made a32699e nandi 17d ago464 GLIMMER_SRC = glimmer;
Take the Android objects from jolt-native's CI, always the latest 472e179 nandi 11d ago465 GLIMMER_VIDYA_SRC = "${jolt-native}/glimmer-backends/glimmer-vidya";
466 GLIMMER_TUI_SRC = "${jolt-native}/glimmer-backends/glimmer-tui";
Run this tree on a native half the builders made a32699e nandi 17d ago467 FRQ_LIB_PATH = lib.makeLibraryPath (runtimeLibsFor pkgs);
468 NIXGL = "${nixGLFor pkgs}/bin/nixGLIntel";
469 };
470 });
471
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago472 apps = forEachSystem (pkgs: {
473 default = {
474 type = "app";
475 program = "${self.packages.${pkgs.stdenv.hostPlatform.system}.frq}/bin/frq";
476 };
Paint the same screens into a terminal ab83b42 nandi 17d ago477 tui = {
478 type = "app";
479 program = "${self.packages.${pkgs.stdenv.hostPlatform.system}.tui}/bin/frq-tui";
480 };
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago481 });
482 };
483}