nandi/frqpublic Fork 0
5ac0521f0d5672348e423d2b6c58f6f16a4137ae
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.

justfile · 203 lines · 7.7 KBMakefile Blame HistoryRaw
Six verbs, and the last of the nix 2e24e64 nandi yesterday1# Six verbs over one tree.
Inline the babashka scripts into the justfile 76dcc6c nandi 12d ago2#
Six verbs, and the last of the nix 2e24e64 nandi yesterday3# There is no nix here any more. `tools/toolchain.sh` fetches Flutter (which
4# carries Dart), a JDK, the Clojure CLI and Nim as sha256-pinned tarballs into
5# `.toolchain/`, and every recipe below runs inside the environment that
6# script prints. One mechanism, and the same one the containers in `.modal/`
7# use — which is what lets a plain Debian image build this.
8#
9# What the host still brings: a C compiler (Nim shells out to one), OpenSSL
10# (nim.cfg is `-d:ssl`), git, curl, unzip, python3. For `run desktop` and the
11# other Linux builds, GTK and the usual CMake/Ninja/pkg-config.
12#
13# just build TARGET apk desktop web lib ui app
14# just run TARGET apk desktop web ui app
15# just test SUITE all nim dart common live
The last of the Clojure 284b59c nandi 22h ago16# just modal CONTAINER dev
Six verbs, and the last of the nix 2e24e64 nandi yesterday17# just serve [PORT] the Modal-built web bundle, on localhost
18# just tools ... the toolchain itself
Take glimmer-vidya from gitlab, so a stranger can build this 5c40e75 nandi 20d ago19
Write the build in babashka, and pin the babashka 34832a8 nandi 19d ago20set shell := ["bash", "-euo", "pipefail", "-c"]
A freeq client in jolt, as glimmer components on Vidya 4719d6f nandi 21d ago21
Six verbs, and the last of the nix 2e24e64 nandi yesterday22# Every recipe is a `#!` script. Without this, "$@" is empty in one of them —
23# just interpolates into a shebang recipe rather than handing it argv.
Give the terminal's classpath an nREPL, and hand recipes their arguments 664397d nandi 11d ago24set positional-arguments
25
Six verbs, and the last of the nix 2e24e64 nandi yesterday26root := justfile_directory()
27tc := justfile_directory() / "tools/toolchain.sh"
Inline the babashka scripts into the justfile 76dcc6c nandi 12d ago28
A freeq client in jolt, as glimmer components on Vidya 4719d6f nandi 21d ago29default:
30 @just --list
31
The last of the Clojure 284b59c nandi 22h ago32# The toolchain, directly: `just tools versions`,
Six verbs, and the last of the nix 2e24e64 nandi yesterday33# `just tools exec -- flutter doctor`.
The last of the Clojure 284b59c nandi 22h ago34[doc('the toolchain itself: versions, exec -- CMD')]
Six verbs, and the last of the nix 2e24e64 nandi yesterday35tools *args:
36 #!/usr/bin/env bash
37 cd "{{root}}"
38 exec "{{tc}}" "$@"
39
40# Build a target.
41#
The last of the Clojure 284b59c nandi 22h ago42# desktop the app: Nim owns the state and the screens, Flutter paints
43# lib the Nim core alone, as build/nim/libfrqcore.so
44#
45# There were four more. `apk` and `web` compiled ClojureDart and went with it:
46# the web target cannot come back without a wasm build of the core, since a
47# browser has no dart:ffi, and the APK wants libfrqcore.so cross-compiled for
48# Android's ABIs. `ui` and `app` were the two halves of the migration, and
49# there is one app now.
50[doc('build a target: desktop lib')]
Six verbs, and the last of the nix 2e24e64 nandi yesterday51build target="desktop":
Build the APK, out of ClojureDart and Flutter e2b0e6b nandi 8d ago52 #!/usr/bin/env bash
53 set -euo pipefail
Six verbs, and the last of the nix 2e24e64 nandi yesterday54 cd "{{root}}"
55 case "{{target}}" in
56 desktop) just _flutter desktop build ;;
57 lib) just _nim-lib ;;
The core, compiled to JavaScript 5ac0521 nandi 7h ago58 core-js) just _nim-js ;;
59 *) echo "usage: just build [desktop|lib|core-js]" >&2; exit 1 ;;
Build the APK, out of ClojureDart and Flutter e2b0e6b nandi 8d ago60 esac
61
Six verbs, and the last of the nix 2e24e64 nandi yesterday62# Build a target and start it.
Paint the desktop with Flutter too, beside libcosmic fc5f63c nandi 8d ago63#
The last of the Clojure 284b59c nandi 22h ago64# FRQ_TRACE=1 every line in and out, both languages in one log
65# FRQ_AUTOCONNECT=1 press Connect at startup, for a window a script cannot
66# click; FRQ_NICK overrides the nickname
67[doc('build the app and start it')]
68run target="desktop":
Paint the desktop with Flutter too, beside libcosmic fc5f63c nandi 8d ago69 #!/usr/bin/env bash
70 set -euo pipefail
Six verbs, and the last of the nix 2e24e64 nandi yesterday71 cd "{{root}}"
72 case "{{target}}" in
73 desktop) just _flutter desktop run ;;
The last of the Clojure 284b59c nandi 22h ago74 *) echo "usage: just run [desktop]" >&2; exit 1 ;;
Paint the desktop with Flutter too, beside libcosmic fc5f63c nandi 8d ago75 esac
A shell that is already the devShell, and two recipes to reach it e853593 nandi 6d ago76
Six verbs, and the last of the nix 2e24e64 nandi yesterday77# Test a suite.
78#
79# nim the Nim core. No Flutter, no Dart, no SDK — a rule about the IRC
80# wire format is checkable in a second.
81# dart the Dart side of the FFI boundary, on the plain Dart VM. Passing
82# `nim` and failing this one is a marshalling bug, which is why the
83# two are separate suites.
The core, compiled to JavaScript 5ac0521 nandi 7h ago84# web the JavaScript build of the same core, driven as a browser
85# drives it. Needs node and nothing else.
Six verbs, and the last of the nix 2e24e64 nandi yesterday86# live the whole stack against a real freeq. Not in `all`: it wants a
87# network and a running server.
88#
89# just test all of them
90# just test nim tircparse one Nim file
The core, compiled to JavaScript 5ac0521 nandi 7h ago91[doc('run a suite: all nim dart layout web live')]
Six verbs, and the last of the nix 2e24e64 nandi yesterday92test suite="all" *args:
A third target, and the seam that was already waiting for it f54ca45 nandi 3d ago93 #!/usr/bin/env bash
94 set -euo pipefail
Six verbs, and the last of the nix 2e24e64 nandi yesterday95 cd "{{root}}"
96 shift
97 case "{{suite}}" in
The core, compiled to JavaScript 5ac0521 nandi 7h ago98 all) just test nim && just test dart && just test layout \
99 && just test web ;;
Lay every screen out in a test, and fix what that found 36bdfc5 nandi yesterday100 layout) just _nim-lib
101 just _flutter layout test ;;
Six verbs, and the last of the nix 2e24e64 nandi yesterday102 nim) just _nim-test "$@" ;;
The core, compiled to JavaScript 5ac0521 nandi 7h ago103 web) just _nim-js
104 exec node nim/web/test/smoke.js build/web/frq_core.js ;;
Six verbs, and the last of the nix 2e24e64 nandi yesterday105 dart) just _nim-lib
106 exec "{{tc}}" exec -- bash -c \
107 'cd dart/frq_core && dart pub get && dart test -r expanded' ;;
108 live) just _nim-lib
109 exec "{{tc}}" exec -- bash -c \
110 'cd dart/frq_core && dart pub get >/dev/null && dart run tool/live_ui.dart "$@"' _ "$@" ;;
The core, compiled to JavaScript 5ac0521 nandi 7h ago111 *) echo "usage: just test [all|nim|dart|layout|web|live]" >&2; exit 1 ;;
Six verbs, and the last of the nix 2e24e64 nandi yesterday112 esac
A third target, and the seam that was already waiting for it f54ca45 nandi 3d ago113
Six verbs, and the last of the nix 2e24e64 nandi yesterday114# The containers in `.modal/`, run on Modal rather than here: this machine
115# evaluates and Modal builds. See CLAUDE.md, which says so rather more firmly.
A shell that is already the devShell, and two recipes to reach it e853593 nandi 6d ago116#
Six verbs, and the last of the nix 2e24e64 nandi yesterday117# `--shell` leaves a sandbox running with the container's own image, volumes
118# and environment, and prints the command to attach to it. It blocks — an
119# ephemeral app takes its sandbox down when the entrypoint returns — so attach
120# from a second terminal and Ctrl-C here when done. The sandbox bills until
121# you do.
A shell that is already the devShell, and two recipes to reach it e853593 nandi 6d ago122#
Six verbs, and the last of the nix 2e24e64 nandi yesterday123# just modal dev
The last of the Clojure 284b59c nandi 22h ago124# just modal dev --shell
Six verbs, and the last of the nix 2e24e64 nandi yesterday125[doc('run a .modal/ container on Modal')]
126modal container="dev" *args:
A shell that is already the devShell, and two recipes to reach it e853593 nandi 6d ago127 #!/usr/bin/env bash
128 set -euo pipefail
Six verbs, and the last of the nix 2e24e64 nandi yesterday129 cd "{{root}}"
130 shift || true
A shell that is already the devShell, and two recipes to reach it e853593 nandi 6d ago131 exec modal run ".modal/{{container}}/container.py" "$@"
132
The core, compiled to JavaScript 5ac0521 nandi 7h ago133# The same core, compiled to JavaScript.
134#
135# `--path:src --path:web`, in that order, because the later path wins: every
136# module under `nim/web/frq` shadows the one beside it in `nim/src/frq`, so
137# `frq/conn` is a queue the host fills rather than two socket threads, and the
138# shared code above them never learns which host it is on.
139[private]
140_nim-js:
141 #!/usr/bin/env bash
142 set -euo pipefail
143 cd "{{root}}"
144 out="{{root}}/build/web"
145 mkdir -p "$out"
146 exec "{{tc}}" exec -- bash -euo pipefail -c '
147 cd nim
148 nim js -d:release --hints:off \
149 --path:src --path:web --out:"'"$out"'/frq_core.js" web/frq_web.nim
150 printf "built %s (%s)\n" "'"$out"'/frq_core.js" \
151 "$(gzip -9c "'"$out"'/frq_core.js" | wc -c | awk "{printf \"%d KB gzipped\", \$1/1024}")"'
152
Six verbs, and the last of the nix 2e24e64 nandi yesterday153[private]
154_nim-lib:
One frontend where there were three, and a core that is not Clojure 438b247 nandi yesterday155 #!/usr/bin/env bash
156 set -euo pipefail
Six verbs, and the last of the nix 2e24e64 nandi yesterday157 cd "{{root}}"
158 out="{{root}}/build/nim"
One frontend where there were three, and a core that is not Clojure 438b247 nandi yesterday159 mkdir -p "$out"
Six verbs, and the last of the nix 2e24e64 nandi yesterday160 exec "{{tc}}" exec -- bash -euo pipefail -c '
161 cd nim
162 nim c --app:lib --mm:orc -d:release --hints:off \
163 --path:src --out:"'"$out"'/libfrqcore.so" src/frq_core.nim
164 echo "built '"$out"'/libfrqcore.so"
165 nm -D --defined-only "'"$out"'/libfrqcore.so" | grep " T frq_" || true'
166
167[private]
168_nim-test *args:
The binding is Dart, and it works f7aea3b nandi yesterday169 #!/usr/bin/env bash
170 set -euo pipefail
Six verbs, and the last of the nix 2e24e64 nandi yesterday171 cd "{{root}}"
172 exec "{{tc}}" exec -- bash -euo pipefail -c '
173 cd nim
174 if [ -n "${1:-}" ]; then
175 exec nim c -r --hints:off --path:src "tests/$1.nim"
176 fi
177 for t in tests/t*.nim; do
178 echo "== $t"
179 nim c -r --hints:off --path:src "$t"
180 done' _ "$@"
181
182[private]
183_flutter target action:
Nim under the existing UI, not instead of it 56551a8 nandi yesterday184 #!/usr/bin/env bash
185 set -euo pipefail
Six verbs, and the last of the nix 2e24e64 nandi yesterday186 cd "{{root}}"
The last of the Clojure 284b59c nandi 22h ago187 just _nim-lib
Six verbs, and the last of the nix 2e24e64 nandi yesterday188 exec "{{tc}}" exec -- bash -euo pipefail -c '
189 cd flutter
190 # Nim resolves OpenSSL through dynlib at run time; without the host
191 # library on the loader path `newContext` dies in a SIGSEGV that says
192 # nothing about SSL.
193 export LD_LIBRARY_PATH="${FRQ_OPENSSL_LIB:-}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
The last of the Clojure 284b59c nandi 22h ago194 flutter pub get
Six verbs, and the last of the nix 2e24e64 nandi yesterday195 case "$1:$2" in
The last of the Clojure 284b59c nandi 22h ago196 desktop:build) exec flutter build linux --debug ;;
197 desktop:run) exec flutter run -d linux ;;
Lay every screen out in a test, and fix what that found 36bdfc5 nandi yesterday198 # Widget tests, which lay every screen out for real. Headless: no
The last of the Clojure 284b59c nandi 22h ago199 # GL and no window, which is what makes them the check a Wayland
Lay every screen out in a test, and fix what that found 36bdfc5 nandi yesterday200 # window cannot be.
The last of the Clojure 284b59c nandi 22h ago201 layout:test) exec flutter test test/nim_layout_test.dart ;;
202 *) echo "unknown target/action: $1 $2" >&2; exit 1 ;;
Six verbs, and the last of the nix 2e24e64 nandi yesterday203 esac' _ "{{target}}" "{{action}}"