Skip to content

Commit 6f8f18f

Browse files
pegeaetherclaude
andcommitted
Windows is supported: promote the job to required and say so
The experimental job went green at 177/177, so it is no longer experimental. README, CHANGELOG, ROADMAP and docs/installation.md now say Windows is CI-verified, with the platform notes that matter: .dll naming without the lib prefix, the DLL-in-use lock that the unique-copy load policy already sidesteps, and the LF requirement. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DPAgXWnvgpKcUw71GHStXC
1 parent 04ed5a0 commit 6f8f18f

4 files changed

Lines changed: 41 additions & 13 deletions

File tree

.github/workflows/ci.yml

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,8 @@ jobs:
6666
- run: make test-m4
6767

6868
sbcl-windows:
69-
name: SBCL / Windows x86-64 (experimental, may fail)
69+
name: SBCL / Windows x86-64 (required)
7070
runs-on: windows-latest
71-
continue-on-error: true
7271
defaults:
7372
run:
7473
shell: bash
@@ -83,9 +82,6 @@ jobs:
8382
curl -sO https://beta.quicklisp.org/quicklisp.lisp
8483
sbcl --non-interactive --load quicklisp.lisp \
8584
--eval '(quicklisp-quickstart:install)'
86-
# The loader was ported (LoadLibrary/GetProcAddress, pointer-sized
87-
# uintptr for LLP64, .dll naming with no lib prefix) but has never run
88-
# on Windows — this job is where that claim gets tested.
8985
- name: full gate
9086
run: make test-m4
9187

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ system. The C ABI has its own version, checked at load time: **ABI 1 since
1717
`with-client`), a hermetic loopback test server, and `audit.sh`, an
1818
executable BOUNDARY §7 check.
1919
- `make bench` — a benchmark suite for the boundary paths.
20+
- **Windows support.** The loader is abstracted over `dlopen`/`dlsym` and
21+
`LoadLibrary`/`GetProcAddress`, `uintptr` is derived from the pointer
22+
size (naming a C type is wrong on LLP64), and artifact naming knows
23+
Windows drops the `lib` prefix. CI runs the full suite there, 177/177.
2024

2125
### Changed
2226
- **Bulk `:bytes`/`:vec` marshalling**: pinned vector + `memcpy`, with the
@@ -28,6 +32,10 @@ system. The C ABI has its own version, checked at load time: **ABI 1 since
2832
rejected before anything is interned.
2933
- `#[rulisp(constructor)]` on a `&self` method dropped the receiver and
3034
surfaced as a raw `E0061`; now a compile error naming the fix.
35+
- The `Cargo.toml` scraper could not tolerate CR, so `use-crate` failed on
36+
any CRLF manifest. The tree is also pinned to LF now: a CRLF checkout
37+
broke the golden byte-identity fixture and turned Lisp format-string
38+
line continuations into `FORMAT-ERROR`.
3139

3240
## 0.2.1 — 2026-08-03
3341

ROADMAP.md

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,20 @@ providing conditions, restarts and `with-client`. Headline finding:
4848
audit-gate regex that could never fire because glibc imports are
4949
version-tagged, and a `TaskGuard` ordering that published "done" before
5050
releasing the admission permit.
51-
-**Windows groundwork**: `uintptr` is now derived from the pointer size
52-
(naming a C type was wrong on LLP64, where `unsigned long` is 32 bits);
53-
the loader is abstracted over `dlopen`/`dlsym` and
54-
`LoadLibrary`/`GetProcAddress`; artifact naming knows that Windows drops
55-
the `lib` prefix and uses `.dll`. The unique-copy load policy already
56-
sidesteps the DLL-in-use lock. **None of this has run on Windows** — an
57-
experimental (`continue-on-error`) CI job is where the claim gets tested.
58-
Finishing the port is a v0.4 goal.
51+
-**Windows works** — and earlier than planned. `uintptr` is derived
52+
from the pointer size (naming a C type was wrong on LLP64, where
53+
`unsigned long` is 32 bits); the loader is abstracted over
54+
`dlopen`/`dlsym` and `LoadLibrary`/`GetProcAddress`; artifact naming
55+
knows Windows drops the `lib` prefix and uses `.dll`; the unique-copy
56+
load policy, added for macOS dyld caching, also sidesteps the DLL-in-use
57+
lock. Three real portability bugs surfaced on the way, none of them
58+
Windows-only in principle: a Cargo.toml scraper that could not tolerate
59+
CR, the golden fixture broken by CRLF translation, and Lisp format
60+
strings whose `~` end-of-line continuation is not the tilde-newline
61+
directive once a CR sits between them (the tree is now pinned to LF).
62+
The CI job is **required**, at 177/177. (It runs three fewer assertions
63+
than Linux: `fx.target-check` guards a couple of them behind
64+
`#+(and x86-64 linux)`.)
5965
- ✅ A worked Deploy recipe (docs/distribution.md), including the two things
6066
that bite silently: platform-named artifacts and quiescing foreign
6167
threads in a dump hook.

docs/installation.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,24 @@ macOS notes:
7373
- rulisp loads libraries by absolute path, so SIP's stripping of
7474
`DYLD_LIBRARY_PATH` is irrelevant.
7575

76+
## Windows
77+
78+
> Status: CI-verified on Windows x86-64 with SBCL (full suite green).
79+
80+
Install [SBCL](http://www.sbcl.org/platform-table.html) (or
81+
`choco install sbcl`), a Rust toolchain from <https://rustup.rs>, and
82+
Quicklisp as above. Notes:
83+
84+
- Artifacts are `<name>.dll` — cargo drops the `lib` prefix on Windows —
85+
and `load-blob-crate` looks for `<name>-windows-x86_64.dll`.
86+
- A loaded DLL is locked, so an artifact cannot be overwritten in place.
87+
rulisp already loads a uniquely named copy per generation, so
88+
`use-crate`/`reload-crate` work anyway; stale copies in the cache are
89+
swept on a later run.
90+
- Check the repository out with LF endings (the shipped `.gitattributes`
91+
does this): the manifest fixtures are byte-compared, and a CR inside a
92+
Lisp format string breaks its line continuations.
93+
7694
## Getting rulisp
7795

7896
Until the Quicklisp/Ultralisp registration lands, clone into Quicklisp's

0 commit comments

Comments
 (0)