nandi/frqpublic Fork 0
0b81161729da328ff48b7be822fd075b30fa8ba6
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 · 461 lines · 21.2 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";
24 # Jolt's own flake declares `self.submodules`, which this Nix rejects when
25 # the flake is fetched through the github scheme — so take the source and
26 # build it here. `vendor/` is a submodule and the build needs it.
27 jolt-src = {
28 url = "git+https://github.com/jolt-lang/jolt?submodules=1";
29 flake = false;
30 };
31
Build the desktop libraries rather than fetching a release of them 0b81161 nandi 15d ago32 # Ahead of v0.1.3, which is what nix/android.nix pins the APK to — and
33 # deliberately: that pin is the last release, and this is what `just run`
34 # builds, so a change to jolt-native can be run before there is a release
35 # to fetch. The two meet again at `just bump`.
Take the jolt-native ahead of the release, since a run can build it 36f6c77 nandi 17d ago36 #
37 # 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 ago38 # glimmer-vidya — libvidya, and the Jolt side that binds it — so an
39 # unpinned `main` is a build whose native half is free to sit at a
40 # different commit from the tree that talks to it. It did, and what the
41 # drift cost was silence: the Jolt half sent a reaction pill's hover card
42 # 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 ago43 # It also carries the terminal backend — crates/jolt-tui, the same tree ABI
44 # over a grid of cells, and jolt/glimmer-tui beside glimmer-vidya. That was
45 # a second input at a second rev while it lived on a branch, which is the
46 # drift this comment warns about wearing a different hat: one input, and
47 # 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 ago48 jolt-native = {
Take the terminal layout that measures a node once 590779a nandi 15d ago49 url = "git+https://gitlab.com/nandithebull/jolt-native?rev=c41903b106d04e5cf80828c49e2d7d456a54739d";
Paint the same screens into a terminal ab83b42 nandi 17d ago50 flake = false;
51 };
52
Build the APK from the flake, and from nothing 6aa2a6b nandi 18d ago53 # Chez itself, because the APK needs a cross target nixpkgs does not
54 # build: frq's Scheme is compiled to an arm64 boot image, and that wants
55 # Chez's own `tarm64le` workarea — boot files, xpatch and libkernel.a.
56 # The version is the one the hand-built tree under ~/.cache used, and the
57 # submodules are not optional (zuo builds it, lz4 and zlib link into it).
58 # The fork jolt's own Android pin names, built here rather than fetched as
59 # a release binary: upstream reads the socket address out of `struct
60 # addrinfo` at glibc's offset, which on Bionic is `ai_canonname`, so an APK
61 # built with upstream cannot open a TLS connection at all. Only the boot
62 # image uses it; the desktop package still builds jolt-src.
63 jolt-android-src = {
64 url = "git+https://gitlab.com/nandithebull/jolt?rev=2b80d68d1f7a31ba92b208b3957e5fb555617ada&submodules=1";
65 flake = false;
66 };
67
68 chez-src = {
69 url = "git+https://github.com/cisco/ChezScheme?ref=refs/tags/v10.4.1&submodules=1";
70 flake = false;
71 };
72
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago73 # The sha deps.edn pins, on the fork with the reconciler fixes.
74 glimmer = {
75 url = "git+https://gitlab.com/nandithebull/glimmer?rev=399df371c790d690fb6e4560c3d4d7f838502857";
76 flake = false;
77 };
Find the host's GL driver when the store's is not the system's 633faad nandi 19d ago78
79 # Only ever used off NixOS, to put the host GL driver on the loader path.
80 nixgl = {
81 url = "github:nix-community/nixGL";
82 inputs.nixpkgs.follows = "nixpkgs";
83 };
Bundle the closure into one file the AppImage runtime mounts f82b93f nandi 18d ago84
85 # Wraps a closure into a single self-extracting file. Only the `appimage`
86 # output evaluates it.
87 nix-appimage = {
88 url = "github:ralismark/nix-appimage";
89 inputs.nixpkgs.follows = "nixpkgs";
90 };
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago91 };
92
Bundle the closure into one file the AppImage runtime mounts f82b93f nandi 18d ago93 outputs = { self, nixpkgs, jolt-src, jolt-native, glimmer, chez-src, jolt-android-src, nixgl, nix-appimage }:
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago94 let
95 systems = [ "x86_64-linux" "aarch64-linux" ];
96 forEachSystem = f:
97 nixpkgs.lib.genAttrs systems (system: f nixpkgs.legacyPackages.${system});
Run this tree on a native half the builders made a32699e nandi 17d ago98
99 # Mesa, despite the name: it covers Intel and AMD alike. The NVIDIA
100 # wrappers are the ones that need --impure (they read the host kernel
101 # 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 ago102 #
103 # Built from nixGL's default.nix rather than taken from its flake
104 # outputs, for the one argument the flake hardcodes on: `enable32bits`,
105 # which on x86_64 puts a second, i686 copy of mesa, its LLVM, and
106 # intel-media-driver into the wrapper. frq is 64-bit on both halves —
107 # the Rust cdylibs and the Chez runtime — so nothing here ever opens the
108 # 32-bit driver, and carrying it is most of the dev shell's closure.
109 nixGLFor = pkgs: (import nixgl {
110 inherit pkgs;
111 enable32bits = false;
112 }).nixGLIntel;
Run this tree on a native half the builders made a32699e nandi 17d ago113
114 # egui reaches for these with dlopen rather than linking them, so being
115 # 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 ago116 # 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 ago117 # "X11 unavailable", falls back to Wayland, and winit refuses to build a
118 # second event loop after the failed first one.
119 #
120 # Out here rather than beside the package that first needed them: the
121 # dev shell starts frq too, on this tree's source rather than the store's
122 # copy of it, and a second copy of this list is a second chance for the
123 # two ways of running to disagree about what the window needs.
124 runtimeLibsFor = pkgs: with pkgs; [
125 libGL
126 libxkbcommon
127 wayland
Follow the xorg renames, and stop wrapping nix in distrobox a400a00 nandi 16d ago128 libx11
129 libxcursor
130 libxi
131 libxrandr
Run this tree on a native half the builders made a32699e nandi 17d ago132 vulkan-loader
133 ];
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago134 in
135 {
136 packages = forEachSystem (pkgs:
137 let
138 inherit (pkgs) lib;
139
Run this tree on a native half the builders made a32699e nandi 17d ago140 nixGL = nixGLFor pkgs;
Find the host's GL driver when the store's is not the system's 633faad nandi 19d ago141
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago142 # libvidya (the retained-tree ABI glimmer-vidya binds, on egui) and
143 # libjoltmoq (the AV media plane). One workspace, two cdylibs.
144 native = pkgs.rustPlatform.buildRustPackage {
145 pname = "jolt-native";
146 version = "0.1.0";
147 src = jolt-native;
148
Hash the media plane's git deps rather than cloning them per eval 7095bb6 nandi 16d ago149 # The media plane's deps are seven git repos rather than crates.io
150 # releases. `allowBuiltinFetchGit` would fetch them with
151 # builtins.fetchGit, which happens at *eval* time — so every
152 # evaluation clones them in full (all refs), even when the built
153 # library is already in a cache, and the clones themselves are not
154 # derivations and can never be substituted. Hashed, they are plain
155 # fixed-output derivations: one entry per repo (nixpkgs keys these
156 # by commit, so the sibling crates out of the same workspace are
157 # covered), substitutable, fetched once. The cost is that these
158 # move whenever jolt-native's Cargo.lock does.
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago159 cargoLock = {
160 lockFile = "${jolt-native}/Cargo.lock";
Hash the media plane's git deps rather than cloning them per eval 7095bb6 nandi 16d ago161 outputHashes = {
162 # github.com/Frando/moq @ 53fe78d8 — moq-lite, moq-native, hang, conducer
163 "moq-lite-0.15.5" = "sha256-wh8telcXK4Zqaefs42n6LJitye8cc0rAmXd8RtJZJ+Q=";
164 # github.com/n0-computer/iroh-live @ edd9bcc5 — iroh-moq, moq-media, rusty-{capture,codecs}
165 "iroh-live-0.1.0" = "sha256-+bOIMXU4F/9toLZ25MFRA0Kd3Cr4iyP4icOfBkObtfU=";
166 # github.com/n0-computer/iroh @ 8af8370b — iroh, iroh-base, iroh-relay
167 "iroh-0.97.0" = "sha256-tCEzLwu+bcAiH0dMmQoKRB24N5eiNG6BNixod8Y6igo=";
168 # github.com/Frando/web-transport @ f7a523f1 — the four web-transport-* crates
169 "web-transport-proto-0.6.0" = "sha256-5WP98+nTI6FR23AM7DNf0nnsolqr7M0RHxY09NNdDzs=";
170 # github.com/n0-computer/noq @ ab042ea7 — noq, noq-proto, noq-udp
171 "noq-0.17.0" = "sha256-aur6ekfwr3PsnR8RrBKLgCvujQRi4tccyK9nJo6O+Tg=";
172 "iroh-gossip-0.97.0" = "sha256-DEIq1BCsCZL+1q9yiEZAXzv7wxvIXgsW044Y8uHW7PU=";
173 "iroh-smol-kv-0.3.1" = "sha256-oXGdnJVyQfiomzyZhj5r7ez4Uxh73imGt6V9+vHTQZQ=";
174 };
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago175 };
176
177 nativeBuildInputs = with pkgs; [
178 pkg-config
179 cmake
180 rustPlatform.bindgenHook
181 ];
182
183 buildInputs = with pkgs; [
184 alsa-lib
185 pipewire
186 openssl
187 libxkbcommon
188 wayland
189 libGL
190 ];
191
192 # Upstream's .cargo/config.toml drives the whole build through
193 # DotSlash: a pinned rustc, sccache, and zig as the C/C++ compiler
194 # and linker, each fetched from the network on first use. None of
195 # that survives a build sandbox, and none of it is needed when the
196 # toolchain comes from the store — so drop it and let stdenv's cc
197 # link (openh264 is C++, which stdenv covers too).
198 postPatch = ''
199 rm -f .cargo/config.toml
200 '';
201
202 # bindgen reads linux/videodev2.h directly; upstream points it at
203 # zig's bundled headers, which under Nix is just the kernel headers.
204 V4L2R_VIDEODEV2_H_PATH = "${pkgs.linuxHeaders}/include";
205
206 doCheck = false;
207
208 installPhase = ''
209 runHook preInstall
210 mkdir -p "$out/lib"
211 install -m644 target/*/release/*.so "$out/lib/"
212 runHook postInstall
213 '';
214 };
215
216 # 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 ago217 # A function, because there are two of them — upstream for the
218 # desktop, and the Bionic-addrinfo fork for the boot image the APK
219 # carries. Nothing else about the build differs.
220 joltFrom = src: pkgs.stdenv.mkDerivation {
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago221 pname = "jolt";
222 version = "dev";
Build the APK from the flake, and from nothing 6aa2a6b nandi 18d ago223 inherit src;
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago224
225 strictDeps = true;
226 nativeBuildInputs = with pkgs; [ chez makeWrapper pkg-config xxd ];
227 buildInputs = with pkgs; [ lz4 zlib ncurses openssl libuuid ];
228
229 JOLT_VERSION = "dev";
230 dontConfigure = true;
231
232 buildPhase = ''
233 runHook preBuild
234 scheme --script host/chez/build-jolt.ss release target/release/jolt
235 runHook postBuild
236 '';
237
238 installPhase = ''
239 runHook preInstall
240 mkdir -p "$out/bin"
241 install -m755 target/release/jolt "$out/bin/jolt"
242 runHook postInstall
243 '';
244
245 # 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 ago246 # OpenSSL through the JOLT_OPENSSL_LIBDIR seam. gitMinimal rather
247 # than git: all jolt.deps asks for is clone/fetch/rev-parse, and
248 # the full package carries Perl and Python for the subcommands
249 # 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 ago250 #
251 # TZDIR so a zone *name* resolves wherever this runs: frq.clock
252 # hands one to tzset, and glibc then looks for the tzfile under
253 # /usr/share/zoneinfo unless told otherwise — which a NixOS host
254 # does not have. The store's own tzdata is there on both kinds of
255 # 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 ago256 postFixup = ''
257 wrapProgram "$out/bin/jolt" \
Stop carrying the 32-bit GL stack and half of git 040f2c1 nandi 16d ago258 --prefix PATH : "${pkgs.lib.makeBinPath [ pkgs.gitMinimal pkgs.unzip ]}" \
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago259 --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 ago260 --set-default TZDIR "${pkgs.tzdata}/share/zoneinfo" \
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago261 --set-default SSL_CERT_FILE "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt"
262 '';
263 };
264
Build the APK from the flake, and from nothing 6aa2a6b nandi 18d ago265 joltRuntime = joltFrom jolt-src;
266 joltAndroid = joltFrom jolt-android-src;
267
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago268 # glimmer-vidya lives inside the jolt-native checkout, and its own
269 # deps.edn asks for glimmer by git — the top-level override below
270 # answers for both.
271 glimmerVidya = "${jolt-native}/jolt/glimmer-vidya";
Merge origin/main, and let one jolt-native answer for both backends 1e8b590 nandi 16d ago272 glimmerTui = "${jolt-native}/jolt/glimmer-tui";
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago273
Run this tree on a native half the builders made a32699e nandi 17d ago274 runtimeLibs = runtimeLibsFor pkgs;
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago275
276 # The project as jolt sees it: source, deps.edn, nothing else.
277 frqSource = pkgs.runCommand "frq-source" { } ''
278 mkdir -p "$out"
279 cp -r ${self}/src ${self}/deps.edn "$out/"
280 '';
281
282 # Jolt resolves deps.edn from the working directory, so the launcher
283 # runs from the store copy. Its .jolt/cpcache write lands on a
284 # read-only directory and jolt treats that as a quiet cache miss, so
285 # the only cost is re-resolving the (already local) graph per start.
286 frqScript = pkgs.writeShellScript "frq" ''
287 export LD_LIBRARY_PATH="${native}/lib:${lib.makeLibraryPath runtimeLibs}''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
288 cd ${frqSource}
Find the host's GL driver when the store's is not the system's 633faad nandi 19d ago289
290 # On NixOS the store's Mesa is the system's and the window opens.
291 # Anywhere else the real driver is the host's, so defer to nixGL
292 # it prepends the host driver, which has to win over ours.
293 runner=""
294 [ -e /run/current-system ] || runner="${nixGL}/bin/nixGLIntel"
295
296 exec ''${runner} ${joltRuntime}/bin/jolt \
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago297 -Sdeps '{:deps {jolt-lang/glimmer {:local/root "${glimmer}"} nandi/glimmer-vidya {:local/root "${glimmerVidya}"}}}' \
298 -M:frq "$@"
299 '';
300
Paint the same screens into a terminal ab83b42 nandi 17d ago301 # The same source, the other backend. No GL, no nixGL and no X11 —
302 # a terminal is the one surface that needs nothing from the host but
303 # a terminal, which is the reason this output exists.
304 tuiScript = pkgs.writeShellScript "frq-tui" ''
Merge origin/main, and let one jolt-native answer for both backends 1e8b590 nandi 16d ago305 export LD_LIBRARY_PATH="${native}/lib''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
Paint the same screens into a terminal ab83b42 nandi 17d ago306 cd ${frqSource}
307
308 exec ${joltRuntime}/bin/jolt \
309 -Sdeps '{:deps {jolt-lang/glimmer {:local/root "${glimmer}"} nandi/glimmer-vidya {:local/root "${glimmerVidya}"} nandi/glimmer-tui {:local/root "${glimmerTui}"}}}' \
310 -m frq.tui "$@"
311 '';
312
313 tui = pkgs.runCommand "frq-tui-0.1.0"
314 {
315 meta = {
316 description = "frq's screens in a terminal";
317 mainProgram = "frq-tui";
318 platforms = systems;
319 };
320 }
321 ''
322 mkdir -p "$out/bin"
323 ln -s ${tuiScript} "$out/bin/frq-tui"
324 '';
325
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago326 frq = pkgs.runCommand "frq-0.1.0"
327 {
328 meta = {
329 description = "A freeq client in jolt";
330 mainProgram = "frq";
331 platforms = systems;
332 };
333 }
334 ''
335 mkdir -p "$out/bin"
336 ln -s ${frqScript} "$out/bin/frq"
337 '';
Build the APK from the flake, and from nothing 6aa2a6b nandi 18d ago338 # --- Android ------------------------------------------------------
339 # The SDK and the NDK are Google's, which means unfree and a licence
340 # to accept — so this is its own import of nixpkgs rather than the
341 # `legacyPackages` everything above uses. Confined to the Android
342 # outputs: `nix build` of frq itself never evaluates it.
343 #
Build the APK as derivations only, and retire the buck2 graph 3bc3aaa nandi 16d ago344 # The NDK here is r29, which is the one the pinned libvidya was
345 # built with.
Build the APK from the flake, and from nothing 6aa2a6b nandi 18d ago346 androidPkgs = import nixpkgs {
347 inherit (pkgs.stdenv.hostPlatform) system;
348 config = {
349 allowUnfree = true;
350 android_sdk.accept_license = true;
351 };
352 };
353
354 androidComposition = androidPkgs.androidenv.composeAndroidPackages {
355 buildToolsVersions = [ "36.0.0" ];
356 platformVersions = [ "36" ];
357 includeNDK = true;
358 };
359
360 android = import ./nix/android.nix {
361 inherit pkgs self chez-src jolt-native glimmer joltAndroid;
362 inherit (pkgs) lib;
363 androidSdk = androidComposition.androidsdk;
364 ndk = androidComposition.ndk-bundle;
365 };
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago366 in
367 {
368 inherit native frq;
Merge origin/main, and let one jolt-native answer for both backends 1e8b590 nandi 16d ago369 inherit tui;
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago370 jolt = joltRuntime;
371 default = frq;
Bundle the closure into one file the AppImage runtime mounts f82b93f nandi 18d ago372
Take bb from the flake, so a checkout needs nix and nothing else 270bee0 nandi 16d ago373 # The interpreter scripts/ is written in, named here so that
374 # scripts/bb can build it. Nothing else in this flake uses it: it is
375 # an output because a shell script cannot ask for `nixpkgs#babashka`
376 # at the version this tree pins, and `.#bb` is exactly that.
377 bb = pkgs.babashka;
378
Bundle the closure into one file the AppImage runtime mounts f82b93f nandi 18d ago379 # frq and everything it loads, squashed into one runnable file for
380 # hosts without Nix. The whole closure rides along — Mesa included,
381 # which is not waste: off NixOS the launcher goes through nixGL, and
382 # nixGL needs a store Mesa to put the host's driver in front of.
383 appimage =
384 nix-appimage.bundlers.${pkgs.stdenv.hostPlatform.system}.default frq;
Build the APK from the flake, and from nothing 6aa2a6b nandi 18d ago385 }
386 # An APK is built by a linux-x86_64 NDK and a linux-x86_64 jolt, and
387 # Google ships no other; on aarch64 the Android outputs are simply
388 # absent rather than present and broken.
389 // lib.optionalAttrs (pkgs.stdenv.hostPlatform.system == "x86_64-linux") {
390 inherit (android) apk chezAndroid joltBoot libjoltapp;
391 apk-unsigned = android.apk-unsigned;
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago392 });
393
Run this tree on a native half the builders made a32699e nandi 17d ago394 # Where `just run` runs, and — because entering it realises what it
395 # names — what builds the half of frq that is not this working tree.
396 #
397 # The two halves, and the split is the whole point of the shell. The frq
398 # source is the files on disk, uncommitted edits and all. Everything
399 # under it — jolt, glimmer, glimmer-vidya, both native objects — is the
400 # flake's, at the revs flake.lock names, so a run says what it ran
401 # against and both halves of glimmer-vidya move together. That is the
402 # drift the `jolt-native` input's comment is about, and a pin frq can
403 # answer for is worth more here than the convenience of a checkout.
404 #
405 # `native` is the cargo build of that input rather than jolt-native's own
406 # buck2 graph, which is a compromise and not a free one: buck2 is what
407 # its CI runs and what makes its releases, and its cpal has the pipewire
408 # feature this one does not, so device *names* in a call come out as ALSA
409 # PCMs. What it buys is a derivation — one thing nixbuild.net can be
410 # handed. The buck2 build fetches its rustc, zig and every third-party
411 # crate as it goes and writes buck-out into the tree it builds; a sandbox
412 # with no network and a read-only store is the one place it cannot run,
413 # so on a remote builder it is not a slower option but no option at all.
414 #
415 # Nothing here says "nixbuild", though: it is a plain derivation, and
416 # where it gets built is the machine's business. scripts/run.bb asks for
417 # the shell with --max-jobs 0, which is what sends it to the `builders`
418 # entry rather than compiling egui on a laptop.
419 devShells = forEachSystem (pkgs:
420 let
421 inherit (pkgs) lib;
422 inherit (self.packages.${pkgs.stdenv.hostPlatform.system}) jolt native;
423 in
424 {
425 default = pkgs.mkShellNoCC {
426 name = "frq";
427
428 # jolt, because the runtime frq is run by should be the flake's
429 # too. nixGL for the same reason the launcher reaches for it — see
Take bb from the flake, so a checkout needs nix and nothing else 270bee0 nandi 16d ago430 # frqScript. babashka because scripts/bb prefers one on PATH, and
431 # inside here that should be this one rather than a second copy
Take just from the dev shell, so the host needs no copy of it 9afdfa4 nandi 16d ago432 # built through `.#bb`. just so the recipe runner comes from here
433 # too rather than the host — `nix develop` and then `just run` is
434 # the whole of what a machine with nix needs.
435 packages = [ jolt pkgs.babashka pkgs.just (nixGLFor pkgs) ];
Run this tree on a native half the builders made a32699e nandi 17d ago436
437 # Read by scripts/run.bb rather than baked into a wrapper: the frq
438 # source `just run` runs is the working tree, so the launcher has
439 # to be a script in that tree and the shell has to hand it its
440 # answers. Naming these is also what makes the shell build them.
441 JOLT_NATIVE_LIB = "${native}/lib";
442 GLIMMER_SRC = glimmer;
443 GLIMMER_VIDYA_SRC = "${jolt-native}/jolt/glimmer-vidya";
Merge origin/main, and let one jolt-native answer for both backends 1e8b590 nandi 16d ago444 GLIMMER_TUI_SRC = "${jolt-native}/jolt/glimmer-tui";
Run this tree on a native half the builders made a32699e nandi 17d ago445 FRQ_LIB_PATH = lib.makeLibraryPath (runtimeLibsFor pkgs);
446 NIXGL = "${nixGLFor pkgs}/bin/nixGLIntel";
447 };
448 });
449
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago450 apps = forEachSystem (pkgs: {
451 default = {
452 type = "app";
453 program = "${self.packages.${pkgs.stdenv.hostPlatform.system}.frq}/bin/frq";
454 };
Paint the same screens into a terminal ab83b42 nandi 17d ago455 tui = {
456 type = "app";
457 program = "${self.packages.${pkgs.stdenv.hostPlatform.system}.tui}/bin/frq-tui";
458 };
Build the client with Nix, not just a shell for it ca3afbe nandi 19d ago459 });
460 };
461}