Skip to content

m9 0.3.1

Choose a tag to compare

@atverm atverm released this 30 Aug 18:55

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.m9 finds 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.