m9 0.3.1
The M9 compiler m9c, the runtime libm9rt.a, the standard library as M9 source, the module reference, the compiler's man page and the VS Code extension files. gcc is the only toolchain any of them needs.
One package per distribution, x86-64, each built ON that distribution (the Ubuntu 26.04 one on a real 26.04 machine rather than a VM) from the one source tarball attached here (m9-0.3.1.tar.gz, sha256 2d361163bbcbfffa19c9a1b86ea4db55c98245cf84604ecbd52f7c594ad7c3d6), then installed there and made to compile and run an M9 program with an empty environment before it was allowed to leave the build machine.
That tarball is the same set of files as this repository -- the compiler, runtime, standard library, gates, man page and module reference -- and the release tooling refuses to cut one that is not, checked both against the list and against an independent deny-list of paths that must never be published.
| distribution | package | install |
|---|---|---|
| Ubuntu 24.04 LTS | m9_0.3.1-1_amd64.ubuntu24.04.deb |
sudo apt install ./m9_0.3.1-1_amd64.ubuntu24.04.deb |
| Ubuntu 26.04 LTS | m9_0.3.1-1_amd64.ubuntu26.04.deb |
sudo apt install ./m9_0.3.1-1_amd64.ubuntu26.04.deb |
| Debian 13 | m9_0.3.1-1_amd64.debian13.deb |
sudo apt install ./m9_0.3.1-1_amd64.debian13.deb |
| Fedora 43 | m9-0.3.1-1.fc43.x86_64.rpm |
sudo dnf install ./m9-0.3.1-1.fc43.x86_64.rpm |
| Rocky 9 (RHEL 9, Alma 9) | m9-0.3.1-1.el9.x86_64.rpm |
sudo dnf install ./m9-0.3.1-1.el9.x86_64.rpm |
| Arch | m9-0.3.1-1-x86_64.pkg.tar.zst |
sudo pacman -U ./m9-0.3.1-1-x86_64.pkg.tar.zst |
What changed since the previous release
- TLS is thread-safe: runtime/tlsshim.c shares one SSL_CTX built
under pthread_once instead of re-reading the system CA bundle per
connection, and claims its handle slots under a mutex held for the
bookkeeping only -- never across a handshake, a read or a write.
The four csock TLS procedures are [REENTRANT] rather than
[SERIAL], so concurrent HTTPS overlaps its waiting. The old shim
aborts on a double free under the new gate; the new one is clean
over five runs of eight concurrent fetches, every byte compared
(runtime/test/threads.sh). The handle table grew from 8 to 64. - m9c --make builds in dependency order, computed from the import
GRAPH. A first build from an empty directory used to fail and
succeed on the second run. - A bare main filename names its own directory, so
m9c --make -o p P.m9finds its imports where the file is. - Parse errors carry line, column and a message -- FILE:LINE:COL:
parse: MSG, the shape generator errors already had -- and both
parsers are held to the same wording by a differential. - The checker refuses a reversed NEW ("NEW takes the pool first,
then the type"), which only the generator used to catch. - Hardening reaches m9c: build.sh honours CPPFLAGS and LDFLAGS.
Each .receipt records the distribution the package was built on, its sha256, the tarball's sha256, the gcc that built it, and the smoke line. Nothing here was modified after it came back from the build machine except the 3 debs' file names, which carry their distribution because they would otherwise be the same name (dpkg reads the control file, not the name).
Chapter 0 of the tutorial (M9Tutorial, tutorial.modula9.net) covers installation from these and from source.